【问题标题】:Firefox return false; (preventDefault();) and window.location.reload(); together火狐返回假; (preventDefault();) 和 window.location.reload();一起
【发布时间】:2014-12-14 13:02:00
【问题描述】:

我认为这是一个非常愚蠢的问题,但经过数小时的谷歌搜索 - 我没有任何想法或解决方案。 关键是在我的网站上处理“点击”事件后我需要重新加载页面。在 chrome\opera 中,它可以正常工作。但是在Firefox中我有一些错误。我的带有 cmets 的 JS 代码:

$('#project_create').click(function() {
  var projectname = $("#project_name").val();
  var projectdescription = $("#project_description").val();
  $.post("projects/add_project.php", {
    project_name: projectname,
    project_description: projectdescription
  });
  $("#create_project_form").hide("slow");
  $("#project_list").show("slow");
  //return false; - if it uncomment, all work, but next page reloader doesn't work.
  window.location.reload(); //but if it's work, FireFox doesn't send $.post-query
});

我需要工作台方法,因为点击后 - 脚本放入 $_SESSION['my_var'] 一些变量,并且该变量仅在重新加载页面后可用。也许还有其他方法可以做到这一点?据我了解,Firefox 和 preventDefault();

的功能存在问题

谢谢!

【问题讨论】:

    标签: javascript php jquery firefox


    【解决方案1】:

    问题只是您在执行 ajax 请求之前重新加载页面。

    尝试在 ajax 成功回调处理程序中重新加载页面:

    $.post("projects/add_project.php", {
       project_name: projectname,
       project_description: projectdescription
    }, function(){
       window.location.reload();
    });
    

    并删除您的旧window.location.reload()

    【讨论】:

    • 可能要强调的是,如果浏览器离开页面,挂起的请求会被取消,并且可能无法到达服务器。 :D
    • 为什么不在window.location.reload()后面加一个return = false;
    【解决方案2】:

    当您执行return 时,该行之后的代码将不再被访问并被视为“死代码”。 不能简单地将代码放在return 之后。

    另一个是使用return false 来阻止默认默认操作时存在问题。它可以防止委托/冒泡。挂在 DOM 树上的事件处理程序(尤其是挂在 on() 上的事件处理程序)不会被执行。如果委托很重要,请不要使用它。

    如果您的目标是阻止链接的默认操作并在 JS 中执行某些操作,请改用 event.preventDefaultevent 对象作为处理程序中的第一个参数传入。

    $('#project_create').click(function(event) {
      event.preventDefault();
    
      // rest of the code
    });
    

    【讨论】:

    • 正确的方式,谢谢。但有些问题:如果评论 window.location.reload(); - 一切都好,但我需要重新加载。当重新加载工作时 - $.post 永远不会执行(不写入数据库或其他操作)
    • 谢谢! Freez 通过重新加载来更新您的解决方案! :) 好)
    【解决方案3】:

    除了其他答案的建议之外,您还可以使用setTimeout 异步执行location.reload 方法:

    setTimeout(function() { location.reload(); }, 1);
    return false;
    

    编辑: 当然,运行异步 AJAX 请求并在之后立即重新加载页面的整个想法是有缺陷的,因为 AJAX 请求可能尚未完成您重新加载页面的时间。

    因此,您应该按照接受的答案的建议使用回调。或者,您可以使用同步 AJAX 请求,但这会在请求完成之前冻结执行,这通常是不可取的。

    【讨论】:

    • 谢谢!但是延迟不是正确的方法,因为在不同的时间我们有不同的 ping :(
    • 最好使用回调,在这种情况下使用任意 setTimeout 并不稳定。无论如何,1毫秒太短了:)
    • 怎么不稳定?它所做的只是乱序执行location.reload 方法。除了preventDefault() 解决方案的可移植性较差(参见stackoverflow.com/a/4479267/657401)之外,这与建议的preventDefault() 解决方案几乎没有区别。
    • @Witiko 好吧,我可能误解了setTimeout 在这种情况下的兴趣,我还是不明白。对不起。
    • 代码在一毫秒后执行location.reload()(一毫秒位是在尽力而为的基础上)。这使您可以return false 并仍然让location.reload() 执行。但是,是的,回调是更清洁的解决方案,我添加它只是为了完整性。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 2014-05-18
    • 1970-01-01
    • 2011-08-02
    • 2013-10-30
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多