Konkatenation av 'scr'+'ipt' i javascript-bokmärkeskod
Med tanke på andra frågor om samma ämne känner jag att jag förstår de uppenbara motiveringarna för att sammanfoga <script>-taggen som '<scr'+'ipt..' i en javascript-sträng, även om detta i sig är missriktat.
Men när jag tittar på koden för Instapaper-gnuggis ser jag d.createElement('scr' + 'ipt'). Den relevanta delen av koden (förbättrad) finns i slutet av frågan.
Även om detta (anti-)mönster är till för att undvika att HTML-parsern bråkar med markuppen efter förekomsten av den avslutande <script>-taggen inom en javascript-sträng, kan jag se ännu mindre anledning att göra det här eftersom den sammanfogade texten inte ens representerar en <script>-tagg.
I det här fallet, görs detta av någon annan anledning?
javascript: function iprl5() {
var d = document,
z = d.createElement('scr' + 'ipt'), //???
b = d.body,
l = d.location;
Svar #1
Det är löjligt att undkomma "<script>" eftersom det inte kommer att tolkas som en tagg inom ett scriptblock* och det är ännu mer löjligt att behandla "script" som speciellt. Det är det inte. Det saknar antingen en < eller </, utan vilken det aldrig kommer att tolkas som en tagg -- i något sammanhang. Således har f("script") och f("scr"+"ipt") identisk semantik.
Tekniskt sett i HTML måste alla </ i ett skriptblock skyddas mot, men i praktiken bryr sig webbläsare bara om </script>. På grund av detta är "<"+"/script>" det jag rekommenderar, men det gäller endast stängande taggar. Det vill säga, "<script>" (eller "script" beroende på situationen) är helt giltigt inuti ett skriptblock.
Glad kodning.
*Av en kompatibel HTML-parser: dock kan handgjord (regex) parsing explodera på fruktansvärda sätt. XML/XHTML-reglerna är olika, men då måste < kodas för att dessa ska vara väldefinierade ändå ... kanske vissa oklarheter med CDATA? I vilket fall är det irrelevant för HTML.
Dessutom argumenterar de länkade svaren inte för "<scr"+"ipt.." (eller delmängder som "scr"+"ipt"): istället argumenterar de för att skydda mot stängningen av script-taggen, som börjar med </, vilket inte ens finns i koden i inlägget...
Svar #2
Nej.
Jag tror.
Jag antar att detta gjordes av någon som blev bränd av en '</script>' och blev för skyddande.