【问题标题】:Why does adding "return false;" to a submit event prevent the page from refreshing?为什么要添加“return false;”提交事件阻止页面刷新?
【发布时间】:2015-11-15 06:25:28
【问题描述】:

我正在做一个关于使用 Node.js 和 socket.io 制作聊天服务器的教程。这是我在 html 中的内容:

<form id='chat_form'>
  <input id='chat_input' />
  <button>Send</button>
</form>
<script type='text/javascript'>
var socket = io();
$('#chat_form').submit(function(){
  var message = $('#chat_input').val();
  socket.emit('messages', message);
  $('#chat_input').val('');
});
</script>

我不会费心把我拥有的东西放在后端,因为那部分工作正常。但是在浏览器中,每次提交,页面都会刷新,并且在网址栏末尾添加了一个/?

环顾四周,发现另一个教程(socket.io 网站上的那个),代码基本相同,但他们在提交事件的末尾添加了return false;。试过了,效果很好。我想了解为什么会这样。谁能解释一下?另外,您能解释一下为什么将/? 添加到URL 中吗?

【问题讨论】:

  • 返回假;阻止表单的操作,因此它停止提交表单,因为这是表单的操作(它是 this in jquery 的纯 js 版本)。您通常应该在带有 ajax 调用的表单提交上使用它(以阻止页面刷新)。如果您的表单上没有方法,它看起来好像在提交时使用了 get 方法,这就是为什么要添加 ?到 url 并刷新页面 - see this post
  • LOL 我想知道为什么这个问题得到 4 票。这不属于 node.js 标签。我觉得唯一的原因是这个问题很容易回答:P

标签: javascript jquery node.js socket.io


【解决方案1】:

先说说/?

表单提交的默认方法是GET,但是你可以用&lt;form method="POST"&gt;更改它(如果没有提供方法,默认是&lt;form method="GET"&gt;)。

使用POST 表单数据在请求body 中传递,使用GET - 在请求url params 中。

如果你有

<form action="/submit.php" method="GET">
   <input name="foo" value="1" />
   <input name="bar" value="2" />
</form>

然后您提交该表单,您将获得类似 /submit.php?foo=1&amp;bar=2 的 URL。

在您的情况下,您没有带有 name 属性的输入,因此您的 GET 参数是“空的”(/?&lt;params should go there&gt;)。

您可以阅读更多内容: http://www.w3schools.com/tags/att_form_method.asp

关于return false;

提交表单会强制页面重新加载(使用POSTGET 请求)。如果您使用javascript 提交表单,则需要阻止此默认操作。你可以这样做

$('#chat_form').submit(function(event){
    //....
    event.preventDefault();
});

或者return false;

【讨论】:

    【解决方案2】:

    一个简单易懂的答案是

    “返回 false 阻止导航”

    return false 总是在用户或浏览器操作需要被弯腰的情况下使用。

    在每一种编程语言中,return 后的代码都不会被执行,这意味着不会发生进一步的动作,可以是

    停止表单提交

    停止导航和超链接跳转

    除了return false你也可以使用

       event.preventDefault();
    
       event.stopPropagation();
    

    现在关于表单提交

    使用GETPOST 提交表单,这可以由作者使用form tag 中的method="POST" 属性决定,

    当使用 GET 提交默认表单时没有给出任何内容时

    在 url 中传递值 - ex - something.html?para1=value1&para2=value2

    速度快但安全性较低,每次提交表单时,所有表单元素都会在 url 中传递

    【讨论】:

      【解决方案3】:

      来自jQuery submit() 文档:

      现在,当提交表单时,会发出警告消息。这发生在实际提交之前,因此我们可以通过在事件对象上调用 .preventDefault() 或从我们的处理程序中返回 false 来取消提交操作。

      因此,正在阻止submit 事件发生时触发的默认事件行为。

      jQuery 提交函数的默认提交方法是 HTML GET,它以 URL 查询的形式提供表单参数,格式为 /?queryParam=value。因此,/? 出现在 URL 中,在 /? 之后没有查询参数(因为表单中没有提供任何参数)。

      希望这会有所帮助!

      【讨论】:

        【解决方案4】:

        您的表单元素没有方法,因此设置了默认方法 get。如果点击发送,所有输入元素都添加在current page+之后?

        return false 阻止执行提交操作。

        【讨论】:

          【解决方案5】:

          返回 false 会阻止触发 html 元素事件的所有默认函数。

          一个例子是一个 html 表单,一旦你点击提交按钮,它默认是导航到另一个页面。如果您使用 Ajax 函数在不离开页面的情况下将数据发送到服务器,您不希望发生这种情况。

          另一种方法是将事件对象参数传递给事件函数。 然后在函数的开头键入event.preventDefault();。

          以下链接很好地解释了为什么出现尾部斜杠。 https://webmasters.stackexchange.com/questions/35643/is-trailing-slash-automagically-added-on-click-of-home-page-url-in-browser

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-04-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多