2013-04-12 13 views
12

Beiden JSLint und JSHint Warnungen Problem, wenn sie stoßen auf eine benannte Anweisung, deren Kennung entspricht den folgenden regulären Ausdruck:Kann das Label "javascript:" irgendwelche Probleme verursachen?

/^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i 

Zum Beispiel der folgende Snippet erzeugt eine „JavaScript-URL“ Warnung von JSLint und ein „Label‚javascript 'sieht aus wie eine JavaScript-uRL“Warnung von JSHint (die Funktion Wrapper ist nicht notwendig, aber JSLint nicht etikettierte Anweisungen wie, die nicht funktionieren-scoped und wirft eine andere Warnung):

function example(x, y) { 
javascript: 
    while (x) { 
     while (y) { 
      break javascript; 
     } 
    } 
} 

Soweit ich kann Sag, kein Browser kümmert sich darum, auch wenn es sofort erscheint direkt nach dem "javascript:" Protokoll in einem Bookmarklet. Zum Beispiel scheint die folgend immer zu arbeiten (Paste einfach in die Adressleiste wie jede Bookmarklet):

javascript:(function() { javascript:for(var i = 0; i < 2; i++) { alert(i); break javascript; } }()); 

javascript:javascript:for(var i = 0; i < 2; i++) { alert(i); break javascript; } 

Könnte die Label-Kennung „javascript:“ (oder eine andere Zeichenfolge, die diesen Regex würde) jemals verursacht hat irgendwelche Probleme (einige alte Browser vielleicht?), die die erzeugten Warnungen rechtfertigen würden? Warum werden diese Warnungen generiert?

+9

Oh, die Ironie, 'brechen javascript' ... +1 – user123444555621

+0

@ Pumbaa80 - Haha, ich hadn‘ t lesen Sie es so! Vielen Dank. –

Antwort

4

Ich vermute, ich meistens hier, aber bedenken Sie, dass:

  • javascript: ist kein eigentliches Protokoll;
  • es wird nirgends außer Bookmarklets benötigt (andernfalls wird angenommen, dass es ein Label ist);
  • die Warnung sagt es "sieht wie eine Javascript URL aus".

Ich denke, JSLint ist darauf hindeutet, dass die javascript: pseudo-Protokoll ist schlecht, und so ist alles, was es ähnelt, oder könnte mit ihm verwechselt werden. Könnte es irgendwelche Probleme verursachen? Streng genommen, perhaps on IE (vielleicht nur OldIE). Aber, wie gesagt, ein javascript: Etikett könnte verwirrt mit dem Pseudo-Protokoll sein, und JSLint mag nichts potenziell verwirrend. Also, das könnte eine Erklärung sein.

+0

Ich denke, das ist wahrscheinlich richtig. Ich habe alle möglichen Experimente gemacht und überhaupt keine Probleme verursacht, also werde ich es als eines dieser merkwürdigen JSLint-Dinge hinstellen, die nicht wirklich wichtig sind. Vielen Dank. –

+1

Dies scheint nicht in JSLint zu kodieren, aber 'javascript:' ist auch akzeptabel, wenn unmittelbar gefolgt von der Zeichenkette "die guten Teile". :) – bfavaretto

1

Was Bfavaretto sagt, ist wahrscheinlich wahr, vor allem der letzte Aufzählungspunkt, aber auch beachten Sie, dass die javascript: Pseudo-Protokoll ist verdächtig.

Die MDN erwähnt dies: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/void#JavaScript_URIs

"Beachten Sie jedoch, dass das javascript: Pseudo-Protokoll über andere Alternativen abgeraten, wie unaufdringlich Event-Handler"

Ein Artikel darüber, warum: http://into-the-zen.blogspot.com/2010/04/dont-use-javascript-pseudo-protocol.html

"IE6 einige Nebenwirkungen produziert ..."

+0

stimme ich voll und ganz zu. Klingt meine Antwort so, als ob ich die Verwendung des Pseudo-Protokolls ermutige? – bfavaretto

+0

@bfavaretto: Nein, es war eine gute Antwort, ich dachte nur, dass dies auch erwähnt werden muss. –

+0

Ich sehe, danke für die Aufklärung! – bfavaretto