HTML/CSS Invalid obwohl Valid

klamm

Chef
Teammitglied
ID: 20876
L
20 April 2006
13.517
1.302
Sowas ist doch valides HTML, oder?
Ich möchte Leuten ohne JS einen alternativen Link präsentieren.
Funzt auch.
HTML:
<script type="text/javascript">
        document.write('<a href="javascript:youtube(\'RJZJXcDGj88\');">');
    </script>
    <noscript>
        <a href="https://www.youtube.com/watch?v=RJZJXcDGj88" target="_blank">
    </noscript>
   <img src="/images/klamm_trailer.gif" width="181" height="103" border="0" alt="klamm-Trailer"></a>
Der W3C-Validator meckert aber, da er denkt ich mach 2x <a auf ... dass das conditional ist, rafft der nicht. Ist das nun valid oder nicht? :ugly: Oder gibts ne schönere Lösung?
 
Mach's doch einfach so:
HTML:
<a href="https://www.youtube.com/watch?v=RJZJXcDGj88" onclick="youtube('RJZJXcDGj88'); return false;" target="_blank">
  <img src="/images/klamm_trailer.gif" width="181" height="103" border="0" alt="klamm-Trailer">
</a>
Der Validator erkennt das halt nicht als valide an, weil Du den im <noscript/> geöffneten <a/> nicht dort wieder schliesst...
 
Ist eben eine fehlerhafte Schachtelung. Ein <noscript>-Block ist nicht mit einem Conditional zu vergleichen und funktioniert auch anders ;)
 
Mach's doch einfach so:
HTML:
<a href="https://www.youtube.com/watch?v=RJZJXcDGj88" onclick="youtube('RJZJXcDGj88'); return false;" target="_blank">
  <img src="/images/klamm_trailer.gif" width="181" height="103" border="0" alt="klamm-Trailer">
</a>
Ich bin mir nicht sicher, ob alle Browser das so handhaben, dass die Kaskade stoppt, sobald JS false sendet ... imho wird der Link (HREF) trotzdem getriggert.
Edit: Sieht auf den ersten Blick funzend aus.
 
Soweit ich weiss, passiert das nur in seltenen IE6/7-Versionen. Dann kannste natürlich noch vorm "return false;" ein "event.returnValue = false;" einfügen, um die Browser auch zu bedienen. Oder Du gehst gleich von DOM0-Eventhandlern weg, markierst den Link über ein Html5-konformes data-Attribut (data-youtubeid="keks") oder einen ähnlichen Mechanismus und packst das Ganze in Dein globales JS:
PHP:
$('[data-youtubeid]').live('click', function () {
  youtube( $(this).attr('data-youtubeid') );
  return false;
});
Das sollte eigentlich immer funktionieren.
 
ja es funktioniert, ohne Frage, ist aber eben kein korrektes HTML, wie tleilax schon beschrieb.
Das sind die vielen Algorithmen, die aus invalidem HTML valides HTML machen, damit es funktioniert.
 
Alternativ kannste es auch so lösen,
dass Du es HTML-konform machst:

HTML:
<script type="text/javascript">
document.write('<a href="javascript:youtube(\'RJZJXcDGj88\');">
  <img src="/images/klamm_trailer.gif" width="181" height="103" border="0" alt="klamm-Trailer">
</a>'); 
</script>  
<noscript>  
  <a href="https://www.youtube.com/watch?v=RJZJXcDGj88" target="_blank">
    <img src="/images/klamm_trailer.gif" width="181" height="103" border="0" alt="klamm-Trailer">
  </a>
</noscript>

So würde ich das machen,
das ist denke ich das sicherste.
Aber allerdings auch eher trivial .. ?!?
 
Alternativ kannste es auch so lösen,
dass Du es HTML-konform machst:
Selbst das rafft der W3C-Validator nicht. -.-
Der parsed wohl stupide auf <a ...>*</a> und baut seinen Baum auf ...

Ich nutze jetzt die einfache onClick-false/href Version. Hat am wenigsten Code und funzt ja zu 99% überall. Wer IE6 nutzt ist selbst schuld. :ugly:
 
In dem Zusammenhang nochne Frage:

W3C meckert ja auf klamm nur wegen der Banner-Tags.
Die bekomme ich so angeliefert zum 1:1 Einbauen ...
HTML:
<script language="javascript" src="https://media.fastclick.net/w/get.media?sid=50599&m=1&tp=1&d=j&t=n"></script>
valide wäre imho aber so
HTML:
<script language="javascript" src="https://media.fastclick.net/w/get.media?sid=50599&m=1&tp=1&d=j&t=n"></script>
Oder müsste es URL-Encoded sein?
HTML:
<script language="javascript" src="https://media.fastclick.net/w/get.media?sid=50599%26m=1%26tp=1%26d=j%26t=n"></script>
Werden die Paras dann auch richtig übergeben bei so include-Sachen? :ugly:
 
Bei #2 werden sie korrekt übergeben, ausser das JS prüft den Scripttag zusätzlich:ugly:
Was ist #2? urlencode oder htmlentities - oder beides?
Hab den Unterschied noch nie wirklich verstanden.

htmlentities ist, um es in die Seite zu malen, ohne dass es "ausgeführt" wird.
urlencode ist das, was dann in der Adressleiste steht

Also müsste man strenggenomen doch htmlentities(urlencode($url)) machen (= das, was dann am Ende im Quelltext steht). Sieht mir aber nach Overkill aus.
 
Nope.

htmlspecialchars($url; wegen Attribut und so) + urlencode($params).

Zumindest meinem Verständnis nach.
 
Hab grad mal die News mit dem Trailer angeschaut und mal versucht den Link ohne aktiviertes JavaScript zu klicken ... es passierte nichts 8O ich weiß nicht ob das schon die Lösung ist, wie es aktuell eingebaut ist ;)
 
Hab grad mal die News mit dem Trailer angeschaut und mal versucht den Link ohne aktiviertes JavaScript zu klicken ... es passierte nichts 8O ich weiß nicht ob das schon die Lösung ist, wie es aktuell eingebaut ist ;)
Browser? Bei mir gehts ... ist ja dann ein ganz normaler Link.
Edit: Achso! Ne das is nur beim ausgeloggten Promobild.
Innerhalb von klamm gehe ich davon aus, dass JS an ist. ;)
 
generell hab ichs ja auch an, aber ich wollts halt mal testen ...
auch wenns schon geklärt ist. Bin aktuell mit dem FF 3.6.8 unterwegs
 
HTML:
<script language="javascript" src="https://media.fastclick.net/w/get.media?sid=50599&m=1&tp=1&d=j&t=n"></script>
Geht zwar, wird aber (soft) gemeckert. Richtig ist imho, genau wie bei Links:
HTML:
<script language="javascript" src="https://media.fastclick.net/w/get.media?sid=50599&m=1&tp=1&d=j&t=n"></script>

Oder müsste es URL-Encoded sein?
Auf keinen Fall. Ergebnis wäre, dass nur sid einen Wert enthalten würde, und zwar den kompletten Rest urldecode()d ;).
 
Richtig ist imho, genau wie bei Links:
& ... Jau, das war die Frage. Thx.

Auf keinen Fall. Ergebnis wäre, dass nur sid einen Wert enthalten würde, und zwar den kompletten Rest
Ah stimmt, das brauch man eher, wenn man in einer URL z.b. eine weitere URL oder Suchwort oder so als Para übergeben will - DAS muss dann encoded sein (= "escaped").