【问题标题】:JavaScript Cross-Browser Click on a HTML DOM ElementJavaScript 跨浏览器单击 HTML DOM 元素
【发布时间】:2011-07-27 01:56:38
【问题描述】:

是否有可用的原生 JavaScript 跨浏览器功能,能够触发 HTML DOM 元素(包括 div 等非表单元素)上的点击事件?

【问题讨论】:

标签: javascript html onclick click


【解决方案1】:

大多数走这条路的人要么最终开发自己的事件管理系统(这并不难,但很烦人),要么在可用功能范围内工作。

如果所有浏览器都支持一个模型,(比如 W3C 事件模型),生活会很美好。但他们没有。不仅如此,一些浏览器拒绝以与“真实”事件相同的方式响应编程事件。例如在 Firefox 中的链接上使用 displatchEvent 分派点击事件不会导致浏览器跟随该链接(但会触发 onclick 监听器,如果有的话)。大多数其他浏览器都会跟随该链接。

IE 不支持 dispatchEvent 直到版本 8(也许 9 支持),它有 fireEvent 类似但不同。

HTML5(这还不是一个标准,也许永远不会)为HTMLElement interface 引入了一个click 方法,但是它还没有完全实现并且不能被依赖。它可能用于您知道或可以控制将使用该页面的浏览器版本的环境。

如果侦听器已分配给属性或内联,您也可以只调用元素的 onclick 属性,但这当然不像真正的事件。

Useful post on dispatchEvent on clj.

【讨论】:

    【解决方案2】:
    var target = document;//<--(insert your target here);
    if(document.createEvent){
      var clickEvent = document.createEvent("MouseEvents");
      clickEvent.initMouseEvent("click", true, true, window, 
        0, 0, 0, 0, 0, false, false, false, 0, null);
      target.dispatchEvent(clickEvent);
    }
    else{
      target.fireEvent("onclick");
    }
    

    取自the MDC event.initMouseEvent referencethis SO question

    jsFiddle,您可以在不同的浏览器上进行测试。

    【讨论】:

    • jsfiddle 的东西在 firefox 7 或 8 中不起作用,或者在 firefox 7 + 8 中不起作用,它给出以下错误:错误:未捕获的异常:[异常...“没有足够的参数”nsresult: “0x80570001(NS_ERROR_XPC_NOT_ENOUGH_ARGS)”位置:“JS frame :: fiddle.jshell.net/bSzqH/1/show :: dispatchClick :: line 22”数据:no]在Opera中,它给出以下错误:未捕获的异常:错误:WRONG_ARGUMENTS_ERR
    【解决方案3】:

    在 Mozilla 文档中发现了这个难以捉摸的功能:https://developer.mozilla.org/En/DOM/Document.createEvent,在这里也是:http://javascript.gakaa.com/document-createevent-4-0-5-.aspx

    function performClick(node) {
        var evt = document.createEvent("MouseEvents");
        evt.initEvent("mousedown", true, true);
        document.getElementById("myElement").dispatchEvent(evt);
    }
    

    【讨论】:

    • @Samuel - 不是每个人都拥有最新的浏览器(很少有典型用户拥有)。 IE dispatchEvent,如果 HTML5 被广泛采用,那么您可以期望 HTMLElement click 方法为首选。但是目前使用的浏览器太多不支持它,无法在一般网络上使用。此外,浏览器对编程事件的响应可能与它们对用户发起的事件的响应方式不同。
    【解决方案4】:

    给定:

    <input type="button" id="myButton" onclick="alert('hello world');"/>
    

    以下将调用 hello world 提示:

    document.getElementById("myButton").click();
    

    【讨论】:

    • 使用 element.onclick() 在比 element.click() 更多的浏览器中工作 - 如果您为元素分配 onclick 函数,则适用于非表单元素。
    • @kennebec - 但简单地调用 onclick 不会调度事件,所以它不是一回事。它也不会调用使用 addEventListener 添加的事件。
    猜你喜欢
    • 2011-08-03
    • 2013-01-02
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2010-11-14
    • 1970-01-01
    • 2014-03-26
    相关资源
    最近更新 更多