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

E.preventdefault(); не работает

У меня возникают проблемы с работой e.preventDefault();.

Вот мой код

$('#ListSnapshot a').live('click', function(e){
    var url = $(this).attr('href') +' #WebPartWPQ2 .ms-listviewtable';
    $('#ListSnapshot').load(url);
    e.preventDefault();
});

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

Я также попытался переместить e.preventDefault(); в начало функции, но безрезультатно.

4b9b3361

Ответ 1

У меня была аналогичная проблема, в которой e.preventDefault() работал бы в некоторых случаях, но не на других. Он не обнаружил ошибок, и использование try-catch не отображало catch alert. Добавление e.stopImmediatePropagation() сделало трюк, если это кому-то поможет (большое спасибо wcpro)

Ответ 2

Я думаю, у вас может быть следующее scenerio... по крайней мере, это воспроизведет ошибку

у вас может быть событие выше, которое настроено для события hover, это событие может использовать bind, и даже если вы вызовете e.preventdefault, он все равно вызовет связывание, поэтому вам может потребоваться сделать более высокий up вместо live. то он должен работать, как ожидалось. проверьте этот образец.

http://jsfiddle.net/rodmjay/mnkq3/

$('div').bind ('click', function(){ // <-- switch this to live and you will see different behavior

    alert('div click');

});

$('a').live('click', function(e){


    alert('a click');

    e.stopImmediatePropagation();


});

Ответ 3

Код, который вы предоставили, должен определенно работать (рабочий пример). Там будет другая проблема с вашим кодом.

Попробуйте помещать предупреждение внутри вашего обработчика событий, чтобы убедиться, что он вообще срабатывает. Возможно, ваш #ListSnapshot a ничего не нашел.

Если что-то не так внутри вашего обработчика, это вызывает исключение, которое может помешать javascript полностью выполнить вызов preventDefault. Я не вижу, что может быть в коде, который вы предоставили, tho.

Ответ 4

Я думаю, что ответ Давида Хедлунда верен, должно произойти исключение. Когда я пишу обработчики событий, я использую блок try...catch, чтобы убедиться, что действие по умолчанию не выполняется. Попробуйте следующее:

$('#ListSnapshot a').live('click', function(e){
    try {
        var url = $(this).attr('href') +' #WebPartWPQ2 .ms-listviewtable';
        $('#ListSnapshot').load(url);
    } catch(ex) {
        alert('An error occurred and I need to write some code to handle this!');
    }
    e.preventDefault();
});

Таким образом, поскольку e.preventDefault(); находится вне блока try, даже если возникает ошибка, e.preventDefault(); все равно будет вызываться.

Ответ 5

Пробовали ли вы сначала обработать обработчик событий в $(document).ready(...)? Просто мысль.

Ответ 6

Попробуйте вернуть false. live не всегда работает так же, как работает bind. проверить jquery docs.

Ответ 7

e.preventDefault() должен выполняться перед другими строками кода в обработчике.

$('#ListSnapshot a').live('click', function(e){
    e.preventDefault();
    var url = $(this).attr('href') +' #WebPartWPQ2 .ms-listviewtable';
    $('#ListSnapshot').load(url);
});

Ответ 8

Старый вопрос, но это всего лишь момент, когда нужно увидеть, какие журналы firebug в консоли или возвращаются как ошибка. Что-то в вашем коде, очевидно, предотвращает предотвращение перенаправления preventDefault().