我在让e.preventDefault();
工作时遇到了麻烦。
这是我的代码
$('#ListSnapshot a').live('click', function(e){
var url = $(this).attr('href') +' #WebPartWPQ2 .ms-listviewtable';
$('#ListSnapshot').load(url);
e.preventDefault();
});
有人可以解释我做错了什么,我可以看到加载功能有效但页面会重定向到我需要阻止的点击链接。
我也尝试将e.preventDefault();
移到功能的顶部,但无济于事。
答案 0 :(得分:26)
我遇到了类似的问题,其中e.preventDefault()
会对某些情况起作用,但对其他情况则不起作用。它没有显示错误,使用try-catch
未显示catch alert
。
添加e.stopImmediatePropagation()
可以解决问题,万一它可以帮助任何人(非常感谢wcpro)
答案 1 :(得分:8)
我认为你可能有以下场景......至少,这会重现错误
你可能有一个为悬停事件设置的事件更高,该事件可能正在使用bind,即使你调用e.preventdefault它仍然会先调用bind,所以你可能需要更高一个使用live而不是bind。然后它应该按预期工作。检查这个样本。
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();
});
答案 2 :(得分:6)
您提供的代码肯定应该正常运行(working example)。你的代码还有另一个问题。
尝试在事件处理程序中放置一个警报,以确保它在所有中触发。您的#ListSnapshot a
可能找不到任何内容。
如果处理程序中出现其他错误,则会导致异常,这可能会阻止javascript一直执行preventDefault
调用。我没有看到你提供的代码中有什么内容,等等。
答案 3 :(得分:3)
我认为@David Hedlund的回答是正确的,必定会发生异常。当我编写事件处理程序时,我使用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();
。
答案 4 :(得分:3)
您是否尝试首先在$(document).ready(...)中包装事件处理程序?只是一个想法。
答案 5 :(得分:2)
尝试返回false
。 live
并不总是与bind
的工作方式相同。检查jquery docs。
答案 6 :(得分:2)
e.preventDefault()应该在处理程序中的其他代码行之前执行。
$('#ListSnapshot a').live('click', function(e){
e.preventDefault();
var url = $(this).attr('href') +' #WebPartWPQ2 .ms-listviewtable';
$('#ListSnapshot').load(url);
});
答案 7 :(得分:0)
旧问题,但这只是那种时刻应该看到firebug在控制台中记录什么或返回错误。您的代码中的某些内容显然会阻止preventDefault()阻止重定向。