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();
в начало функции, но безрезультатно.
Ответы
Ответ 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().