如何在事件处理程序中触发元素的默认事件?

时间:2011-10-21 17:52:50

标签: javascript javascript-events extjs tapestry extjs3

我有一个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监听器未被调用。

有条件地允许默认事件是我提出的最佳解决方案,但有几种选择可能:

  1. 是否有其他方法可以在Javascript中触发Tapestry 4侦听器?
  2. 有没有办法识别我的Tapestry页面中的正常表单提交,从而触发听众?
  3. 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所说的。

3 个答案:

答案 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');

触发听众。