preventDefault不适用于Firefox

Tom*_*ash 19 javascript jquery cross-browser

我试图阻止A HREF实际打开链接,但是要执行脚本.我让脚本部分工作,但似乎Firefox会忽略这个:

$("#permalink a").click(function(id){
  $("#newPost").fadeToggle;
  event.preventDefault();
  var id = this.getAttribute('href');
  $("#newPostContent").load(id);
  $("#newPost").show("fast");
});
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议跨浏览器脚本来防止默认设置?

cle*_*tus 29

对此的标准解决方案是return false来自click()处理程序.return false相当于召唤preventDefault()stopPropagation()事件.preventDefault()对于这项任务来说也是足够的,无论是它还是return false将会起作用.

您的问题似乎是语法错误和错误命名的参数.我知道了:

  • fadeToggle 没有括号;
  • 函数参数被调用id但你调用event.preventDefault(); 和
  • 你正在淡化帖子,然后立即显示它?这将排队两个动画,但没有多大意义.你可能想把这两件事情和load()理性的方式联系在一起.

所以这应该工作:

$("#permalink a").click(function(event) {
  $("#newPost").fadeToggle();
  var id = this.getAttribute('href');
  $("#newPostContent").load(id);
  $("#newPost").show("fast");
  return false;
});
Run Code Online (Sandbox Code Playgroud)

您可以在此实例中自由替换return false,event.preventDefault()但传播click()事件可能会或可能会导致其他问题,具体取决于您拥有的其他事件处理程序.

  • 这不是问题所在.问题是.click(function(id){应该是.click(function(event){. (11认同)
  • "但无论如何,阻止链接导航最好通过单击事件处理程序返回false来完成." - 实际上,它不是 - 如果你需要事件正确传播,那就搞砸了.这是一种*lazier*方式,需要更少的代码,但preventDefault确实完成了所需的操作(没有默认操作),仅此而已. (3认同)
  • 因为karim79和ijw所说的.谢谢karim79 !! 我有.click(function(){event.preventDefault();}); 它在chrome中完美运行但在firefox中失败了.将其更改为.click(function(event){event.preventDefault();}); 两者都很完美.任何人来到这里盲目地接受这个建议应该是这样的:http://fuelyourcoding.com/jquery-events-stop-misusing-return-false/ (2认同)

小智 20

这总是有效的:Firefox需要"事件处理程序",而Chrome则不需要.所以这适用于所有浏览器:

$('#id_obj').click(function(event) {   
     event.preventDefault(event);  
}
Run Code Online (Sandbox Code Playgroud)

  • event.preventDefault(event)应该是event.preventDefault() - jquery引用或dom引用都不建议preventDefault方法接受参数.前者可能无关紧要,因为它是最终被解雇的dom事件. (2认同)

ijw*_*ijw 14

            $("#permalink a").click(function(id){
Run Code Online (Sandbox Code Playgroud)

应该

            $("#permalink a").click(function(event){
Run Code Online (Sandbox Code Playgroud)

然后

var id=event.target;
Run Code Online (Sandbox Code Playgroud)

将为您提供正在处理的对象,event.preventDefault()将停止默认操作.

通常我会返回false; 我自己,但这都会阻止默认操作停止事件的传播,这可能会产生您对其他事件处理程序没有预料到的影响.