我想知道对于各种HTML元素的默认操作是否存在已定义的标准。我查看了W3C's HTML specification,虽然他们非常精确地知道哪些属性可以与元素一起使用(以及一些行为内容,例如表单提交中包含的内容)但是元素的行为却没有。我还查看了Mozilla JS reference,但也没有找到任何内容。
特别是我正在寻找表单提交按钮的默认行为;我在不同的地方看到它的默认操作是提交表单,或者它的默认操作不是提交表单而是获得焦点。因此,似乎没有就提交按钮的onclick="return false;"
是否会停止提交表单达成共识。
(为了清晰起见编辑 - 我不是要尝试在提交的onclick
或类似的内容上进行任何表单级验证;如果是的话,我将使用表单onsubmit
代替我真的特别感兴趣的是抓住按钮上的点击,并且在这种情况下可能没有提交表单。这可能最终要求按钮的onclick
设置表格onsubmit
检查的状态,但是如果我可以return false
那么那就太好了。即使没有,那么onsubmit
和onclick
处理程序被解雇的顺序也是至关重要的(即按钮在运行之前调度提交点击处理程序?)我再也没见过指定的任何地方。)
虽然只是编写一个测试代码,但我宁愿依赖于规范/记录的行为,而不是琐碎的测试结果,毫无疑问,如果它们存在,它们将会遗漏任何细微之处。特别是,我上周进行了快速测试,似乎显示它没有停止表单提交,但今天运行一个显示它 。当你与他们的元素交互时,我没有找到任何关于什么浏览器实际做的权威资源(例如,默认操作是什么,提交按钮的onclick处理程序是在之前还是之后触发)表格提交调度等。)
欢迎任何关于在这种情况下看哪里的建议。
答案 0 :(得分:1)
相关文件为DOM3 Events和HTML 5 specification。
他们可能没有您需要的所有信息,但应该。因此,如果您发现它们缺乏,请request those behaviors to be specified。
答案 1 :(得分:0)
您可能很难找到相关规范的一个原因是您正在查看多种行为。
设置onclick="return false;"
会使提交按钮无法提交表单,但不会阻止提交表单。如果在表单中的字段具有焦点时按Enter键,则可以在不涉及提交按钮的情况下提交表单本身。 (我不知道确切的细节,从一个浏览器到另一个浏览器可能会有所不同,但你看到了这个原则。)
答案 2 :(得分:0)
针对该特定场景,您可能希望尝试不同的事件属性,因为浏览器的行为不同,onlick用于按钮,onsubmit是一个表单事件,所以当然,如果你为onclick返回false,那么并不意味着on submit不会生效,你应该单独处理onsubmit,或者将提交委托给提交按钮(通过返回false onsubmit,让onclick处理程序有form.submit),也可以尝试使用多个提交按钮了解它是如何工作的
我知道你可能已经知道了这一点,但我在处理表单时提到了一些其他提示,试验了event.cancelBubble = true,并且event.returnValue = false(IE特定,不确定firefox),有时会返回false不够好......
至于文档,MSDN库记录了所有事件的默认操作,这里是提交的文档: http://msdn.microsoft.com/en-us/library/ms535249(VS.85).aspx#
有趣的是:提交方法可以 不要调用onsubmit事件处理程序。
这很棒,否则就会无限循环!
这是onlcick的文档 http://msdn.microsoft.com/en-us/library/ms536913(VS.85).aspx
MSDN库也会记录所有事件和对象,但需要付出代价,所有IE都是特定的!
答案 3 :(得分:0)
是的,您可以设置一个按钮 - 带有一个监听器,当单击该按钮时,您可以停止提交表单。提交表单是表单中类型提交(重要)的“ 按钮 ”的默认行为。
事件方法,preventDefault(或窗口事件的returnValue = false,取决于浏览器遵循的事件模型),将阻止该默认的提交行为。我也停止传播(MSIE evt.mode = cancelBubble)。
例如,对于以下“提交”类型的按钮:
<button type="submit" id="logout" name="logout" value="Log Out">Log Out</button>
为该特定按钮添加x-browser事件侦听器。例如,假设testlogout是控制单击按钮时发生的事情的函数名称,可能会使用以下内容来设置监听器:
var logoutBtn = (document.getElementById && document.getElementById('logout')) ||
(document.all && document.all['logout']) || document.forms[formname].elements['logout'] || null;
if (logoutBtn) {
if (logoutBtn.addEventListener) {
logoutBtn.addEventListener('click',testlogout,false);
} else if (window.attachEvent) {
logoutBtn.attachEvent('onclick',testlogout);
} else {
//legacy:
logoutBtn.onclick = testlogout;
//...logic for document.layers support, etc.
}
}
然后在testlogout函数中,将自动传递事件,您将测试任何条件。根据您设置的条件,使用event.preventDefault或returnValue,具体取决于浏览器支持的内容。这些取代了内联' return false '。例如:
function testlogout(e)
{
e = e || window.event;
//... your logic here...
e.stopPropagation?e. stopPropagation():(e.cancelBubble?e.cancelBubble():"");
e.preventDefault?e.preventDefault():e.returnValue=false;
return false; // in case all else fails?
}
传递的事件当然有自己的一组属性,其名称也会有所不同,具体取决于浏览器遵循的模型。例如,这些属性将标识单击的目标按钮。
当前事件监听模型不注意' return false '。 “ return false ”命令将被置若罔闻,可以这么说。但不用担心,只要你使用他们理解的东西。
希望有助于解决目前的潜在问题。阅读DOM事件和事件模型将阐明可用的方法和属性。
答案 4 :(得分:0)
为什么要使用“提交”按钮?为什么不只是使用一个按钮? <input type="button" onclick="function(){if(allCriteriaIsMet()) this.form.submit()}" value="click me"/>
或者我错过了什么?