2016-04-14 5 views
0
var div = document.createElement('div'); 
div.style.cssText = "background-image: url('http://imgs.com/mouse.png ')"; 
div.style.cssText 
//=> "background-image: url("http://imgs.com/mouse.png\9 ");" 

Der obige Code ein `\ 9` in diesem Stil-Attribut eingefügt, mit dem eine Lasche nach dem .png Suffix zu sein, wenn entweder in Chrome oder Firefox Konsole ausgegeben die gezeigte Linie mit mit \9 beigefügten laufen an die URL. Warum das?Warum sind Browser

Ich habe gelesen, dass \9 ist eine Art von einem Hack für das Targeting nur bestimmte Versionen von IE, aber warum würden Chrome und Firefox das automatisch einfügen?

PS: Für zusätzlichen Browser Spaß, können Sie erraten, was passiert, wenn diese URL relativ ist und Sie es mit dem klassischen <a> href Trick lösen möchten? Hier ist, was auf der fiktiven http://imgs.com Domain passieren würde:

var a = document.createElement('a'); 
// Actually parsed from the above response, not assigned manually 
a.href = "/mouse.png\\9 "; 
a.href 
//=> "http://imgs.com/mouse.png/9" (in Chrome) 
//=> "http://imgs.com/mouse.png%5C9" (in Firefox) 

Während also die URL mit dem Suffix \9 würde eigentlich noch arbeiten, werden die aufgelösten URLs verweisen nun auf falsche Positionen.

+3

Das Tab-Zeichen ist auch "CTRL-I". Der Buchstabe "I" ist der neunte Buchstabe des Alphabets. '\ 9' ist ein CSS-Zeichen-Escape. – Pointy

+0

Wenn die Konsole es tut, aber die Seite selbst löst es immer korrekt, ist es wahrscheinlich ein Fehler in der Konsole. Meine Frage ist, warum gibt es Leerzeichen in Ihrem CSS-String? Randnotiz, der '\ 9' IE-Hack wird am Ende der Eigenschaft (vor dem'; ') platziert, nicht in der Mitte eines Strings und ist entweder' \ 9' für 8-11 oder '\ 9' (das ist ein nbsp nicht eine sp, kopiere nicht Paste) für ich glaube, 5,5-8. – abluejelly

+1

@ Pointy Das ist ... interessant. Ich meine, es ist eigentlich '\ 9', weil TAB ASCII (und in der Erweiterung UTF)' 0x09' ist, und wenn es '^ i' ist, würde es daran liegen, dass Sie Tabs für' i'ndenting verwenden ... Aber das ist ein coole Geschichte nichtsdestotrotz – abluejelly

Antwort

1

Wenn die Konsole den Quellcode ausdrucken muss, versucht sie dies auf eine eindeutige Weise. Ein Tabulatorzeichen ist offensichtlich kein Tabulator, und es gibt viele andere Sonderzeichen mit demselben Problem. Daher werden nicht druckbare oder nicht naheliegende Zeichen unter Verwendung einer geeigneten Escape-Sequenz gerendert, wobei "geeignet" bedeutet "passend zu dem Sprachkontext".

CSS-Escapes sehen wie \nnnnnn aus, wobei die n s Hexadezimalziffern sind. Es kann ein bis sechs solcher Ziffern geben. Der Escape-Code \9 ist der Escape für das Tab-Zeichen.

Beachten Sie, dass in tatsächlichen CSS Quelltext, auch Sie \9 austauschbar tatsächliche Tabulatorzeichen und die Notation verwenden können und genau die gleichen Ergebnisse erhalten, weil der CSS-Parser \9 als Tabulatorzeichen interpretiert, genau wie ein tatsächliches Tabulatorzeichen.

Das beschriebene Verhalten der Konsole ist nicht in jedem Standard (weil die Entwickler-Tools selbst nicht standardisiert sind), aber es ist die Art von Sache, die jeder Designer solcher Tools sehr wahrscheinlich tun wird.

+0

Über das einzige, was ich hinzufügen würde, ist, dass die Quelle für die Codepunkte, die die Hexadezimalziffern entsprechen, entweder UTF oder die Codepage der CSS-Datei ist. Nicht ganz sicher was, aber da die CSS-Datei im Allgemeinen in UTF ist. 8, sie würden die meiste Zeit äquivalent sein, daher meine Unsicherheit ohne auf eine Spezifikation zu schauen. – abluejelly

+0

Ich denke, das vermisst den Punkt, indem man sich auf die Konsole konzentriert. Sehen und starten Sie dies zum Beispiel: https://plnrkr.co/edit/rbmKYgnU4p3aixgNZaMu – Deiwin