2013-04-12 8 views
12

Oba JSLint i JSHint wydawać ostrzeżenia, kiedy spotykają się z etykietą oświadczenie, którego identyfikator pasuje do następującego wyrażenia regularnego:Czy etykieta "javascript:" może powodować problemy?

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

Na przykład, poniższy fragment kodu generuje „JavaScript URL” ostrzeżenie od JSLint i „etykieta„javascript "wygląda jak URL javaScript” ostrzeżenie od JSHint (obwoluta funkcja jest niepotrzebna, ale JSLint nie lubi oznakowanych wypowiedzi, które nie funkcjonują o zakresie i podnosi inny ostrzeżenie):

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

o ile mogę powiedz, że żadna przeglądarka nie dba o to, nawet gdy wydaje się, że jest diately po "javascript:" protokołu w bookmarklet. Na przykład, zawsze po wydają się działać (wystarczy wkleić w pasku adresu, jak każdy 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; } 

Czy identyfikator etykieta „javascript:” (lub dowolny inny ciąg znaków, który będzie pasował do tego regex) kiedykolwiek spowodowanego jakieś problemy (może jakaś starożytna przeglądarka?), które uzasadniałyby generowane ostrzeżenia? Dlaczego generowane są te ostrzeżenia?

+9

Och, ironia, 'złamać javascript' ... +1 – user123444555621

+0

@ Pumbaa80 - Haha, ja hadn” t tak to czytać! Dzięki. –

Odpowiedz

4

Ja przeważnie zgadywania tutaj, ale uważają, że:

  • javascript: nie jest rzeczywiste protokół;
  • nie jest potrzebny nigdzie poza bookmarkletami (w przeciwnym razie zakłada się, że jest etykietą);
  • ostrzeżenie mówi, że "wygląda jak adres URL javascript".

myślę JSLint sugeruje, że pseudo-protocol javascript: jest zły, a więc jest coś, co przypomina jej, czy może być mylony z nim. Czy to może powodować problemy? Ściśle mówiąc, perhaps on IE (może tylko oldIE). Ale, jak powiedziałem, etykieta javascript: może być zdezorientowana z pseudo-protokołem, a JSLint nie lubi niczego potencjalnie mylącego. To może być wyjaśnienie.

+0

Myślę, że to prawdopodobnie jest poprawne. Przeprowadziłem różnego rodzaju eksperymenty i nie spowodowałem żadnych problemów, więc umieszczę to jako jedną z tych dziwnych rzeczy JSLint, które tak naprawdę nie mają znaczenia. Dzięki. –

+1

To nie wydaje się być zakodowane w JSLint, ale 'javascript:' jest również dopuszczalne, gdy bezpośrednio następuje ciąg "dobre części". :) – bfavaretto

1

To, co mówi bfavaretto, jest prawdopodobnie prawdziwe, zwłaszcza ostatni punkt, ale należy pamiętać, że pseudo protokół javascript: został przeładowany.

MDN wspomina o tym: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/void#JavaScript_URIs

„Należy jednak pamiętać, że protokół javascript: pseudo jest odradzane przez innych alternatyw, takich jak dyskretne obsługi zdarzeń”

Artykuł na temat dlaczego: http://into-the-zen.blogspot.com/2010/04/dont-use-javascript-pseudo-protocol.html

"IE6 wywołuje pewne skutki uboczne ..."

+0

Całkowicie się zgadzam. Czy moja odpowiedź brzmi jak zachęcam do korzystania z pseudoprotokołu? – bfavaretto

+0

@bfavaretto: Nie, to była dobra odpowiedź, po prostu pomyślałem, że to też trzeba wspomnieć. –

+0

Rozumiem, dzięki za wyjaśnienie! – bfavaretto

Powiązane problemy