'undefined'不是评估Safari中el.click()的函数

时间:2012-10-05 10:22:05

标签: javascript

我想按Enter键运行js功能。 在IE,Chrome和Opera中,一切都很好用,但我在Safari中收到了错误(如下所述)。

我需要纯Javascript 解决方案,不是jQuery

这是功能

function pressSearch(e) {
    if (typeof e == 'undefined' && window.event) {
        e = window.event;
    }
    var charCode = (e.which) ? e.which : 
                   ((e.charCode) ? e.charCode : 
                   ((e.keyCode) ? e.keyCode : 0));
    if (charCode == 13) {
        document.getElementById('enterSearch').click();
    }
}

这是 HTML

<input type="text" id="searchKey" onkeypress="pressSearch(event)">
<div id="enterSearch">Search</div> // This is the "button"

我收到错误

// Safari
TypeError: 'undefined' is not a function 
    (evaluating 'getElementById('enterSearch').click()')

我做错了什么?

编辑:我修复了Mozilla Firefox错误。

5 个答案:

答案 0 :(得分:18)

如果您查看HTML DOM Level 2 Specificationclick()函数仅定义为HTMLInputElement,因此虽然用户不太友好,但Safari并不需要实现它。

触发现代浏览器事件的正确方法是DOM Level 3 Events

// First create an event
var click_ev = document.createEvent("MouseEvents");
// initialize the event
click_ev.initEvent("click", true /* bubble */, true /* cancelable */);
// trigger the event
document.getElementById("someElement").dispatchEvent(click_ev);

这是适用于Chrome,Safari,Firefox和IE9的jsfiddle:http://jsfiddle.net/y5yW9/6/

答案 1 :(得分:3)

Safari将.click()视为未定义,因为Safari不存在.click()(我把它拿回来; .click()正在为我工​​作。我不喜欢我不知道:/)我在a similar problem工作时遇到了同样的问题。经过一些研究之后,我想出了以下内容,以便在safari(以及其他浏览器)中触发点击事件:

var t = document.getElementById('someidhere');
if (document.dispatchEvent) {
    var o = document.createEvent('MouseEvents');
    o.initMouseEvent('click', true, true, window, 1, 1, 1, 1, 1, false, false, false, false, 0, t);
    t.dispatchEvent(o)
} else if (document.fireEvent) {
    t.fireEvent('onclick');
} else if (t.click()) {
    t.click()
}

我不知道这是否适用于你的firefox方面,鉴于根据@Dennis,你的代码已经适用于firefox。如果没有真正考验这个环境,我会在黑暗中拍摄。我希望它适合你。

答案 2 :(得分:2)

您正在触发div上没有隐式点击处理程序的点击事件。

答案 3 :(得分:1)

div元素默认情况下没有定义任何点击事件处理程序。因此,首先需要为enterSearch div应用click事件,例如<div id="enterSearch" onclick="submitSearch()">Search</div>。否则按钮本身将无法点击。

要以编程方式执行事件,请使用以下构造:

function pressSearch(e) {
    if (typeof e == 'undefined' && window.event) {
        e = window.event;
    }

    var charCode = (e.which) ? e.which : ((e.charCode) ? e.charCode : ((e.keyCode) ? e.keyCode : 0));
    if (charCode == 13) {
        var a = document.getElementById('enterSearch');

        if (typeof a.onclick == "function") {
            a.onclick.apply(a); // binds the scope of onclick to a
        }
    }
}

我无法对IE进行验证,但它适用于Safari。

答案 4 :(得分:0)

getElementById('enterSearch')

应为document.getElementById('enterSearch')