Какая цель (если таковая имеется) "javascript:" в тегах обработчика событий?
В последнее время я прилагаю совлокальные усилия для улучшения своих навыков работы с JavaScript, читая как можно больше кода javascript. При этом я иногда видел префикс javascript:
, прикрепленный к атрибутам обработчика событий в тегах элемента HTML. Какова цель этого префикса? В принципе, есть ли заметная разница между:
onchange="javascript: myFunction(this)"
и
onchange="myFunction(this)"
?
Ответы
Ответ 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 и других браузерах.
Это не "неправильно", но если вы хотите, чтобы ваш сайт сильно перемещался...