86

以下は機能しません...(少なくともFirefoxでは:document.getElementById('linkid').click()機能ではありません)

<script type="text/javascript">
    function doOnClick() {
        document.getElementById('linkid').click();
        //Should alert('/testlocation');
    }
</script>
<a id="linkid" href="/testlocation" onclick="alert(this.href);">Testlink</a>
4

9 に答える 9

116

applyその要素のコンテキストでイベントハンドラーを実行する必要があります。

var elem = document.getElementById("linkid");
if (typeof elem.onclick == "function") {
    elem.onclick.apply(elem);
}

それ以外の場合thisは、上記のコードが実行されるコンテキストを参照します。

于 2009-05-25T12:35:12.567 に答える
15

イベントをトリガーするには、基本的にその要素のイベント ハンドラーを呼び出すだけです。コードからのわずかな変更。

var a = document.getElementById("element");
var evnt = a["onclick"];

if (typeof(evnt) == "function") {
    evnt.call(a);
}
于 2009-05-25T12:21:46.090 に答える
6
$("#linkid").trigger("click");
于 2015-11-21T18:59:11.063 に答える
1

handleEvent メソッドを見て
ください https://developer.mozilla.org/en-US/docs/Web/API/EventListener

「生の」Javascript:

function MyObj() {
   this.abc = "ABC";
}
MyObj.prototype.handleEvent = function(e) {
   console.log("caught event: "+e.type);
   console.log(this.abc);
}

var myObj = new MyObj();

document.querySelector("#myElement").addEventListener('click', myObj);

要素 (id "myElement") をクリックすると、コンソールに次のように表示されます。

キャッチされたイベント:
ABCをクリックします

これにより、オブジェクト メソッドをイベント ハンドラーとして持つことができ、そのメソッド内のすべてのオブジェクト プロパティにアクセスできます。

オブジェクトのメソッドを addEventListener に直接渡すだけで (そのように: ) 、オブジェクトに対して通常どおりに呼び出されたかのように動作することを期待することはできません。addEventListener に渡された関数は、参照されるのではなく何らかの形でコピーされていると推測しています。たとえば、イベント リスナー関数の参照を (変数の形式で) addEventListener に渡し、この参照を設定解除すると、イベントがキャッチされたときにイベント リスナーが引き続き実行されます。element.addEventListener('click',myObj.myMethod);myMethod

メソッドをイベント リスナーとして渡し、 thisまだイベント リスナー内のオブジェクト プロパティにアクセスできる別の (あまり洗練されていない) 回避策は、次のようになります。

// see above for definition of MyObj

var myObj = new MyObj();

document.querySelector("#myElement").addEventListener('click', myObj.handleEvent.bind(myObj));
于 2016-01-22T17:30:54.220 に答える
0

これを純粋に onclick 属性で関数を参照するために使用している場合、これは非常に悪い考えのように思えます。インライン イベントは、一般的に悪い考えです。

次のことをお勧めします。

function addEvent(elm, evType, fn, useCapture) {
    if (elm.addEventListener) {
        elm.addEventListener(evType, fn, useCapture);
        return true;
    }
    else if (elm.attachEvent) {
        var r = elm.attachEvent('on' + evType, fn);
        return r;
    }
    else {
        elm['on' + evType] = fn;
    }
}

handler = function(){
   showHref(el);
}

showHref = function(el) {
   alert(el.href);
}

var el = document.getElementById('linkid');

addEvent(el, 'click', handler);

他の JavaScript コードから同じ関数を呼び出したい場合、クリックをシミュレートして関数を呼び出すことは最善の方法ではありません。検討:

function doOnClick() {
   showHref(document.getElementById('linkid'));
}
于 2009-05-25T12:33:08.967 に答える
-1

一般に、イベント ハンドラーを「手動で」呼び出すことはお勧めしません。

  • 複数のリスナーが登録されているため、何が実行されるのか不明
  • 再帰的で無限のイベント ループに陥る危険があります (クリック A がクリック B をトリガーし、クリック A がトリガーされるなど)。
  • DOM への冗長な更新
  • ユーザーによるビューの実際の変更と、初期化コードとして行われた変更 (一度だけ実行する必要があります) を区別するのは困難です。

正確に何をしたいのかを把握し、それを関数に入れて手動で呼び出し、イベントリスナーとして登録することをお勧めします。

于 2013-09-13T09:59:53.413 に答える