Какова цель (если есть) javascript: в тегах обработчика событий? - PullRequest
16 голосов
/ 22 августа 2008

В последнее время я прилагаю согласованные усилия, чтобы улучшить свои навыки работы с JavaScript, читая как можно больше кода JavaScript. При этом я иногда видел префикс javascript:, добавляемый к началу атрибутов обработчика событий в тегах HTML-элементов. Какова цель этого префикса? В принципе, есть ли заметная разница между:

onchange="javascript: myFunction(this)"

и

onchange="myFunction(this)"

Ответы [ 10 ]

18 голосов
/ 22 августа 2008

Вероятно, ничего в вашем примере. Насколько я понимаю, javascript: для якорных тегов (вместо фактического href). Вы бы использовали его, чтобы ваш сценарий мог выполняться, когда пользователь щелкает ссылку, но без инициирования перехода обратно на страницу (что будет делать пустой href в сочетании с onclick).

Например:

<a href="javascript:someFunction();">Blah</a>

Вместо:

<a href="" onclick="someFunction();">Blah</a>
12 голосов
/ 22 августа 2008

Его не следует использовать в обработчиках событий (хотя большинство браузеров работают защищенно и не накажут вас). Я также утверждаю, что его не следует использовать в атрибуте href якоря. Если браузер поддерживает javascript, он будет использовать правильно определенный обработчик событий. Если браузер этого не сделает, ссылка на javascript: будет выглядеть неработающей. IMO, лучше указать им страницу, объясняющую, что им нужно разрешить javascript использовать эту функциональность, или, что еще лучше, требуется не функциональная версия javascript. Итак, что-то вроде:

<a href="non-ajax.html" onclick="niftyAjax(); return false;">Ajax me</a>

Редактировать: Думал о веской причине для использования javascript :. Букмарклеты. Например, этот отправляет вас в Google Reader для просмотра RSS-каналов для страницы:

var b=document.body;
if(b&&!document.xmlVersion){
  void(z=document.createElement('script'));
  void(z.src='http://www.google.com/reader/ui/subscribe-bookmarklet.js');
  void(b.appendChild(z));
}else{
  location='http://www.google.com/reader/view/feed/'+encodeURIComponent(location.href)
}

Чтобы пользователь мог легко добавить этот букмарклет, вы должны отформатировать его так:

<a href="javascript:var%20b=document.body;if(b&&!document.xmlVersion){void(z=document.createElement('script'));void(z.src='http://www.google.com/reader/ui/subscribe-bookmarklet.js');void(b.appendChild(z));}else{location='http://www.google.com/reader/view/feed/'+encodeURIComponent(location.href)}">Drag this to your bookmarks, or right click and bookmark it!</a>
4 голосов
/ 22 августа 2008

Он должен использоваться только в теге href.

Это смешно.

Принятый способ таков:

<a href="/non-js-version/" onclick="someFunction(); return false">Blah</a>

Но, чтобы ответить на ОП, обычно нет смысла использовать javascript:. Фактически, вы должны прикрепить событие javascript из вашего скрипта, а не встраивать в разметку. Но я думаю, это пуристская вещь: -D

2 голосов
/ 28 августа 2008

Происхождение javascript: в обработчике событий на самом деле является специфической особенностью IE, так что вы можете указать язык в дополнение к обработчику. Это потому, что vbscript также является поддерживаемым языком сценариев на стороне клиента в IE. Вот пример "vbscript:" .

В других браузерах (как было сказано Shadow2531) javascript: - это просто метка и в основном игнорируется.

href="javascript:..." может использоваться в ссылках для выполнения кода JavaScript, как указывает DannySmurf.

1 голос
/ 23 августа 2008

javascript: в коде JS (как в атрибуте onclick) это просто метка для использования с инструкциями меток continue / goto, которая может поддерживаться или не поддерживаться браузером (вероятно, нигде). Это может быть zipzambam: вместо этого. Даже если метка не может быть использована, браузеры по-прежнему принимают ее, поэтому она не вызывает ошибку.

Это означает, что если кто-то выбрасывает бесполезную метку в атрибуте onclick, он, вероятно, не знает, что делает, и просто копирует и вставляет или делает это по привычке, выполняя приведенное ниже.

javascript: в атрибуте href указывается URI Javascript.

Пример

javascript:(function()%7Balert(%22test%22)%3B%7D)()%3B
1 голос
/ 22 августа 2008

Я не авторитет в JavaScript, и, возможно, в большей степени глуп, чем спрашивающий, но AFAIK, разница в том, что префикс javascript: предпочтителен / необходим в URI-контекстах, где аргумент может быть также традиционным HTTP URL как триггер JavaScript.

Итак, мой интуитивный ответ был бы таков: поскольку onChange ожидает JavaScript, префикс javascript: является избыточным (если не является совершенно ошибочным). Однако вы можете написать javascript:myFunction(this) в адресной строке, и эта функция будет запущена. Без javascript: ваш браузер попытается интерпретировать myFunction(this) как URL-адрес и попытается получить информацию о DNS, перейти на этот сервер и т. Д. *

0 голосов
/ 04 сентября 2008

Flubba:

Использование javascript: в HREF разрывает «Открыть в новом окне» и «Открыть в новой вкладке» в Firefox и других браузерах.

Это не «неправильно», но если вы хотите усложнить навигацию по сайту ...

0 голосов
/ 23 августа 2008

В принципе, есть ли заметная разница между: onchange="javascript: myFunction(this)" и onchange="myFunction(this)"?

Предполагается, что вы имели в виду href="javascript: myFunction(this)", да, особенно при загрузке контента с использованием JavaScript. Использование псевдопротокола javascript: делает контент недоступным для некоторых людей и всех поисковых систем, тогда как использование реального href и последующее изменение поведения ссылки с помощью javascript делает контент доступным, если javascript отключен или недоступен в конкретном клиенте.

0 голосов
/ 23 августа 2008

@ Меркуцио

Это смешно.

Нет, это не смешно, javascript: это псевдопротокол, который действительно может использоваться только как предмет ссылки, так что он совершенно прав. Ваше предложение действительно лучше, но лучший способ - использовать ненавязчивые методы javascript для перебора элементов HTML и программного добавления поведения, как это используется в библиотеках, таких как jQuery.

0 голосов
/ 22 августа 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...