Может ли наклейка "javascript:" вызвать какие-либо проблемы?
Как JSLint, так и JSHint вызывают предупреждения, когда они сталкиваются с помеченной инструкцией, идентификатор которой соответствует следующему регулярному выражению:
/^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i
Например, следующий фрагмент генерирует предупреждение "JavaScript URL" из JSLint, а предупреждение Javascript "похоже на javascript url" от JSHint (оболочка функции не нужна, но JSLint не любит помеченные сообщения, которые не связаны с функциями и вызывает другое предупреждение):
function example(x, y) {
javascript:
while (x) {
while (y) {
break javascript;
}
}
}
Насколько я могу судить, ни один браузер не заботится об этом, даже когда он появляется сразу после протокола "javascript:" в букмаркете. Например, всегда работает следующее (просто вставьте в адресную строку, как любой букмарклет):
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; }
Может ли идентификатор метки "javascript:" (или любая другая строка, соответствующая этому регулярному выражению) когда-либо вызвать какие-либо проблемы (возможно, какой-то древний браузер?), которые гарантировали бы генерируемые предупреждения? Почему эти предупреждения генерируются?
Ответы
Ответ 1
Я в основном угадываю здесь, но считаю, что:
-
javascript:
не является фактическим протоколом;
- он не нужен нигде, кроме букмарклетов (в противном случае он считается меткой);
- предупреждение говорит, что оно "похоже на URL-адрес JavaScript".
Я думаю, что JSLint предполагает, что псевдо-протокол javascript:
плох, и это похоже на него, или его можно смутить. Может ли это вызвать какие-либо проблемы? Строго говоря, возможно в IE (может быть, только oldIE). Но, как я уже сказал, ярлык javascript:
можно путать с псевдо-протоколом, а JSLint не любит ничего потенциально запутанного. Таким образом, это может быть объяснением.
Ответ 2
То, что говорит bfavaretto, вероятно, истинно, особенно последняя маркерная точка, но также следует отметить, что псевдо-протокол javascript:
неприхотлив.
В MDN упоминается следующее: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/void#JavaScript_URIs
"Обратите внимание, однако, что псевдопроводный протокол javascript:
не рекомендуется другим альтернативам, таким как ненавязчивые обработчики событий".
Статья о том, почему: http://into-the-zen.blogspot.com/2010/04/dont-use-javascript-pseudo-protocol.html
"IE6 создает некоторые побочные эффекты..."