我有一个HTML按钮,需要检查多个条件,如果条件通过,则允许执行默认操作。
以下内容在Firefox中有效,但在IE中失败。我在按钮上设置了点击处理程序:
Ext.get('send').on('click', handleSend, this, {
preventDefault: true
});
如果不满足以下条件之一,则会弹出多个消息框之一。如果满足所有条件,则从按钮中删除Click侦听器,然后再次单击按钮:
Ext.get('send').un('click', handleSend, this);
Ext.getDom('send').click();
据我所知,它在IE(可能还有其他浏览器)中失败,因为click()不是DOM元素的标准功能。
如果默认操作是简单的表单提交,我可以在检查通过后执行此操作,但是我们将Tapestry 4与侦听器一起使用,该监听器无法在常规表单提交中执行。
我尝试使用以下方式提交表单
tapestry.form.submit('composeForm', 'doSend');
但是doSend
监听器没有被调用。
有条件地允许使用默认事件是我提出的最佳解决方案,但是可能有两个选择:
[JSFiddle添加
在此jsfiddle中,默认操作是提交表单;如果未选中此复选框,则可以防止此情况。选中后,它将删除处理程序,但是对click()的调用在IE中不起作用。
有没有一种方法可以模拟IE中的点击?
更新
问题中的另一个障碍是,我必须显示“您确定”对话框,因此为了给他们时间回答,必须停止该事件。如果单击“确定”,则需要执行默认操作。 JSFiddle似乎没有像MessageBox这样的ExtJS窗口小部件,因此我不确定如何演示此行为。
在@Ivan的建议下,我尝试了
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表示这样做。
如果满足所有条件,我将从按钮中删除点击监听器然后再次单击按钮:
不要。
您应该检查点击处理程序中的条件,然后像这样调用stopEvent:
Ext.get('send').on('click', handleClick);
function handleClick(e) {
if (condition) {
e.stopEvent();
}
}
Internet Explorer不支持点击。您应该改用fireEvent方法,例如
Ext.getDom('send').fireEvent('onclick');
这应该适用于IE。对于其他浏览器,我想单击即可。无论如何,如果我应该执行类似的任务,我将尝试为挂毯编写适配器并使用挂毯javascript库。
listener
组件上有一个Form
参数;从Tapestry 4 doc:
提交表单时将调用的默认侦听器。调用了仅在未调用另一个侦听器(成功,取消或刷新)的情况下。
将此参数设置为我的侦听器方法,如下所示:
<binding name="listener" value="listener:doSend" />
导致挂毯表格提交
tapestry.form.submit('myFormId');
触发监听器。