8

Enterボタンを押してjs関数を実行したいと思います。IE、Chrome、Opera ではすべて問題なく動作しますが、Safari ではエラー (以下で説明) が発生します。

jQuery ではなく、純粋な Javascriptソリューションが必要です。

これは機能です:

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 エラーを修正しました。

4

5 に答える 5

18

HTML DOM Level 2 Specificationを見ると、click()関数は に対してのみ定義されて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/

于 2012-10-06T23:22:48.943 に答える
2

div暗黙的なクリック ハンドラーを持たない でクリック イベントをトリガーしています。

于 2012-10-06T22:25:56.250 に答える
2

同様の問題に取り組んでいるときに、この同じ問題に遭遇しました。私が思いついたのは、サファリ(もちろん他のブラウザも)でクリックイベントをトリガーするための次のとおりです。

var t = document.getElementById('someidhere');
if (document.dispatchEvent) {
    var e = new MouseEvent('click', {
        view: window,    // Window associated with the event
        bubbles: true,
        cancelable: true
    });
    t.dispatchEvent(e);
} else if (document.fireEvent) {
    t.fireEvent('onclick');
} else if (t.click) {
    t.click();
}

@Dennis によると、あなたのコードは既に Firefox で動作しますが、このコードはバージョン 79.0 (テストされたバージョン) 以降の Firefox でも動作するはずです。

initEvent()非推奨になっていることに注意してください。ただし、Event コンストラクターを使用してイベントを作成する新しい方法は、Internet Explorer では機能しません。

于 2012-10-06T22:51:54.277 に答える
1

div要素には、デフォルトで定義されたクリック イベント ハンドラはありません。そのため、最初に enterSearch div のクリック イベントを適用する必要があります<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 では動作します。

于 2012-10-06T22:51:37.513 に答える
0

getElementById('enterSearch')

する必要がありますdocument.getElementById('enterSearch')

于 2012-10-05T10:28:29.787 に答える