Jesper Stocholm <j@stocholm.invalid> writes:
> Skal tegn som '&' escapes i et javascript som i html-kode?
Det kommer an på ...
1) hvor koden står,
2) HTML-versionen, og
3) om browseren opfører sig som den skal.
Det simpleste tilfælde er hvis JS-koden ligger i sin egen fil. Så skal
man aldrig bruge HTML's entitets-kodning. Det er kun hvis koden er del
af et (X)HTML-dokument at det er relevant.
I HTML 4.01 er både indholdet af script-tags og indholdet af
on<event>-attributterne af typen "%Script". DTD'en siger:
<!ENTITY % Script "CDATA" -- script expression -->
I CDATA bliver entiteter fortolket, så & bliver til et og-tegn, og
et almindeligt og-tegn bliver taget som starten på en entitet. Dog
siger specificationen at entiteter i script- og style-elementer *ikke*
skal fortolkes.
Altså, i HTML 4 skal og-tegnet escapes hvis det optræder i en
attribut-værdi, men ikke hvis det optræder i et script-tag.
<URL:
http://www.w3.org/TR/html4/types.html#type-cdata>
I XHTML 1.0 er indholdet af script- og style-elementer PCDATA, ikke
CDATA. I XHTML betyder det at entiteter blive fortolket. Altså skal
og-tegn escapes i script-elementer i XHTML (modsat HTML).
Det kan omgås ved at pakke sit script ind i en CDATA-sektion:
<script type="text/javascript">
// <![CDATA[
...
// ]]>
</script>
Dette XHTML betyder at indholdet mellem <![CDATA[ og ]]> bliver
fortolket som CDATA, hvilket betyder at entiteter ikke bliver
fortolket. Hvis browseren ikke forstår XHTML, så vil det virke
ligesådan som HTML.
<URL:
http://www.w3.org/TR/xhtml1/#h-4.8>
Så er der problemet med browserne. IE forstår, så vidt jeg har ladet
mig forstå, ikke XHTML særlig godt. Hvis det ikke er XHTML, så er IE6,
Opera 7 og Mozille FB enige om at entiteter i scripts ikke skal
fortolkes.
> Når jeg spørger er det fordi jeg har noget eksisterende javascript som
>
> if(confirm('Er du sikker på, at du vil slette?.')) {
> var strRedirectURI = '/dodelete/?id=' + strURI + '&dodelete=' + bDoDelete + '&checksum=' + strCheckSum;
> location.href = strRedirectURI;
Her er to muligheder for at få & fortolket. Den første mulighed er
som del af scriptet. Den anden mulighed er som del af URL'en. Jeg tror
det er den sidste mulighed der er den rigtige.
Jeg udførte følgende i de forskellige browsere:
---
var str = "
http://www.infimum.dk/#test&test";
alert(str);
location.href=str;
---
Alerten viser klart at der står "&" i strengen, ikke bare "&".
I Opera 7 og IE 6 bliver den resulterende URL i adresselinjen:
http://www.infimum.dk/#test&test
I Mozilla FB og Netscape 4 står der:
http://www.infimum.dk/#test&test
Altså er det browseren der forsøger at gætte hvad der menes med
entiteter i URL'en, og de er ikke enige.
Løsningen er måske at kode URL'en. Ret første linje i ovenstående til
var str = "
http://www.infimum.dk/#test%26amp;test";
Det er alle browsere enige om. Serveren må så selv dekode at '%26' == '&'.
> Men jeg kan nu se at browsere på *Nix [1] ikke escaper disse tegn -
> noget IE "naturligvis" gør uden videre. Mozilla opfører sig dog
> som på *Nix også på Windows.
Mozilla fortolker ikke entiteter i en URL. IE gør. Konklusion: Undgå
og-tegn der kan misforstås.
/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
Art D'HTML: <URL:
http://www.infimum.dk/HTML/randomArtSplit.html>
'Faith without judgement merely degrades the spirit divine.'