我有一个HTML按钮,需要检查几个条件,如果他们通过允许默认操作发生。如何在事件处理程序中触发元素的默认事件?
以下在Firefox中工作,但在IE中失败。我在按钮上设置了一个点击处理器:
Ext.get('send').on('click', handleSend, this, {
preventDefault: true
});
如果其中一个条件未满足,弹出几个消息框之一。如果所有条件都满足,我从按钮删除点击收听,然后再次单击该按钮:
Ext.get('send').un('click', handleSend, this);
Ext.getDom('send').click();
据我所知,在IE(以及可能的其他浏览器)失败,因为点击()”不是个一个DOM元素的标准函数。
如果默认操作是一个简单的表单提交,我可以在检查通过后执行该操作,但我们将Tapestry 4与一个侦听器一起使用,该操作不会在正常表单提交时执行。
我试着
tapestry.form.submit('composeForm', 'doSend');
提交表单,但doSend
听众是没有得到调用。
有条件允许默认事件是最好的解决方案,我想出来的,但也有几个选项可能:
- 有一些其他的方式来引起挂毯4监听器从JavaScript内部被解雇?
- 有什么办法来识别我的Tapestry页面中的正常表单提交,从而触发监听器?
JSFiddle加入
在这种jsfiddle,默认动作是提交表单;当复选框未被选中时,这被阻止。选中时会删除处理程序,但对click()的调用在IE中不起作用。
有没有一种方法来模拟IE中的点击?
更新
在问题的另一个障碍是,我要显示一个“你确定”对话框,所以为了给他们时间来回答,事件必须停止。如果他们单击确定,则需要执行默认操作。 JSFiddle似乎没有像MessageBox这样的ExtJS小部件,所以我不知道如何演示这种行为。
在@伊万的建议,我想
Ext.getDom('send').fireEvent('onclick');
但它返回false,表示该事件正在某处取消。然后,我尝试
var evt = document.createEvent("Event");
evt.initEvent('click', false, false);
var cancelled = Ext.getDom('send').fireEvent('onclick', evt);
但IE9说document.createEvent不存在的,即使这是怎么MSDN说,做到这一点。
有没有办法看到一些演示页面? – Ivan
添加了JSFiddle链接。 –