2013-04-12 12 views
12

Entrambi emettere segnalazioni JSLint e JSHint quando incontrano una dichiarazione etichettata cui identificatore corrisponde la seguente espressione regolare:L'etichetta "javascript:" può causare problemi?

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

Ad esempio, il seguente frammento di codice genera un avviso "JavaScript URL" da JSLint e un javascript "Etichetta' 'si presenta come un URL JavaScript" avvertimento da JSHint (la funzione wrapper è inutile, ma JSLint non piace dichiarazioni che non sono etichettati funzionano con ambito e genera un avviso diverso):

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

per quanto posso Dite, nessun browser se ne preoccupa, anche quando sembra imme diatamente dopo il protocollo "javascript:" in un bookmarklet. Ad esempio, il seguente sempre sembra funzionare (solo incollare nella barra degli indirizzi come ogni 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; } 

Può l'identificativo etichetta "javascript:" (o qualsiasi altra stringa che potrebbe corrispondere a quello regex) mai hanno causato eventuali problemi (alcuni browser antichi forse?) che giustificano gli avvertimenti generati? Perché vengono generati questi avvisi?

+9

Oh, l'ironia, 'rompere javascript' ... +1 – user123444555621

+0

@ Pumbaa80 - Haha, non avevo' lo leggo così! Grazie. –

risposta

4

Sono per lo più indovinare qui, ma ritengono che:

  • javascript: non è un vero e proprio protocollo;
  • non è necessario da nessuna parte tranne bookmarklets (altrimenti si presume che sia un'etichetta);
  • l'avviso dice "sembra un URL javascript".

Penso JSLint sta suggerendo che la pseudo-protocollo javascript: è male, e così è qualcosa che assomiglia esso, o potrebbe essere confuso con esso. Potrebbe causare problemi? A rigor di termini, perhaps on IE (forse solo oldIE). Ma, come ho detto, un'etichetta javascript: potrebbe essere confusa con lo pseudo-protocollo e JSLint non gli piace nulla di potenzialmente confuso. Quindi, questa potrebbe essere una spiegazione.

+0

Penso che sia probabilmente corretto. Ho fatto tutti i tipi di esperimenti e non sono riuscito a causare alcun problema, quindi lo metto giù come uno di quegli strani elementi JSLint che non contano davvero. Grazie. –

+1

Questo non sembra essere codificato in JSLint, ma 'javascript:' è accettabile anche quando immediatamente seguito dalla stringa "le parti buone". :) – bfavaretto

1

Che cosa dice bfavaretto è probabilmente vero, in particolare l'ultimo punto, ma si noti anche che lo pseudo protocollo javascript: è scoraggiato.

Il MDN cita questo: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/void#JavaScript_URIs

"Si noti, tuttavia, che il protocollo javascript: pseudo è scoraggiato più di altre alternative, come ad esempio i gestori di eventi discreti"

Un articolo sul perché: http://into-the-zen.blogspot.com/2010/04/dont-use-javascript-pseudo-protocol.html

"IE6 produce alcuni effetti collaterali ..."

+0

Sono completamente d'accordo. La mia risposta mi sembra che stia incoraggiando l'uso dello pseudo-protocollo? – bfavaretto

+0

@bfavaretto: No, è stata una buona risposta, ho solo pensato che fosse necessario menzionarlo. –

+0

Vedo, grazie per aver chiarito! – bfavaretto

Problemi correlati