Подтвердить что ты не робот

Может ли наклейка "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:" (или любая другая строка, соответствующая этому регулярному выражению) когда-либо вызвать какие-либо проблемы (возможно, какой-то древний браузер?), которые гарантировали бы генерируемые предупреждения? Почему эти предупреждения генерируются?

4b9b3361

Ответ 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 создает некоторые побочные эффекты..."