jQuery предотвращение дефолта () не работает - PullRequest
27 голосов
/ 10 апреля 2011

У меня есть следующий код:

$(document).ready(function(){

    $("div.subtab_left li.notebook a").click(function(event) {
    event.preventDefault();
    return false;   
    });

});

, но когда я щелкаю элемент ..., это не мешает действию по умолчанию .. Почему?

и при изменении кода на:

$(document).ready(function(){

    $("div.subtab_left li.notebook a").click(function() {
    e.preventDefault();
    alert("asdasdad");
    return false;   
    });

});

останавливает действие по умолчанию, но не предупреждает .. Я не смог найти ответа на документацию jQuery.

Полный код выглядит так:

$(document).ready(function(){

$('#tabs div.tab').hide();
$('#tabs div.tab:first').show();
$('#tabs ul li:first').addClass('active');

$('#tabs ul li a').click(function(){
$('#tabs ul li').removeClass('active');
$(this).parent().addClass('active');
var currentTab = $(this).attr('href');
$('#tabs div.tab').hide();
$(currentTab).show();
return false;
});

    $("div.subtab_left li.notebook a").click(function(e) {
    e.preventDefault();
    e.stopPropagation();
    e.stopImmediatePropagation();

    alert("asdasdad");
    return false;

    });

});

и структура HTML:

<div id="tabs">
<ul id="nav">
<li><a id="tab1" href="#tab-1"></a></li>
<li><a id="tab2" href="#tab-2"></a></li>
<li><a id="tab3" href="#tab-3"></a></li>
<li><a id="tab4" href="#tab-4"></a></li>
</ul>

<div class="tab" id="tab-1">
        <script type="text/javascript">$(document).ready(function(){$("ul.produse li").hover(function () {
        $("ul.produse li").removeClass('active');$(this).addClass('active');}, function () {$(this).removeClass('active');});});
    </script>

    <div class="subtab_left"> 
        <ul>
            <li class="notebook"><a href="#">1</a></li>
            <li class="netbook"><a href="#">2</a></li>      
            <li class="allinone"><a href="#">2</a></li> 
            <li class="desktop"><a href="#">2</a></li> 
            <li class="procesoare"><a href="#">2</a></li> 
            <li class="placi_video"><a href="#">2</a></li>    
            <li class="hdd_desktop"><a href="#">2</a></li>
            <li class="tv_plasma"><a href="#">2</a></li>
            <li class="tv_lcd"><a href="#">2</a></li>
            <li class="telefoane_mobile last_item"><a href="#">2</a></li>
        </ul>
    </div>

Ответы [ 6 ]

49 голосов
/ 10 апреля 2011

Обновление

И есть ваша проблема - вам делать нужно щелкнуть обработчики событий для некоторых a элементов.В этом случае порядок, в котором вы прикрепляете обработчики, имеет значение, так как они будут запущены в этом порядке.

Вот рабочая скрипка , которая показывает желаемое поведение.

Это должен быть ваш код:

$(document).ready(function(){


    $('#tabs div.tab').hide();
    $('#tabs div.tab:first').show();
    $('#tabs ul li:first').addClass('active');

    $("div.subtab_left li.notebook a").click(function(e) {
        e.stopImmediatePropagation();
        alert("asdasdad");
        return false;
    });

    $('#tabs ul li a').click(function(){
        alert("Handling link click");
        $('#tabs ul li').removeClass('active');
        $(this).parent().addClass('active');
        var currentTab = $(this).attr('href');
        $('#tabs div.tab').hide();
        $(currentTab).show();
        return false;
    });

});

Обратите внимание, что порядок подключения обработчиков был изменен, и e.stopImmediatePropagation() используется для остановки запуска другого обработчика щелчков, в то время как return false используется для остановкистандартное поведение перехода по ссылке (а также прекращение всплытия события. Вы можете обнаружить, что вам нужно использовать только e.stopPropagation).

Поэкспериментируйте с этим, если вы удалите e.stopImmediatePropagation()вы обнаружите, что оповещение обработчика второго клика сработает после первого оповещения.Удаление return false не повлияет на это поведение, но приведет к тому, что браузер будет переходить по ссылкам.

Примечание

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


  1. Iне понимаю, почему ваш первый фрагмент кода не будет работать.Какое действие по умолчанию вы видите, что хотите остановить?

    Если вы подключили к ссылке другие обработчики событий, вам следует рассмотреть event.stopPropagation() и event.stopImmediatePropagation().Обратите внимание, что return false эквивалентно вызову event.preventDefault и event.stopPropagation() ref

  2. В вашемвторой фрагмент кода, e не определен.Таким образом, ошибка будет выдана в e.preventDefault(), и следующие строки никогда не будут выполнены.Другими словами

    $("div.subtab_left li.notebook a").click(function() {
        e.preventDefault();
        alert("asdasdad");
        return false;   
    });
    

    должно быть

    //note the e declared in the function parameters now
    $("div.subtab_left li.notebook a").click(function(e) {
        e.preventDefault();
        alert("asdasdad");
        return false;   
    });
    

Вот рабочий пример , показывающий, что этот код действительно работает и что return false на самом деле не требуется, если вы хотите остановить только следующую ссылку.

6 голосов
/ 10 апреля 2011

Попробуйте это:

   $("div.subtab_left li.notebook a").click(function(e) {
    e.preventDefault();
    return false;   
    });
2 голосов
/ 10 апреля 2011

Попробуйте это:

$("div.subtab_left li.notebook a").click(function(e) {
    e.preventDefault();
});
1 голос
/ 20 декабря 2013

У меня просто были те же проблемы - я тестировал много разных вещей. но это просто не сработает. затем я снова проверил учебные примеры на jQuery.com и выяснил:

ваш скрипт jQuery должен быть после элементов, на которые вы ссылаетесь!

поэтому ваш скрипт должен быть после html-кода, к которому вы хотите получить доступ!

похоже, что jQuery не может получить к нему доступ в противном случае.

1 голос
/ 08 июня 2013

Если вы уже тестировали с действием отправки, вы заметили, что это тоже не работает.

Причина в том, что форма уже опубликована в $(document).read(...

Итак, все, что вам нужно сделать, это изменить на $(document).load(...

Теперь, когда браузер загрузит страницу, он выполнит.

И будет работать; D

0 голосов
/ 25 октября 2016

Если e.preventDefault(); не работает, вы должны использовать e.stopImmediatePropagation();.

Для получения дополнительной информации взгляните на: В чем разница между event.stopPropagation и event.preventDefault?

$("div.subtab_left li.notebook a").click(function(e) {
    e.stopImmediatePropagation();
});
...