<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
xmlns:georss="http://www.georss.org/georss"> <channel><title>freakcommander &#187; jquery</title> <atom:link href="http://www.freakcommander.de/tag/jquery/feed/" rel="self" type="application/rss+xml" /><link>http://www.freakcommander.de</link> <description>Kann alles. Weiß alles. Macht alles.</description> <lastBuildDate>Fri, 10 Feb 2012 10:40:35 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>@Anywhere Hovercards für Links (auch Blackbird Pie)</title><link>http://www.freakcommander.de/3836/computer/twitter/anywhere-hovercards-fur-links-auch-blackbird-pie/</link> <comments>http://www.freakcommander.de/3836/computer/twitter/anywhere-hovercards-fur-links-auch-blackbird-pie/#comments</comments> <pubDate>Fri, 18 Mar 2011 18:56:47 +0000</pubDate> <dc:creator>crille</dc:creator> <category><![CDATA[Twitter]]></category> <category><![CDATA[Javascript]]></category> <category><![CDATA[jquery]]></category> <guid
isPermaLink="false">http://www.freakcommander.de/?p=3836</guid> <description><![CDATA[Um diesen Post nochmal aufzugreifen: Twitter bietet für eigene Webseiten mit @Anywhere die Möglichkeit einige Informationen und Funktionen Twitters auf der eigenen Homepage anzubieten – so auch schicke Hovercards, die bei erwähnten Twitterkonten aufgehen und zusätzliche Infos und Funktionen zu einem Konto anbieten. Try it: @freakcommander Neben der fehlenden Unterstützung fürs offizielle Twitter Widget, bietet [...]]]></description> <content:encoded><![CDATA[<p>Um <a
href="http://www.freakcommander.de/3809/computer/twitter/anywhere-hovercards-im-offiziellen-twitter-widget/">diesen Post</a> nochmal aufzugreifen:</p><blockquote><p>Twitter bietet für eigene Webseiten mit <a
href="http://dev.twitter.com/anywhere">@Anywhere</a> die Möglichkeit einige Informationen und Funktionen Twitters auf der  eigenen Homepage anzubieten – so auch schicke Hovercards, die bei erwähnten Twitterkonten aufgehen und zusätzliche Infos und Funktionen zu einem  Konto anbieten. Try it: @<a
href="http://twitter.com/freakcommander">freakcommander</a></p></blockquote><p>Neben der <a
href="http://www.freakcommander.de/3809/computer/twitter/anywhere-hovercards-im-offiziellen-twitter-widget/">fehlenden Unterstützung fürs offizielle Twitter Widget</a>, bietet @Anywhere ebenfalls keine Hovercards für gesetzte Links auf Twitter-Profile. Beim folgenden HTML-Code wird kein Hovercard angezeigt:</p><pre class="brush: html">
&lt;a href=&quot;http://twitter.com/freakcommander&quot;&gt;freakcommander&lt;/a&gt;
&lt;!--Mit Shebang und @-Zeichen --&gt;
&lt;a href=&quot;http://twitter.com/#!/freakcommander&quot;&gt;@freakcommander&lt;/a&gt;
</pre><p>Um dennoch Hovercards anzuzeigen, kann man folgenden JQuery-Code, der auf diesen <a
href="http://www.freakcommander.de/1819/computer/regexp-selektor-in-jquery/">RegExp Selektor</a> angewiesen ist, nutzen:</p><pre class="brush: js">&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function() {
$(&#039;a:regex(href,^http[s]*:\/\/[www.]*twitter.com\/[#!%12\/]*[a-z0-9_]+[\/]*$)&#039;).
each(function (index,element){
	if ($(element).text().search(/^[@%40]*[a-z0-_]+$/) != -1)
		$(element).addClass(&quot;twitter-link&quot;);
});
twttr.anywhere(function (T) {
	T(&quot;a.twitter-link&quot;).hovercards({
		username : function(node) {
			return node.innerHTML;
		}
	});
});
});
&lt;/script&gt;</pre><p>Die Links müssen als Linktext ausschließlich <em><strong><@>Benutzername</strong></em> enthalten, da Twitter &#8211; aus welchen Gründen auch immer &#8211; den Linktext (und nicht den Link auf das Profil) benutzt, um die Hovercard für einen Benutzer zu laden.</p><p>Damit funktionieren auch die Profil-Links im <a
href="http://media.twitter.com/blackbird-pie/">Blackbird Pie</a>:<br
/> <style type='text/css'>#bbpBox_18437541229 a { text-decoration:none; color:#2FC2EF; }#bbpBox_18437541229 a:hover { text-decoration:underline; }</style><div
id='bbpBox_18437541229' class='bbpBox' style='padding:20px; margin:5px 0; background-color:#FFFFFF; background-image:url(http://a0.twimg.com/profile_background_images/101359463/vogelNeu1200x900_gr.jpg); background-repeat:no-repeat'><div
style='background:#fff; padding:10px; margin:0; min-height:48px; color:#666666; -moz-border-radius:5px; -webkit-border-radius:5px;'><span
style='width:100%; font-size:18px; line-height:22px;'>"Definiere Deutschland." - "Treppe gesperrt, weil Stufen nicht normgerecht. Umbau nicht m&#246;glich wegen Denkmalschutz."</span><div
class='bbp-actions' style='font-size:12px; width:100%; padding:5px 0; margin:0 0 10px 0; border-bottom:1px solid #e6e6e6;'><img
align='middle' src='http://www.freakcommander.de/wp-content/plugins/twitter-blackbird-pie//images/bird.png' title="@Anywhere Hovercards für Links (auch Blackbird Pie)" alt="bird @Anywhere Hovercards für Links (auch Blackbird Pie)" /><a
title='tweeted on 13. July 2010 14:40' href='http://twitter.com/#!/xbg/status/18437541229' target='_blank'>13. July 2010 14:40</a> via <a
href="http://www.tweetdeck.com" rel="nofollow" target="blank">TweetDeck</a><a
href='https://twitter.com/intent/tweet?in_reply_to=18437541229' class='bbp-action bbp-reply-action' title='Reply'><span><em
style='margin-left: 1em;'></em><strong>Reply</strong></span></a><a
href='https://twitter.com/intent/retweet?tweet_id=18437541229' class='bbp-action bbp-retweet-action' title='Retweet'><span><em
style='margin-left: 1em;'></em><strong>Retweet</strong></span></a><a
href='https://twitter.com/intent/favorite?tweet_id=18437541229' class='bbp-action bbp-favorite-action' title='Favorite'><span><em
style='margin-left: 1em;'></em><strong>Favorite</strong></span></a></div><div
style='float:left; padding:0; margin:0'><a
href='http://twitter.com/intent/user?screen_name=xbg'><img
style='width:48px; height:48px; padding-right:7px; border:none; background:none; margin:0' src='http://a0.twimg.com/profile_images/899161194/vogelNeuKlein2schwarz_normal.png' title="@Anywhere Hovercards für Links (auch Blackbird Pie)" alt="vogelNeuKlein2schwarz normal @Anywhere Hovercards für Links (auch Blackbird Pie)" /></a></div><div
style='float:left; padding:0; margin:0'><a
style='font-weight:bold' href='http://twitter.com/intent/user?screen_name=xbg'>@xbg</a><div
style='margin:0; padding-top:2px'>xbg</div></div><div
style='clear:both'></div></div></div></p><p>Auch interessant:<ol><li><a
href='http://www.freakcommander.de/3809/computer/twitter/anywhere-hovercards-im-offiziellen-twitter-widget/' rel='bookmark' title='@Anywhere Hovercards im offiziellen Twitter Widget'>@Anywhere Hovercards im offiziellen Twitter Widget</a></li></ol></p>]]></content:encoded> <wfw:commentRss>http://www.freakcommander.de/3836/computer/twitter/anywhere-hovercards-fur-links-auch-blackbird-pie/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>@Anywhere Hovercards im offiziellen Twitter Widget</title><link>http://www.freakcommander.de/3809/computer/twitter/anywhere-hovercards-im-offiziellen-twitter-widget/</link> <comments>http://www.freakcommander.de/3809/computer/twitter/anywhere-hovercards-im-offiziellen-twitter-widget/#comments</comments> <pubDate>Fri, 18 Mar 2011 16:00:19 +0000</pubDate> <dc:creator>crille</dc:creator> <category><![CDATA[Twitter]]></category> <category><![CDATA[Javascript]]></category> <category><![CDATA[jquery]]></category> <category><![CDATA[Widget]]></category> <guid
isPermaLink="false">http://www.freakcommander.de/?p=3809</guid> <description><![CDATA[Twitter bietet für eigene Webseiten mit @Anywhere die Möglichkeit einige Informationen und Funktionen Twitters auf der eigenen Homepage anzubieten &#8211; so auch schicke Hovercards, die bei Links auf Twitterkonten aufgehen und zusätzliche Infos und Funktionen zu einem Konto anbieten. Try it: @freakcommander Das verwunderliche ist, dass die Twitter-eigenen Widgets trotz Einbindung der @Anywhere-Unterstützung keine Hovercards [...]]]></description> <content:encoded><![CDATA[<p>Twitter bietet für eigene Webseiten mit <a
href="http://dev.twitter.com/anywhere">@Anywhere</a> die Möglichkeit einige Informationen und Funktionen Twitters auf der eigenen Homepage anzubieten &#8211; so auch schicke Hovercards, die bei Links auf Twitterkonten aufgehen und zusätzliche Infos und Funktionen zu einem Konto anbieten. Try it: @freakcommander</p><p>Das verwunderliche ist, dass die <a
href="http://twitter.com/about/resources/widgets">Twitter-eigenen Widgets</a> trotz Einbindung der @Anywhere-Unterstützung keine Hovercards anzeigen. Um das Problem zu beheben, reicht folgender <a
href="http://jquery.com/">JQuery</a>-Code aus:</p><pre class="brush: js">
&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function() {
twttr.anywhere(function (T) {
	T(&quot;a.twtr-user&quot;).hovercards({
		username : function(node) {
			return node.innerHTML;
		}
	});
	T(&quot;a.twtr-atreply&quot;).hovercards({
		username : function(node) {
			return node.innerHTML;
		}
	});
});
});
&lt;/script&gt;
</pre><p>Und schon erhält man auch Hovercards im Widget:<br
/> <a
href="http://www.freakcommander.de/wp-content/uploads/2011/03/widget_mit_hovercard.png"><img
class="alignnone size-full wp-image-3829" title="Offizielles Twitter-Widget mit Hovercard" src="http://www.freakcommander.de/wp-content/uploads/2011/03/widget_mit_hovercard.png" alt="widget mit hovercard @Anywhere Hovercards im offiziellen Twitter Widget" width="386" height="421" /></a></p><p>Auch interessant:<ol><li><a
href='http://www.freakcommander.de/3836/computer/twitter/anywhere-hovercards-fur-links-auch-blackbird-pie/' rel='bookmark' title='@Anywhere Hovercards für Links (auch Blackbird Pie)'>@Anywhere Hovercards für Links (auch Blackbird Pie)</a></li><li><a
href='http://www.freakcommander.de/2138/computer/jquery-event-listener-fuer-hinzugefuegten-inhalt/' rel='bookmark' title='JQuery Event Listener für hinzugefügten Inhalt'>JQuery Event Listener für hinzugefügten Inhalt</a></li><li><a
href='http://www.freakcommander.de/1819/computer/regexp-selektor-in-jquery/' rel='bookmark' title='Regexp Selektor in JQuery'>Regexp Selektor in JQuery</a></li></ol></p>]]></content:encoded> <wfw:commentRss>http://www.freakcommander.de/3809/computer/twitter/anywhere-hovercards-im-offiziellen-twitter-widget/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>PHP: Skripte mit langer Laufzeit, JQuery Ajax-Warteseite, Zwischenspeicherung der Berechnungen als JSON und Lock-Mechanismus</title><link>http://www.freakcommander.de/2990/computer/php-skripts-mit-langer-laufzeit-jquery-ajax-warteseite-zwischenspeicherung-der-berechnungen-als-json-und-lock-mechanismus/</link> <comments>http://www.freakcommander.de/2990/computer/php-skripts-mit-langer-laufzeit-jquery-ajax-warteseite-zwischenspeicherung-der-berechnungen-als-json-und-lock-mechanismus/#comments</comments> <pubDate>Thu, 02 Sep 2010 22:53:40 +0000</pubDate> <dc:creator>crille</dc:creator> <category><![CDATA[Computer]]></category> <category><![CDATA[ajax]]></category> <category><![CDATA[array]]></category> <category><![CDATA[Besucher]]></category> <category><![CDATA[Cronjobs]]></category> <category><![CDATA[html]]></category> <category><![CDATA[jquery]]></category> <category><![CDATA[JSON]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[traffic]]></category> <category><![CDATA[Wartezeit]]></category> <category><![CDATA[Zwischenspeicherung]]></category> <guid
isPermaLink="false">http://www.freakcommander.de/?p=2990</guid> <description><![CDATA[Das Problem Die Überschrift hört sich etwas tricky an, aber ich denke, wenn wir das Problem auf ein praktisches Beispiel übertragen, wird es klar. Nehmen wir an, wir haben eine Fußballstatistik-Seite, wo alle Statistiken zur 1. bis 3. Fußballbundesliga abrufbar sein sollen. Jeder Spieler hat eine eigene Seite und zu jedem Spieler müssen täglich aufwändige [...]]]></description> <content:encoded><![CDATA[<h2>Das Problem</h2><p>Die Überschrift hört sich etwas tricky an, aber ich denke, wenn wir das Problem auf ein praktisches Beispiel übertragen, wird es klar.</p><p>Nehmen wir an, wir haben eine Fußballstatistik-Seite, wo alle Statistiken zur 1. bis 3. Fußballbundesliga abrufbar sein sollen. Jeder Spieler hat eine eigene Seite und zu jedem Spieler müssen täglich aufwändige Statistik-Berechnungen durchgeführt werden, die mehrere Minuten dauern.</p><p>Eine Lösung wäre, dass man mit Cronjobs 1x täglich diese aufwändigen Berechnungen nachts durchführt und so die Ergebnisse bereit hält, wenn der Besucher eine Spielerseite auswählt. Das Problem an dieser Vorgehensweise ist allerdings, dass es so viele Spieler gibt, dass die Berechnungen zu lange dauern würden. Zudem werden eh nur 10% der Spielerseiten besucht und 2% der Spielerseiten haben 90% der Zugriffe. Man kann also für diese 2% (High Traffic-Seiten) Cronjobs anlegen, die restlichen Berechnungen aber, sollen quasi On-the-Fly erstellt werden. Das führt zwar zu teilweise langen Wartezeiten für die Besucher, aber die Ergebnisse dieser Berechnungen sind so großartig, dass die Besucher darauf auch bis zu mehreren Minuten warten würden.</p><h3>Anforderungen an die &#8220;On the fly&#8221;-Berechnungen</h3><ol><li>Die Parameter für die Berechnung ändern sich nur 1x täglich</li><li>Die Ergebnisse liegen nach der Berechnung in einem Array vor und sollen als JSON zwischengespeichert werden, so dass dann die Anzeige der Ergebnisse schnell erfolgen kann</li><li>Wenn der Besucher auf die Ergebnisse warten muss, soll eine Warteseite mit einem Ajax-Loader angezeigt werden. Wenn die Berechnungen beendet sind, wird auf die eigentliche Seite weitergeleitet</li><li>Für einen Spieler darf die Statistik-Berechnung nur 1x ausgeführt werden.<br
/> Ein Beispiel: Besucher 1 besucht die Seite von &#8220;Arjen Robben&#8221; und stößt die Berechnungen an. Besucher 2 besucht wenige Sekunden danach die Seite von &#8220;Arjen Robben&#8221;, es liegen keine Daten vor und trotzdem soll das Skript erkennen: &#8220;Moment! Die Berechnungen laufen schon, stoße die Berechnungen kein zweites Mal an.&#8221;</li><li>Sollten veraltete Berechnungen vorliegen, werden diese zwar angezeigt (mit einem Hinweis, dass die Daten veraltet sind), um keine Wartezeit zu haben, im Hintergrund wird allerdings die aufwändige Berechnung angestoßen. Hier gilt wieder: Die Berechnung darf nur 1x angestoßen werden.</li></ol><h2>Warteseite mit JQuery-Ajax</h2><p>Die Warteseite wird nur dann ausgegeben, wenn noch nie Daten für den Spieler berechnet wurden.</p><p>Damit die Warteseite das Ende der Berechnung mitbekommt, muss diese über Ajax die Berechnungen anstoßen.</p><pre class="brush: js">$(document).ready(function() {
	$.ajax({
	   type: &#039;GET&#039;,
	   url: &#039;spielerSeite.php&#039;,
	   cache: false,
	   data: &#039;do=ajax&#039;,
	   success: function(msg){
	   if (msg == &#039;true&#039;){
			location.replace(&#039;http://localhost/spielerSeite.php&#039;);
		}
		else
		{
			$(&#039;div#responseAjax&#039;).empty();
			$(&#039;div#responseAjax&#039;).addClass(&#039;success&#039;);
			$(&#039;div#responseAjax&#039;).html(msg);
		}
	   }
	 });
});</pre><p>Es wird also die Seite <em>spielerSeite.php?do=ajax</em> aufgerufen. Diese Seite führt die Berechnungen durch und gibt am Ende &#8216;true&#8217; aus, so dass auf die eigentliche Seite <em>spielerSeite.php</em> weitergeleitet wird. Wenn nicht &#8216;true&#8217; zurück gegeben wird, hat bereits ein anderer Benutzer die Berechnungen angestoßen und man gibt eine Meldung zurück.</p><h2>Zwischenspeicherung der Berechnungen als JSON</h2><p>Die fertigen Berechnungen, werden als json-Datei im Filesystem gespeichert:</p><pre class="brush: php">function setJSON()
{
	file_put_contents($this-&gt;json_dir.$this-&gt;spieler_string.&#039;.json&#039;, json_encode($this-&gt;berechnung_array));
}
function getJSON()
{
	$this-&gt;berechnung_array = json_decode(file_get_contents($this-&gt;json_dir.$this-&gt;spieler_string.&#039;.json&#039;), true);
}</pre><p>Vorteil von json ist die absolut problemlose Konvertierung vom PHP-Array zu einem json-String, der in einer Datei gespeichert wird. Anhand des Änderungsdatums der Datei mit <a
href="http://www.php.net/manual/en/function.filemtime.php">filemtime</a> kann man zudem einfach feststellen, ob die Daten wieder aktualisiert werden müssen.</p><h2>Lock-Mechanismus zur einmaligen Ausführung</h2><p>Wie kann man mit PHP feststellen, ob bereits eine Berechnung für einen Spieler läuft? Gar nicht. Also muss man es sich merken!</p><p>In einem Execution Array ($this->execution_array) werden die $this->spieler_string gespeichert, deren Berechnungen zur Zeit ausgeführt werden. Damit alle Skripte, die gleichzeitig laufen, auf dieses Array zugreifen können, wird das Array als JSON gespeichert:</p><pre class="brush: php">function setExJSON()
{
	file_put_contents(&#039;execution.json&#039;, json_encode($this-&gt;execution_array));
}
function getExJSON()
{
	if (!file_exists(&#039;execution.json&#039;))
	{
		$this-&gt;execution_array = array();
	}
	elseif (file_get_contents(&#039;execution.json&#039;) === &#039;null&#039;)
	{
		$this-&gt;execution_array = array();
	}
	else
	{
		$this-&gt;execution_array = json_decode(file_get_contents(&#039;execution.json&#039;), true);
	}
}</pre><p>Nun muss bei jedem potentiellen Start der Berechnungen überprüft werden, ob für den Spieler schon Berechnungen laufen. Dabei ist darauf zu achten, dass $this->execution_array frisch aus der JSON-Datei geladen wurde. Sollte niemand die Berechnung gestartet haben, wird das Execution-Array um den entsprechenden Eintrag erweitert und als JSON gespeichert.<br
/> Nachdem die Berechnungen durchgeführt wurden, wird das Array wieder geladen, der entsprechende Eintrag gelöscht und das Array wieder gespeichert:</p><pre class="brush: php">$this-&gt;getExJSON();
if (in_array($this-&gt;spieler_string,$this-&gt;execution_array))
{
	exit();
}
else
{
	$this-&gt;execution_array[] = $this-&gt;spieler_string;
	$this-&gt;setExJSON();
	$this-&gt;fuehreLangeBerechnungenDurch();
	$this-&gt;getExJSON();
	unset($this-&gt;execution_array[array_search($this-&gt;spieler_string, $this-&gt;execution_array)]);
	$this-&gt;setExJSON();
}</pre><p>Das Problem an dieser Implementation ist natürlich, dass Schreiben und Lesen ins Execution-Array kein <a
href="http://de.wikipedia.org/wiki/Kritischer_Abschnitt">kritischer Abschnitt</a> ist und z.B. zeitgleich mehrere Berechnungsvorgänge gestartet werden könnten.. Da aber schlimmstenfalls &#8220;nur&#8221; mehrere Berechnungen für einen Spieler gleichzeitig durchgeführt würden, ist das Problem vernachlässigbar.</p><h2>Ablaufkontrolle</h2><p>Und hier der komplette Ablauf des Skripts:</p><pre class="brush: php">$this-&gt;execution_array = array();
if (isset($_GET[&#039;do&#039;]) AND $_GET[&#039;do&#039;] === &#039;old&#039;)
{
	//Daten veraltet: Alten Daten laden und anzeigen
	$this-&gt;getJSON();
	$this-&gt;toHTML();
}
elseif (isset($_GET[&#039;do&#039;]) AND $_GET[&#039;do&#039;] === &#039;wait&#039;)
{
	//Warteseite mit Ajax anzeigen
	$this-&gt;doWaitHTML();
}
elseif (isset($_GET[&#039;do&#039;]) AND $_GET[&#039;do&#039;] === &#039;ajax&#039;)
{
	//Durch Ajax von Warteseite aus Berechnungen angestoßen
	$this-&gt;getExJSON();
	if (in_array($this-&gt;spieler_string,$this-&gt;execution_array))
	{
		//Anderer User hat Berechnungen schon angestoßen
		$this-&gt;ajaxFalseResponse();
	}
	else
	{
		//Berechnungen durchführen
		$this-&gt;execution_array[] = $this-&gt;spieler_string;
		$this-&gt;setExJSON();
		$this-&gt;fuehreLangeBerechnungenDurch();
		$this-&gt;getExJSON();
		unset($this-&gt;execution_array[array_search($this-&gt;spieler_string, $this-&gt;execution_array)]);
		$this-&gt;setExJSON();
	}
}
elseif (!file_exists($this-&gt;json_dir.$this-&gt;spieler_string.&#039;.json&#039;))
{
	//Es liegen noch keine Berechnungen vor! Weiterleiten auf Warteseite.
	$host  = $_SERVER[&#039;HTTP_HOST&#039;];
	$uri   = $_SERVER[&#039;PHP_SELF&#039;];
	$extra = &#039;?do=wait&#039;;
	header(&quot;Location: http://$host$uri$extra&quot;);
	exit();
}
else
{
	$this-&gt;getJSON();
	if (filemtime($this-&gt;json_dir.$this-&gt;spieler_string.&#039;.json&#039;) &lt; strtotime(&#039; -1 day&#039;))
	{
		//Die Daten sind veraltet. Weiterleiten zum Anzeigen der alten Daten, aber Berechnungen der neuen Daten starten
		$host  = $_SERVER[&#039;HTTP_HOST&#039;];
		$uri   = $_SERVER[&#039;PHP_SELF&#039;];
		$extra = &#039;?do=old&#039;;
		header(&quot;Location: http://$host$uri$extra&quot;);
		$this-&gt;getExJSON();
		if (in_array($this-&gt;spieler_string,$this-&gt;execution_array))
		{
			//Anderer User hat Berechnungen schon angestoßen
			exit();
		}
		else
		{
			//Berechnungen durchführen
			$this-&gt;execution_array[] = $this-&gt;spieler_string;
			$this-&gt;setExJSON();
			$this-&gt;fuehreLangeBerechnungenDurch();
			$this-&gt;getExJSON();
			unset($this-&gt;execution_array[array_search($this-&gt;spieler_string, $this-&gt;execution_array)]);
			$this-&gt;setExJSON();
		}
	}
	else
	{
		//Wenn Daten aktuell sind: Anzeigen!
		$this-&gt;toHTML();
	}
}</pre>]]></content:encoded> <wfw:commentRss>http://www.freakcommander.de/2990/computer/php-skripts-mit-langer-laufzeit-jquery-ajax-warteseite-zwischenspeicherung-der-berechnungen-als-json-und-lock-mechanismus/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>JQuery Event Listener für hinzugefügten Inhalt</title><link>http://www.freakcommander.de/2138/computer/jquery-event-listener-fuer-hinzugefuegten-inhalt/</link> <comments>http://www.freakcommander.de/2138/computer/jquery-event-listener-fuer-hinzugefuegten-inhalt/#comments</comments> <pubDate>Sun, 30 Aug 2009 08:38:03 +0000</pubDate> <dc:creator>crille</dc:creator> <category><![CDATA[Computer]]></category> <category><![CDATA[bind]]></category> <category><![CDATA[event listener]]></category> <category><![CDATA[jquery]]></category> <category><![CDATA[Widget]]></category> <category><![CDATA[Wordpress]]></category> <guid
isPermaLink="false">http://www.freakcommander.de/?p=2138</guid> <description><![CDATA[Wenn auf einer Webseite nach dem Laden Inhalt hinzugefügt wird, funktionieren Event Listener auf diesen hinzugefügten Inhalt nicht.  Nehmen wir diesen JQuery-Code: $(&#38;quot;p&#38;quot;).click(function(){ $(this).after(&#38;quot;&#38;lt;p&#38;gt;Another paragraph!&#38;lt;/p&#38;gt;&#38;quot;); }); Beim Klick auf einen Absatz wird danach ein neuer Absatz eingefügt mit dem Inhalt Another paragraph!. Klickt man auf diesen neuen Absatz Another paragraph! passiert nichts, obwohl laut dem [...]]]></description> <content:encoded><![CDATA[<p>Wenn auf einer Webseite nach dem Laden Inhalt hinzugefügt wird, funktionieren Event Listener auf diesen hinzugefügten Inhalt nicht.  Nehmen wir diesen JQuery-Code:</p><pre class="brush: js">
$(&amp;quot;p&amp;quot;).click(function(){
   $(this).after(&amp;quot;&amp;lt;p&amp;gt;Another paragraph!&amp;lt;/p&amp;gt;&amp;quot;);
});
</pre><p>Beim Klick auf einen Absatz wird danach ein neuer Absatz eingefügt mit dem Inhalt <em>Another paragraph!</em>. Klickt man auf diesen neuen Absatz <em>Another paragraph!</em> passiert nichts, obwohl laut dem JQuery-Code ja eigentlich beim Klick auf einen Absatz ein weiterer Absatz eingefügt werden soll.</p><p>Eine längere Schreibweise für o.g. Code ist diese hier mit der <a
href="http://docs.jquery.com/Events/bind">bind-Methode</a>:</p><pre class="brush: js">
$(&amp;quot;p&amp;quot;).bind(&amp;quot;click&amp;quot;, function(){
   $(this).after(&amp;quot;&amp;lt;p&amp;gt;Another paragraph!&amp;lt;/p&amp;gt;&amp;quot;);
});
</pre><p>Die Lösung, damit Event Listener auch auf hinzugefügten Inhalt funktionieren, ist die <a
href="http://docs.jquery.com/Events/live">live-Methode</a>:</p><pre class="brush: js">
$(&amp;quot;p&amp;quot;).live(&amp;quot;click&amp;quot;, function(){
   $(this).after(&amp;quot;&amp;lt;p&amp;gt;Another paragraph!&amp;lt;/p&amp;gt;&amp;quot;);
});
</pre><p>Jetzt kann man auch auf <em>Another paragraph!</em> klicken und bekommt einen weiteren Absatz.</p><p>Übrigens ist diese live-Methode auch die Lösung, um in seinem selbst entworfenen Widget im neuen Admin-Panel (seit WordPress Version 2.8 ist die Widget Administration überarbeitet) Events per JQuery jederzeit benutzen zu können. Das Problem ist ansonsten nämlich, dass man das per Drag &amp; Drop hinzugefügte Widget-Administrationspanel erst abspeichern musste, ehe JQuery-Events funktionieren.</p><p>Auch interessant:<ol><li><a
href='http://www.freakcommander.de/1821/computer/css-attribut-selektoren/' rel='bookmark' title='CSS Attribut Selektoren'>CSS Attribut Selektoren</a></li><li><a
href='http://www.freakcommander.de/1819/computer/regexp-selektor-in-jquery/' rel='bookmark' title='Regexp Selektor in JQuery'>Regexp Selektor in JQuery</a></li><li><a
href='http://www.freakcommander.de/3836/computer/twitter/anywhere-hovercards-fur-links-auch-blackbird-pie/' rel='bookmark' title='@Anywhere Hovercards für Links (auch Blackbird Pie)'>@Anywhere Hovercards für Links (auch Blackbird Pie)</a></li></ol></p>]]></content:encoded> <wfw:commentRss>http://www.freakcommander.de/2138/computer/jquery-event-listener-fuer-hinzugefuegten-inhalt/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>CSS Attribut Selektoren</title><link>http://www.freakcommander.de/1821/computer/css-attribut-selektoren/</link> <comments>http://www.freakcommander.de/1821/computer/css-attribut-selektoren/#comments</comments> <pubDate>Sun, 17 May 2009 10:51:48 +0000</pubDate> <dc:creator>crille</dc:creator> <category><![CDATA[Computer]]></category> <category><![CDATA[Attribut]]></category> <category><![CDATA[CSS]]></category> <category><![CDATA[html]]></category> <category><![CDATA[jquery]]></category> <guid
isPermaLink="false">http://www.freakcommander.de/?p=1821</guid> <description><![CDATA[Da schreibt man im letzten Artikel etwas über Regexp-Selektoren in JQuery und meint damit ein Problem zwar etwas umständlich, aber elegant gelöst zu habe. Einen Tag später allerdings stellt man fest, dass man den Umweg über JQuery gar nicht hätte gehen müssen, sondern gleich auf Attributbedingte Formate (wie es bei SELFHTML so schön deutsch heißt) [...]]]></description> <content:encoded><![CDATA[<p>Da schreibt man im <a
href="http://www.freakcommander.de/1819/computer/regexp-selektor-in-jquery/">letzten Artikel</a> etwas über <a
href="http://www.freakcommander.de/1819/computer/regexp-selektor-in-jquery/">Regexp-Selektoren in JQuery</a> und meint damit ein Problem zwar etwas umständlich, aber elegant gelöst zu habe. Einen Tag später allerdings stellt man fest, dass man den Umweg über JQuery gar nicht hätte gehen müssen, sondern gleich auf <a
href="http://de.selfhtml.org/css/formate/zentrale.htm#attributbedingte">Attributbedingte Formate</a> (wie es bei SELFHTML so schön deutsch heißt) hätte setzen müssen.</p><p>Ein HTML-Auszug sieht so aus:</p><pre class="brush: html">
&amp;lt;div id=&amp;quot;posting_1234&amp;quot;&amp;gt;
Dies ist ein &amp;lt;a href=&amp;quot;http://link.de&amp;quot;&amp;gt;Link&amp;lt;/a&amp;gt; im Posting.&amp;lt;/div&amp;gt;
&amp;lt;div&amp;gt;
Ein anderer &amp;lt;a href=&amp;quot;http://andererlink.de&amp;quot;&amp;gt;Link&amp;lt;/a&amp;gt; in einem anderen DIV.&amp;lt;/div&amp;gt;
&amp;lt;!-- ... --&amp;gt;
&amp;lt;div id=&amp;quot;posting_1235&amp;quot;&amp;gt;
Dies ist ein &amp;lt;a href=&amp;quot;http://link.de&amp;quot;&amp;gt;Link&amp;lt;/a&amp;gt; im Posting.&amp;lt;/div&amp;gt;
&amp;lt;div&amp;gt;
Ein anderer &amp;lt;a href=&amp;quot;http://andererlink.de&amp;quot;&amp;gt;Link&amp;lt;/a&amp;gt; in einem anderen DIV.&amp;lt;/div&amp;gt;
</pre><p>Nun will man mit CSS alle Links innerhalb des td-Tags, dessen id mit <em>td_posting_</em> anfängt, anders darstellen. Das kann man umständlich mit der <a
href="http://www.freakcommander.de/1819/computer/regexp-selektor-in-jquery/">gestern vorgestellten JQuery-Funktion</a> hinbekommen, aber einfacher und direkter ist es mit den CSS Attribut Selektoren:</p><pre class="brush: css">
td[id^=&amp;quot;td_posting_&amp;quot;] a:link{
text-decoration: underline;
color: #032846;
}
</pre><p>Das ^-Zeichen hinter id dient dazu festzulegen, dass id mit der angegebenen Zeichenkette <strong>beginnen</strong> soll. Es wäre ja auch denkbar, dass id mit einer bestimmten Zeichenkette <strong>enden</strong> soll, denn müsste anstatt ^ ein $ Zeichen benutzt werden:</p><pre class="brush: css">
td[id$=&amp;quot;ende&amp;quot;] a:link{
text-decoration: underline;
color: #032846;
}
</pre><p>Wenn nur überprüft werden soll, ob eine Zeichenkette irgendwo in der ID vorkommt muss ein *-Zeichen benutzt werden:</p><pre class="brush: css">
td[id*=&amp;quot;zeichen&amp;quot;] a:link{
text-decoration: underline;
color: #032846;
}
</pre><p>Das deckt zwar viele Anwendungsfälle ab, aber wenn man auf einen komplizierteren regulären Ausdruck angewiesen ist, muss man auf die <a
href="http://www.freakcommander.de/1819/computer/regexp-selektor-in-jquery/">gestrige JQuery-Funktion</a> zurück greifen.</p><p>Auch interessant:<ol><li><a
href='http://www.freakcommander.de/2138/computer/jquery-event-listener-fuer-hinzugefuegten-inhalt/' rel='bookmark' title='JQuery Event Listener für hinzugefügten Inhalt'>JQuery Event Listener für hinzugefügten Inhalt</a></li></ol></p>]]></content:encoded> <wfw:commentRss>http://www.freakcommander.de/1821/computer/css-attribut-selektoren/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
