"javascript: void (0);" vs "return false" vs " preventDefault()"



когда я хочу, чтобы какая-то ссылка ничего не делала, а только отвечала на действия 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.

396   8  

8 ответов:

обязательные:

  • javascript: URL-адреса-это ужас, которого следует избегать во все времена;
  • встроенные атрибуты обработчика событий тоже не блестящие, но хорошо для немного быстрой разработки / тестирования;
  • привязка из сценария, оставляя разметку чистой, обычно считается лучшей практикой. jQuery поощряет это, но нет причин, по которым вы не можете сделать это в любой библиотеке или обычном JS.

ответы:

  • In jQuery return false означает preventDefault и stopPropagation, поэтому значение отличается, если вы заботитесь о родительских элементах, получающих уведомление о событии;
  • jQuery скрывает его здесь, но preventDefault/stopPropagation должны быть написаны по-разному в IE обычно (returnValue/cancelBubble).

однако:

  • у вас есть ссылка, что не ссылка. Это нигде не связано; это действие. <a> на самом деле это не идеальная разметка для этого. Это пойдет не так, если кто-то пытается щелкнуть его посередине, или добавить его в закладки, или любой из других доступных ссылок.
  • для случаев, когда он действительно указывает на что-то, например, когда он открывает/закрывает другой элемент на странице, установите ссылку, чтобы указать на #thatelementsid и используйте ненавязчивый сценарий, чтобы захватить идентификатор элемента из имени ссылки. Вы также можете понюхать location.hash при загрузке документа, чтобы открыть этот элемент, поэтому ссылка становится полезной в других контекстах.
  • в противном случае, для чего-то, что есть чисто действие, было бы лучше отметить его как один: <input type="button"> или <button type="button">. Вы можете стиль его с помощью CSS, чтобы выглядеть как ссылка, а не кнопка если хотите.
  • однако есть некоторые аспекты стиля кнопки, от которых вы не можете избавиться в IE и Firefox. Обычно это не имеет значения, но если вам действительно нужен абсолютный визуальный контроль, компромисс заключается в использовании <span> вместо. Вы можете добавить tabindex свойство, чтобы сделать его клавиатуры доступны в большинстве браузеров, хотя это не так действительно правильно стандартизированы. Вы также можете обнаружить нажатия клавиш, такие как пробел или ввести его для активации. Это своего рода неудовлетворительно, но все же довольно популярно (так, например, это так).
  • другая возможность -<input type="image">. Это имеет преимущества доступности кнопки с полным визуальным контролем, но только для чистых кнопок изображения.

единственное преимущество, которое я могу придумать для использования javascript:void(0) это то, что он будет поддерживаться даже самыми старыми браузерами. Тем не менее, я бы использовал один из других ненавязчивой подходы, которые вы упомянули:

  • для большинства применений, event.preventDefault() и return false можно использовать взаимозаменяемо.
  • event.preventDefault() позволит предотвратить страницу от перегрузки, как хотелось бы, но позволит щелкните событие, чтобы пузырь до родителя. Если вы хотите остановить пузырение, вы можете использовать его в сочетании с event.stopPropagation.
  • return false дополнительно остановит событие от пузырящегося до родителя.

Я говорю "взаимозаменяемо" в первом пункте выше, потому что большую часть времени нам все равно, всплывает ли событие до родителя(ов). Однако, когда do нам нужна тонкая настройка, мы должны рассмотреть пункты два и три.

рассмотрим следующий пример:

<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. Тем не менее, событие все еще 'пузыриться' и вызвать событие click для элемента div В пожар, который будет добавить границу вокруг него. Добавить e.stopPropagation()или простоreturn false и событие щелчка div не будет срабатывать. Вы можете возиться с ним здесь: http://jsfiddle.net/cMKsN/1/

мне нравится использовать href="javascript:void(0)" в ссылке как # подразумевает переход в верхнюю часть страницы, и это может произойти, если по какой-то причине ваше событие jQuery не загружается, например, jQuery не загружается.

Я также использую event.preventDefault(); так как он не будет следовать по ссылке, даже если ошибка встречается перед возвращением false; например:

HTML:

<a id="link" href="http://www.google.com">Test</a>

jQuery Пример 1:

$("#link").click(
    function(){
        alert("Hi");
        invalidCode();
        return false;
    }
);

jQuery Пример 2:

$("#link").click(
    function(event){
        event.preventDefault();
        alert("Hi");
        invalidCode();
        return false;
    }
);

С invalidCode(); выдаст ошибку return false никогда не достигается, и если jQuery Пример 1 используется пользователь будет перенаправлен в Google, тогда как в jQuery Пример 2 он не будет.

Я предпочитаю использовать return false, Так как это дает возможность дать пользователю выбор, следует ли продолжать это действие, например, как показано здесь, в quirksmode:

http://www.quirksmode.org/js/events_early.html#default

это просто, это старый, но он хорошо работает, кросс-браузер, независимо от версии javascript.

event.preventDefault() и return false; одно дело-они инструктируют браузер не обрабатывать действие по умолчанию для события (в этом случае переход к href тега привязки, который был нажат). href=javascript: и его подобие-это что - то еще-они вызывают действие по умолчанию "ничего не делать".

Это вопрос стиля. Вы хотите выполнять всю свою работу в onclick, или вы хотите иметь возможность выполнять действия как в onclick, так и в href и полагаться на возможности браузер для модуляции между ними?

Я думаю, что я видел также javascript:; вокруг, как развивается интернет, трудно отслеживать трюки, которые доступны там.. но это в основном о доступности (кроме код JavaScript:недействительным(0); ) и только небольшая поправка-это не JavaScript:недействительным(0) а код JavaScript:недействительным(0); что означает ничего не делать, так как возвращать false; хотя не уверен, что если JavaScript:возвращение ложным; делает то же самое..

Я всегда использую и предложил бы использовать javascript: void (0); для a по нескольким причинам.. по моему скромному мнению, конечно.

1.) Я использую его из-за того же кого-то упомянутого выше.. href= " # "не подходит, поскольку это может указывать на то, что вы идете наверх, и даже в этом случае "#top " будет более адекватным для этого случая. Но также это может вызвать что-то еще в вашем коде, который использует # (хэши), поэтому еще одна причина заключается в том, чтобы избежать конфликтов с другими javascript, которые могут использовать #. И я склонен искать это при использовании плагина, например, и замените их немедленно.. с href='#' в теге href='код JavaScript:недействительным(0);' и href='javascript с:;'

2.) Если я хочу повторно использовать функцию для группы определенных тегов привязки, я могу вызвать ее с помощью селектора по любому атрибуту, не беспокоясь об обнаружении события click и предотвращении действия по умолчанию, и я делаю это, даже не думая об этом как о предпочтении разработки.

3.) В большинстве случаев, если вы делаете построение ссылок с помощью javascript: void( 0); пытается сделать ссылку на not следуйте как старый href= rel=nofollow, чтобы избежать индексирования ссылок, которые являются действиями. Я не так уверен в этом только потому, что слышал, что искатели и роботы теперь могут читать даже Flash, поэтому не удивлюсь, если они смогут читать ссылки javascript

4.) Ссылаясь на 2.) вы можете нацелиться на класс like и забыть о предотвращении действия по умолчанию click event с помощью href= " javascript: void (0);", а затем нацелить класс непосредственно из селектора в jQuery функция.

        jQuery(function($)
        {
            //from the rel
            $('a[rel="-your-rel-id"]') ... off('click').on('click',function()

            //from the class
            $('a.-the-class') ... off('click').on('click',function()

            //from the id

            $('a#-the-id').off('click').on('click',function()
            {
            --do something with this link
        });

}); 

Я скорее чувствую себя более комфортно, используя этот класс, вы всегда сможете сделать...

$(a#-your-id).hasClass (- yourclass -)

или любая другая интересная комбинация и влияет на многие ссылки.. поэтому я действительно не буду предлагать использовать A только в качестве селектора..

обычно то, что я вижу здесь предлагается это:

  jQuery(function($)
        {
            //from the rel
            $('a[rel="-your-rel-id"]').on('click',function(event)
            //do something
            //prevent the click as is passed to the function as an event
            event.preventDefault();
        });

});

Dreamweaver использует хороший маленький трюк по умолчанию, который я начал использовать.

<a href='javascript:;'></a>

Это маленький, он не спотыкается и якоря, и это библиотека агностик.

Я бы предпочел не ставить JavaScript в href потому что это не то, для чего он предназначен. Я предпочитаю что-то вроде

<a href="#" onclick="return handler();">Link</a>

Comments

    Ничего не найдено.