我有一个带有jsId =“saveParamButtonWidget”的Dojo SubmitButton。我通过put:
覆盖了它的onClick方法saveParamButtonWidget.onClick = editParam
我定义了editParam()函数,如下所示:
function editParam(eventObj) {
dojo.stopEvent(eventObj);
// ...
}
dojo.stopEvent()应该停止事件冒泡和默认处理。但是,浏览器仍会提交表单。我也试过以下内容:
function editParam(eventObj) {
eventObj.stopPropagation();
eventObj.preventDefault();
// ...
}
同样的事情。我设法阻止表单提交的唯一方法是从事件处理程序返回“false”:
function editParam(eventObj) {
// ...
return false;
}
有人可以告诉我为什么前两种方法不起作用?感谢。
答案 0 :(得分:23)
好的,经过深思熟虑后,我相信我可以肯定地回答你的问题。
dojo.stopEvent()
不起作用的原因,return false
确实起作用,完全是由于dijit.form.Button
的编码方式。如果你有兴趣,现在是时候进行一次实地考察了。保持你的安全帽。
点击dijit.form.Button
时
_onButtonClick
方法。 (这是在模板中连接到特殊ondijitclick
事件,它不仅捕获鼠标点击,而且还捕获某些按键,用于11个目的。)_onButtonClick
方法首先调用_onClick
方法,假定按钮未被禁用(在这种情况下不是),调用并返回的结果onClick
方法。这是特别令人感兴趣的,因为它是你要覆盖的方法!_onButtonClick
,如果_onClick
正确 false
返回(例如,如果您的onClick
处理程序返回false
), _onButtonClick
立即退出。 这就是为什么返回false会使您的代码按预期工作。但是如果没有拯救那么会发生什么?让我们进一步追踪...... _onButtonClick
检查此按钮不是是否是实际HTML表单的后代,但 是具有{{1}的窗口小部件的后代方法(鸭子打字)。我假设在你的情况下 在真正的形式(_onSubmit
计数)内,所以我们将跳过这个。 (我的印象是这段代码路径实际上不会最终提交,而你的代码路径显然会提交。)dijit.form.Form
(确实如此),则调用此节点的valueNode
方法。不幸的是,这会在您表单下的一个不可见的click
节点上生成一个全新的事件对象,因此您尝试告诉原始事件的任何内容都将变得无关紧要,并且表单继续提交! 这就是为什么input type="submit"
不起作用的原因 - dojo.stopEvent
中的这段代码完全没有注意到它。 我把它作为一个有限的概念证明(确保打开firebug /等来获取日志):http://jsfiddle.net/Bf5H8/
也许这应该被记录为一个错误,但我想最初的想法可能是支持着名的dijit.form.Button
机制就足够了。
所有这一切都说,很有可能覆盖表单的提交更符合你的兴趣而不是覆盖按钮的onClick(如S.Jones建议的那样),但至少这应该解决这个谜。
答案 1 :(得分:2)
有趣的问题。 1
我相信您必须使用dojo.connect
将您的函数连接到DOM事件,以便使用事件对象访问这些方法。
请参阅:The Event Object (DojoTollkit.org Reference Guide)
事件对象
将函数连接到DOM时 dojo.connect事件, Dojo将您的函数传递给规范化 事件对象。这意味着, 无论客户的浏览器如何, 你可以指望一套标准 关于事件和集合的属性 操纵事件的方法。
假设你的功能已经存在 由dojo.connect调用并获取 名为 event 的参数,如:
dojo.connect(dojo.byId("node"), "onclick", function(event){ // the var 'event' is available, and is the normalized object });
...
Dojo使用事件对象规范化以下方法:
- event.preventDefault - 阻止事件的默认行为(例如,加载新页面的链接)
- event.stopPropagation - 阻止事件触发父节点的事件
此外,dojo.stopEvent(事件) 将防止任何默认行为 任何传播(鼓泡)的 事件
也就是说,在提交之前放置一个类似下面的函数来执行某些逻辑,是一个相当干净,易于理解的功能。可持续的方法。
<script type="dojo/method" event="onSubmit">
if (!this.validate()) { // or whatever else you'd like to evaluate
// insert calls here...
return false;
}
return true;
<script>
干杯。
答案 2 :(得分:2)
我在使用dojo.stopEvent
时遇到了同样的问题这个问题解决了这样的表单提交问题 - 这里是一个用于通过dojo连接的简单表单:
this.formId = dojo.byId("formId");
dojo.connect(this.formId, 'onsubmit', function(evt) {
var val_main = validate_this_form(0);
if(val_main == false)
dojo.stopEvent(evt);
});