使用表单验证:为什么 onsubmit="return functionname()" 而不是 onsubmit="functionname()"?

IT技术 javascript dom-events
2021-03-05 07:02:01

这个问题是不言自明的。我不明白返回在以下代码中的作用:

<form onsubmit="return somefunction()">
6个回答

您需要返回,以便将 true/false 传递给表单的提交事件(该事件会查找此信息并在为 false 时阻止提交)。

让我们看看一些标准的 JS:

function testReturn() { return false; }

如果您只是在任何其他代码(无论是 onclick 处理程序还是在其他地方的 JS 中)调用它,它将返回 false,但您需要对该值执行某些操作。

...
testReturn()
...

在那个例子中,返回值回来了,但没有发生任何事情。你基本上是说执行这个函数,我不在乎它返回什么。相反,如果你这样做:

...
var wasSuccessful = testReturn();
...

那么你已经对返回值做了一些事情。

这同样适用于 onclick 处理程序。如果您只是在 onsubmit 中调用该函数而没有返回,那么您是在说“执行此操作,但如果它返回 false,则不要阻止该事件”。这是在提交表单时执行此代码的一种方式,但不要让它停止事件。

添加返回值后,您就是说您正在调用的内容应确定事件(提交)是否应继续。

此逻辑适用于 HTML 中的许多 onXXXX 事件(onclick、onsubmit、onfocus 等)。

我修复了一个错误,然后搜索了该错误并找到了这个。;) 好答案顺便说一句。
2021-04-24 07:02:01

GenericTypeTea 所说的扩展 - 这是一个具体的例子:

<form onsubmit="return false">

上述表格不会提交,而...

<form onsubmit="false">

...什么都不做,即表单将提交

没有return,onsubmit不会接收值,并且事件的执行就像根本没有任何处理程序一样。

false从函数返回将停止事件继续。即它将停止表单提交。

IE

function someFunction()
{
    if (allow) // For example, checking that a field isn't empty
    {
       return true; // Allow the form to submit
    }
    else
    {
       return false; // Stop the form submitting
    }
}
为了放大 GenericTypeTea 的出色解释,将 onsubmit 视为 Javascript 变量,将引号中的内容视为 Javascript 函数。因此,“someFunction()”和“return somefunction()”都会导致 someFunction() 被执行,但是“someFunction()”会导致 someFunction() 的返回值被丢弃,而“return someFunction()”会分配返回值到 onsubmit 变量。这完全是由于 Javacript 的松散性质,允许您以任何方式定义函数,因此解释器必须接受您所做的任何事情......
2021-04-26 07:02:01
@zjmiller - 因为return表示应该将表达式的值返回给提交例程。如果表达式的计算结果为 false,则取消提交例程。
2021-04-29 07:02:01
例如,函数 test() {return "asdf"}; 警报(测试());触发读取“asdf”的警报,但我不必说 alert(return test());
2021-05-04 07:02:01
但是为什么如果我们只有 onSubmit="someFunction()" 函数不会返回 false 呢?
2021-05-13 07:02:01

当 onsubmit(或任何其他事件)作为HTML 属性提供时,当为元素创建 DOM 对象时,属性(例如"return validate();"的字符串值作为实际onsubmit 处理程序函数主体注入

这是浏览器控制台中的简要证明:

var p = document.createElement('p');
p.innerHTML = '<form onsubmit="return validate(); // my statement"></form>';
var form = p.childNodes[0];

console.log(typeof form.onsubmit);
// => function

console.log(form.onsubmit.toString());
// => function onsubmit(event) {
//      return validate(); // my statement
//    }

因此,如果return在注入的语句中提供关键字;当提交处理程序被触发时,从validate函数调用接收到的返回值将作为提交处理程序的返回值传递,从而对控制表单的提交行为起作用。

如果没有return在字符串中提供,则生成的onsubmit处理程序将没有显式的 return 语句,并且在触发时它将返回undefined(默认函数返回值),无论是否在这两种情况下都将validate()返回truefalse提交表单。

感谢您对幕后实际发生的事情的有用描述(和证据!) - 这确实通过有助于理解的解释来回答问题。
2021-04-16 07:02:01
是的……这就是我想读的;onsubmit实际上是一个函数体,就像{...}一个函数,而不是一个属性。
2021-04-29 07:02:01

HTML 事件处理程序代码的行为类似于 JavaScript 函数的主体。许多语言(如 C 或 Perl)隐式返回函数体中最后一个表达式的值。JavaScript 不会,它会丢弃它并返回 undefined ,除非您编写显式returnEXPR

这是一个有效的答案......第一句话解释了这一切。
2021-04-25 07:02:01