Когда я хочу, чтобы какая-то ссылка ничего не делала, а только отвечала на действия javascript, как лучше всего избежать прокрутки ссылки к верхнему краю страницы?
Я знаю несколько способов сделать это, кажется, все они работают нормально:
<a href="javascript:void(0)">Hello</a>
или
<a id="hello" href="#">Hello</a>
<script type="text/javascript>
$(document).ready(function() {
$("#toto").click(function(){
//...
return false;
});
});
</script>
и даже:
<a id="hello" href="#">Hello</a>
<script type="text/javascript>
$(document).ready(function() {
$("#toto").click(function(event){
event.preventDefault();
//...
});
});
</script>
Есть ли у вас какие-либо предпочтения? Почему ? в каких условиях?
PS: конечно, в приведенных выше примерах предполагается, что вы используете jquery, но есть эквиваленты для mootools или prototype.
Привязка:
javascript:
URL - ужас, которого следует избегать всегда; Ответы:
return false
означает как preventDefault
, так и stopPropagation
, поэтому значение будет другим, если вы заботитесь о родительских элементах, получающих событие уведомление; preventDefault
/ stopPropagation
должны быть написаны иначе в IE обычно ( returnValue
/ cancelBubble
). Однако:
на самом деле не идеальная разметка для этого. Все пойдет не так, если кто-то попытается щелкнуть по нему средней кнопкой мыши, добавить в закладки или воспользоваться другими возможностями, которые есть у ссылки. #thatelementsid
, и используйте ненавязчивый скрипт, чтобы получить идентификатор элемента из название ссылки. Вы также можете понюхать местоположение .hash
при загрузке документа, чтобы открыть этот элемент, поэтому ссылка становится полезной в других контекстах.
или
. Вы можете стилизовать его с помощью CSS, чтобы он выглядел как ссылка, а не кнопка, если хотите.
. Вы можете добавить свойство tabindex
, чтобы сделать его доступным с клавиатуры в большинстве браузеров, хотя на самом деле это не стандартизовано должным образом. Вы также можете обнаружить нажатия клавиш, такие как пробел или Enter, для активации. Это в некотором роде неудовлетворительно, но все же довольно популярно (SO, например, делает это так).
. Это дает преимущества доступности кнопки с полным визуальным контролем, но только для кнопок с чистым изображением. Единственное преимущество, которое я могу придумать для использования javascript: void (0)
, заключается в том, что он будет поддерживаться даже самыми старыми браузеры. Тем не менее, я бы использовал один из других ненавязчивых подходов, о которых вы упомянули:
event.preventDefault ()
и return false
могут использоваться как взаимозаменяемые. event.preventDefault ()
предотвратит перезагрузку страницы по желанию, но позволит событию щелчка перейти к родительскому элементу. Если вы хотите остановить всплытие, вы можете использовать его вместе с event.stopPropagation
. return false
дополнительно остановит всплытие события до родительского. Я говорю «взаимозаменяемо» в первом пункте выше, потому что большую часть времени нас не волнует, всплывает ли событие до родителя (ей).Однако, когда делают , нам нужна некоторая тонкая настройка, мы должны рассмотреть пункты два и три.
Рассмотрим следующий пример:
<div>Here is some text <a href="www.google.com">Click!</a></div>
$("a").click(function(e) {
e.preventDefault();
});
$("div").click(function() {
$(this).css("border", "1px solid red");
});
Нажатие на привязку предотвратит запуск действия по умолчанию для события, поэтому браузер не будет перенаправлять на www.google.com. Тем не менее, событие по-прежнему будет «всплывать» и вызывать событие щелчка div, которое добавит границу вокруг него. Добавьте e.stopPropagation ()
или просто верните false
, и событие щелчка div не сработает. Вы можете поиграть здесь: http://jsfiddle.net/cMKsN/1/
Dreamweaver по умолчанию использует небольшую уловку, которую я начал использовать.
<a href='javascript:;'></a>
Он маленький, он не спотыкается и не фиксируется, а также не зависит от библиотеки.
Я предпочитаю использовать return false
, так как это дает пользователю возможность выбрать, продолжать ли это действие, как показано здесь, в quirksmode:
http: // www .quirksmode.org / js / events_early.html # default
Это просто, старое, но хорошо работает, кроссбраузерно, независимо от версии javascript.
event.preventDefault ()
и возвращают false;
- это одно - они инструктируют браузер не обрабатывать действие по умолчанию для события (в данном случае переход к href тега привязки, который был нажат). href = javascript:
и ему подобные - это что-то еще - они вызывают действие по умолчанию «ничего не делать».
Это вопрос стиля. Вы хотите выполнять всю свою работу в onclick, или вы хотите иметь возможность размещать действия как в onclick, так и в href и полагаться на возможности браузера для переключения между ними?
Мне нравится использовать href="javascript:void(0)"
в ссылке, так как #
подразумевает переход к вверху страницы, и это может произойти, если по какой-то причине ваше событие jQuery не загружается, например jQuery не загружается.
Я также использую event.preventDefault();
, поскольку он не будет переходить по ссылке, даже если перед возвратом false будет обнаружена ошибка; например:
<a id="link" href="http://www.google.com">Test</a>
$("#link").click(
function(){
alert("Hi");
invalidCode();
return false;
}
);
$("#link").click(
function(event){
event.preventDefault();
alert("Hi");
invalidCode();
return false;
}
);
Поскольку invalidCode();
выдаст ошибку return false
никогда не достигнуто, и если используется пример jQuery 1, пользователь будет перенаправлен в Google, тогда как в примере jQuery 2 он этого не сделает.
Я бы не стал помещать JavaScript в href
, потому что он не для этого предназначен. Я предпочитаю что-то вроде
<a href="#" onclick="return handler();">Link</a>