我有一个HTML按钮需要检查几个条件,如果它们通过则允许默认操作发生。
以下适用于Firefox,但在IE中失败。我在按钮上设置了一个点击处理程序:
Ext.get('send').on('click', handleSend, this, {
preventDefault: true
});
如果不满足其中一个条件,会弹出几个消息框中的一个。如果满足所有条件,我会从按钮中删除单击侦听器,然后再次单击该按钮:
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所说的。
答案 0 :(得分:1)
如果满足所有条件,我会从按钮中删除点击监听器 然后再次单击该按钮:
别。
你应该检查点击处理程序中的条件并在那里调用stopEvent:
Ext.get('send').on('click', handleClick);
function handleClick(e) {
if (condition) {
e.stopEvent();
}
}
答案 1 :(得分:0)
Internet Explorer不支持点击。你应该使用fireEvent方法,例如。
Ext.getDom('send').fireEvent('onclick');
这应该适用于IE。对于其他浏览器,我猜单击是可以的。无论如何如果我应该做类似的任务,我会尝试为tapestry编写一个适配器并使用tapestry javascript库。
答案 2 :(得分:0)
listener
组件上有Form
个参数;来自Tapestry 4 doc:
提交表单时要调用的默认侦听器。调用 只有在没有调用另一个监听器(成功,取消或刷新)的情况下。
将此参数设置为我的侦听器方法,如下所示:
<binding name="listener" value="listener:doSend" />
导致Tapestry表单提交
tapestry.form.submit('myFormId');
触发听众。