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

Какая цель (если таковая имеется) "javascript:" в тегах обработчика событий?

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

onchange="javascript: myFunction(this)"

и

onchange="myFunction(this)"

?

4b9b3361

Ответ 1

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

Например:

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

Вместо

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

Ответ 2

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

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

Изменить: подумал о хорошей причине использовать javascript:. Букмарклеты. Например, этот отправляет вас читателю Google для просмотра 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>

Ответ 3

Его следует использовать только в теге href.

Это смешно.

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

javascript: в атрибуте href обозначается URI JavaScript.

Пример:

javascript:(function()%7Balert(%22test%22)%3B%7D)()%3B

Ответ 7

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

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

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

Ответ 8

@mercutio

Это смешно.

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

Ответ 9

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

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

Ответ 10

Flubba:

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

Это не "неправильно", но если вы хотите, чтобы ваш сайт сильно перемещался...