<?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/"
	>

<channel>
	<title>freakcommander.de &#187; html</title>
	<atom:link href="http://www.freakcommander.de/tag/html/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.freakcommander.de</link>
	<description>Kann alles. Weiß alles. Macht alles.</description>
	<lastBuildDate>Wed, 08 Sep 2010 18:49:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<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 &#220;berschrift h&#246;rt sich etwas tricky an, aber ich denke, wenn wir das Problem auf ein praktisches Beispiel &#252;bertragen, wird es klar. Nehmen wir an, wir haben eine Fu&#223;ballstatistik-Seite, wo alle Statistiken zur 1. bis 3. Fu&#223;ballbundesliga abrufbar sein sollen. Jeder Spieler hat eine eigene Seite und zu jedem Spieler m&#252;ssen t&#228;glich aufw&#228;ndige [...]]]></description>
			<content:encoded><![CDATA[<h2>Das Problem</h2>
<p>Die &#220;berschrift h&#246;rt sich etwas tricky an, aber ich denke, wenn wir das Problem auf ein praktisches Beispiel &#252;bertragen, wird es klar.</p>
<p>Nehmen wir an, wir haben eine Fu&#223;ballstatistik-Seite, wo alle Statistiken zur 1. bis 3. Fu&#223;ballbundesliga abrufbar sein sollen. Jeder Spieler hat eine eigene Seite und zu jedem Spieler m&#252;ssen t&#228;glich aufw&#228;ndige Statistik-Berechnungen durchgef&#252;hrt werden, die mehrere Minuten dauern.</p>
<p>Eine L&#246;sung w&#228;re, dass man mit Cronjobs 1x t&#228;glich diese aufw&#228;ndigen Berechnungen nachts durchf&#252;hrt und so die Ergebnisse bereit h&#228;lt, wenn der Besucher eine Spielerseite ausw&#228;hlt. Das Problem an dieser Vorgehensweise ist allerdings, dass es so viele Spieler gibt, dass die Berechnungen zu lange dauern w&#252;rden. Zudem werden eh nur 10% der Spielerseiten besucht und 2% der Spielerseiten haben 90% der Zugriffe. Man kann also f&#252;r diese 2% (High Traffic-Seiten) Cronjobs anlegen, die restlichen Berechnungen aber, sollen quasi On-the-Fly erstellt werden. Das f&#252;hrt zwar zu teilweise langen Wartezeiten f&#252;r die Besucher, aber die Ergebnisse dieser Berechnungen sind so gro&#223;artig, dass die Besucher darauf auch bis zu mehreren Minuten warten w&#252;rden.</p>
<h3>Anforderungen an die &#8220;On the fly&#8221;-Berechnungen</h3>
<ol>
<li>Die Parameter f&#252;r die Berechnung &#228;ndern sich nur 1x t&#228;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&#252;r einen Spieler darf die Statistik-Berechnung nur 1x ausgef&#252;hrt werden.<br />
Ein Beispiel: Besucher 1 besucht die Seite von &#8220;Arjen Robben&#8221; und st&#246;&#223;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&#223;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&#228;ndige Berechnung angesto&#223;en. Hier gilt wieder: Die Berechnung darf nur 1x angesto&#223;en werden.</li>
</ol>
<h2>Warteseite mit JQuery-Ajax</h2>
<p>Die Warteseite wird nur dann ausgegeben, wenn noch nie Daten f&#252;r den Spieler berechnet wurden.</p>
<p>Damit die Warteseite das Ende der Berechnung mitbekommt, muss diese &#252;ber Ajax die Berechnungen ansto&#223;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&#252;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&#252;ck gegeben wird, hat bereits ein anderer Benutzer die Berechnungen angesto&#223;en und man gibt eine Meldung zur&#252;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 &#196;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&#252;ssen.</p>
<h2>Lock-Mechanismus zur einmaligen Ausf&#252;hrung</h2>
<p>Wie kann man mit PHP feststellen, ob bereits eine Berechnung f&#252;r einen Spieler l&#228;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&#252;hrt werden. Damit alle Skripte, die gleichzeitig laufen, auf dieses Array zugreifen k&#246;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 &#252;berpr&#252;ft werden, ob f&#252;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&#252;hrt wurden, wird das Array wieder geladen, der entsprechende Eintrag gel&#246;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&#252;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&#228;nge gestartet werden k&#246;nnten.. Da aber schlimmstenfalls &#8220;nur&#8221; mehrere Berechnungen f&#252;r einen Spieler gleichzeitig durchgef&#252;hrt w&#252;rden, ist das Problem vernachl&#228;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&#223;en
	$this-&gt;getExJSON();
	if (in_array($this-&gt;spieler_string,$this-&gt;execution_array))
	{
		//Anderer User hat Berechnungen schon angesto&#223;en
		$this-&gt;ajaxFalseResponse();
	}
	else
	{
		//Berechnungen durchf&#252;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&#223;en
			exit();
		}
		else
		{
			//Berechnungen durchf&#252;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>Colorbox: Link in der Box &#246;ffnen</title>
		<link>http://www.freakcommander.de/2457/computer/colorbox-link-in-der-box-oeffnen/</link>
		<comments>http://www.freakcommander.de/2457/computer/colorbox-link-in-der-box-oeffnen/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 18:12:31 +0000</pubDate>
		<dc:creator>crille</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[colorbox]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[jack moore]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[lightbox]]></category>

		<guid isPermaLink="false">http://www.freakcommander.de/?p=2457</guid>
		<description><![CDATA[Die Colorbox von Jack Moore ist gro&#223;artig: Bilder, Videos, HTML: alles m&#246;gliche kann in dieser Lightbox dargestellt werden. Was allerdings so nicht vorhanden ist, ist die M&#246;glichkeit, dass Links, die innerhalb der Lightbox aufgerufen werden, auch innerhalb der Lightbox ge&#246;ffnet werden. Dazu muss innerhalb von $(document).ready(function(){}, in der die Colorbox an die Elemente gebunden werden, [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_2458" class="wp-caption alignright" style="width: 384px"><a href="http://www.freakcommander.de/wp-content/uploads/2009/12/colorbox.png"><img class="size-full wp-image-2458" title="colorbox" src="http://www.freakcommander.de/wp-content/uploads/2009/12/colorbox.png" alt="Die Colorbox mit Homer" width="374" height="276" /></a><p class="wp-caption-text">Die Colorbox mit Homer</p></div>
<p>Die <a href="http://colorpowered.com/colorbox/">Colorbox von Jack Moore</a> ist gro&#223;artig: Bilder, Videos, HTML: alles m&#246;gliche kann in dieser <strong>Lightbox</strong> dargestellt werden.</p>
<p>Was allerdings so nicht vorhanden ist, ist die M&#246;glichkeit, dass Links, die innerhalb der Lightbox aufgerufen werden, auch innerhalb der Lightbox ge&#246;ffnet werden.</p>
<p>Dazu muss innerhalb von <em>$(document).ready(function(){}</em>, in der die Colorbox an die Elemente gebunden werden, folgender Code eingef&#252;gt werden:</p>
<pre class="brush: jscript">
$(&quot;a.incolorbox&quot;).live(&#039;click&#039;, function(event) {
	event.preventDefault(); // native javascript function
	$.fn.colorbox({ href: $(this).attr(&quot;href&quot;), open: true})
});
</pre>
<p>Wenn nun innerhalb der Colorbox ein Link zur Klasse &#8220;incolorbox&#8221; geh&#246;rt, wird dieser innerhalb der Colorbox ge&#246;ffnet.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freakcommander.de/2457/computer/colorbox-link-in-der-box-oeffnen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>CSS: Vertikales Ausrichten von Text um ein Bild</title>
		<link>http://www.freakcommander.de/1891/computer/css-vertikales-ausrichten-von-text-um-ein-bild/</link>
		<comments>http://www.freakcommander.de/1891/computer/css-vertikales-ausrichten-von-text-um-ein-bild/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 16:38:05 +0000</pubDate>
		<dc:creator>crille</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[Ausrichten]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[vertical-align]]></category>

		<guid isPermaLink="false">http://www.freakcommander.de/?p=1891</guid>
		<description><![CDATA[&#60;p&#62; Etwas Text in der gleichen Zeile mit einem gro&#223;en Bild &#60;img src=&#34;grossesBild.jpg&#34; alt=&#34;Gro&#223;es Bild&#34; /&#62; &#60;/p&#62; M&#246;chte man nun die Schrift in der gleichen Zeile des Bildes (sagen wir) mittig positionieren, so muss man nicht den Absatz p-Tag per vertical-align:middle; mittig anordnen, sondern das Bild: &#60;p&#62; Etwas Text in der gleichen Zeile mit einem [...]]]></description>
			<content:encoded><![CDATA[<pre class="brush: html">
&lt;p&gt;
Etwas Text in der gleichen Zeile mit einem
gro&#223;en Bild &lt;img src=&quot;grossesBild.jpg&quot; alt=&quot;Gro&#223;es Bild&quot; /&gt;
&lt;/p&gt;
</pre>
<p>M&#246;chte man nun die Schrift in der gleichen Zeile des Bildes (sagen wir) mittig positionieren, so muss man nicht den Absatz <em>p</em>-Tag per <em>vertical-align:middle;</em> mittig anordnen, sondern das Bild:</p>
<pre class="brush: html">
&lt;p&gt;
Etwas Text in der gleichen Zeile mit einem
gro&#223;en Bild &lt;img src=&quot;grossesBild.jpg&quot; alt=&quot;Gro&#223;es Bild&quot; style=&quot;vertical-align:middle;&quot; /&gt;
&lt;/p&gt;
</pre>
<p>Das finde ich doch etwas eigenartig, denn so ordnet man ja nicht das Bild mittig an, sondern die Schrift drumherum&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freakcommander.de/1891/computer/css-vertikales-ausrichten-von-text-um-ein-bild/feed/</wfw:commentRss>
		<slash:comments>2</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 &#252;ber Regexp-Selektoren in JQuery und meint damit ein Problem zwar etwas umst&#228;ndlich, aber elegant gel&#246;st zu habe. Einen Tag sp&#228;ter allerdings stellt man fest, dass man den Umweg &#252;ber JQuery gar nicht h&#228;tte gehen m&#252;ssen, sondern gleich auf Attributbedingte Formate (wie es bei SELFHTML so sch&#246;n deutsch hei&#223;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 &#252;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&#228;ndlich, aber elegant gel&#246;st zu habe. Einen Tag sp&#228;ter allerdings stellt man fest, dass man den Umweg &#252;ber JQuery gar nicht h&#228;tte gehen m&#252;ssen, sondern gleich auf <a href="http://de.selfhtml.org/css/formate/zentrale.htm#attributbedingte">Attributbedingte Formate</a> (wie es bei SELFHTML so sch&#246;n deutsch hei&#223;t) h&#228;tte setzen m&#252;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&#228;ngt, anders darstellen. Das kann man umst&#228;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&#228;re ja auch denkbar, dass id mit einer bestimmten Zeichenkette <strong>enden</strong> soll, denn m&#252;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 &#252;berpr&#252;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&#228;lle ab, aber wenn man auf einen komplizierteren regul&#228;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&#252;ck greifen.</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>
