Вам когда-нибудь приходилось указывать «javascript:» в onclick?

Насколько я знаю, вам никогда не нужно указывать протокол одним кликом:

onclick="javascript:myFunction()" Плохо

onclick="myFunction()" Хорошо

Сегодня я заметил в эту статью в Google Analytics, что они ее используют:

<a href="http://www.example.com" onClick="javascript: pageTracker._trackPageview('/outgoing/example.com');">

Является ли этот пример просто неправильным, или есть ли причина указывать javascript: в чем-то другом, кроме href?


person Diodeus - James MacFarlane    schedule 16.12.2008    source источник
comment
Ссылка на статью битая. Как оно называлось?   -  person Peter Mortensen    schedule 08.09.2013
comment
@PeterMortensen: Его больше не существует.   -  person Ry-♦    schedule 08.09.2013


Ответы (8)


Некоторые из ответов здесь утверждают, что префикс «javascript:» является «пережитком старых дней», подразумевая, что он намеренно, специально обрабатывается браузерами для обратной совместимости. Есть ли веские доказательства того, что это так (кто-нибудь проверял исходный код)?

<span onclick="javascript:alert(42)">Test</span>

Для меня это просто читается как:

javascript:
    alert(42);

Это означает, что «javascript:» - это просто ярлык и не имеет никакого эффекта. Это тоже работает:

<span onclick="foobar:alert(42)">Test</span>

Обновление:

Я провел небольшой эксперимент, и оказалось, что да, "javascript:" обрабатывается специально для IE, но определенно не для Firefox, Safari, Opera или Chrome:

<span onclick="javascript:while (true) { alert('once'); break javascript; }">Test</span>

В не-IE это просто предупредит «один раз», один раз, а затем выйдет из цикла. В IE я получаю сообщение об ошибке «Ярлык не найден». Во всех браузерах отлично работает следующее:

<span onclick="foo:while (true) { alert('once'); break foo; }">Test</span>

Обновление 2:

Я только что понял ссылку http://crisp.tweakblogs.net/blog/the-useless-javascript-pseudo-protocol.html в одном из приведенных выше ответов в значительной степени говорит об одном и том же.

person Ates Goral    schedule 16.12.2008
comment
Я не проверял это, но я считаю, что у него есть особая функция при использовании с функцией getURL из Flash, поскольку он попытается вызвать функцию Javascript на странице, а не выполнить URL-адрес. - person Luke; 17.12.2008
comment
Какие версии Internet Explorer имели/имеют такое поведение? - person Peter Mortensen; 08.09.2013

Это никогда не требуется на якорях и никогда не является хорошей практикой. Якорь предназначен только для навигации. Статья на эту тему: Бесполезный JavaScript: псевдо -протокол.

person I.devries    schedule 16.12.2008

Вначале вы также могли использовать VBScript в Internet Explorer вместо JavaScript, поэтому указав "javascript :..." был стандартным.

Сегодня, ну, это не больно... В будущем всегда может появиться какой-нибудь другой язык сценариев для браузера.

person Steven A. Lowe    schedule 16.12.2008

См. раздел Указание языка сценариев. (в 18.2.2 в Спецификации HTML 4.01, Скрипты).

person Loki    schedule 16.12.2008
comment
В этом разделе говорится что-нибудь о javascript: в onclick? - person Ry-♦; 08.09.2013

Я всегда считал, что это неправильное использование, основанное на том факте, что вы можете вызывать JavaScript внутри URL с префиксом javascript::

<a href="javascript:void(alert('really bad usage!'))">

(Веб-формы, кто-нибудь?)

И использовали его только несведущие веб-разработчики, которые так и не поняли разницы между event-декларацией и href-декларацией.

Я бы сказал, что даже атрибуты событий в большинстве случаев в настоящее время являются плохой практикой, и предпочтительный способ присоединения события — использование .attachEvent (Internet Explorer) и addEventListener (остальные браузеры, как обычно).

И, наконец... Google не всегда всемогущ БОГ. Они, как правило, больше беспокоятся о том, чтобы все работало, а не постоянно следовали стандартам.

person jishi    schedule 16.12.2008

Я думаю, что префикс «javascript:» — это пережиток старых дней, когда все еще существовала смутная вероятность того, что что-нибудь другое, кроме JavaScript, может обрабатывать событие.

Сегодня это необязательно и сохранено из соображений обратной совместимости. Но я бы не сказал, что это плохо как таковое, просто в этом нет необходимости.

person Tomalak    schedule 16.12.2008
comment
Это псевдопротокол — его можно использовать в атрибуте href привязки, чтобы указать код для запуска, а не URL-адрес для перехода. - person Jason Bunting; 17.12.2008
comment
Конечно. Не подумал об этом, потому что я предпочитаю использовать ‹a onclick=...› - person Tomalak; 17.12.2008

В Internet Explorer можно установить для страницы язык по умолчанию VBScript. В первые дни всегда существовала идея, что для написания сценариев в браузере можно использовать другой язык. Как оказалось, ни один такой язык не материализовался в субстанциальной форме.

Сам я не заморачиваюсь с этим языковым префиксом.

person AnthonyWJones    schedule 16.12.2008

Это хорошая практика для вашего программиста обслуживания. Компилятор знает разницу, но этот молодой веб-разработчик, только что окончивший колледж, может не знать.

person George Stocker    schedule 16.12.2008
comment
Если молодой веб-разработчик, только что окончивший колледж, может не знать этого, зачем он пошел в колледж? :-) - person Tomalak; 16.12.2008