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

问题描述 投票:1回答:3

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

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

  1. 是否有其他方法可以从Javascript内部触发Tapestry 4监听器?
  2. 有什么方法可以识别我的Tapestry页面中提交的常规表单,从而触发侦听器?

[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表示这样做。

javascript extjs dom-events extjs3 tapestry
3个回答
1
投票

如果满足所有条件,我将从按钮中删除点击监听器然后再次单击按钮:

不要。

您应该检查点击处理程序中的条件,然后像这样调用stopEvent:

Ext.get('send').on('click', handleClick);

function handleClick(e) {
    if (condition) {
        e.stopEvent();
    }
}

0
投票

Internet Explorer不支持点击。您应该改用fireEvent方法,例如

Ext.getDom('send').fireEvent('onclick');

这应该适用于IE。对于其他浏览器,我想单击即可。无论如何,如果我应该执行类似的任务,我将尝试为挂毯编写适配器并使用挂毯javascript库。


0
投票

listener组件上有一个Form参数;从Tapestry 4 doc

提交表单时将调用的默认侦听器。调用了仅在未调用另一个侦听器(成功,取消或刷新)的情况下。

将此参数设置为我的侦听器方法,如下所示:

<binding name="listener" value="listener:doSend" />

导致挂毯表格提交

tapestry.form.submit('myFormId');

触发监听器。

© www.soinside.com 2019 - 2024. All rights reserved.