web-dev-qa-db-ja.com

JavaScript:コントロールにメソッドでそれ自体を送信させる方法

<a href="" id="someId" onclick="SomeMethod(self);"></a>

SomeMethodが持つことができる場所:

function SomeMethod(item)
{
  item.setAttribute('name', item.id);
}

の代わりに:

function SomeMethod(itemId)
{
  var someItem;

  someItem = document.getElementById(itemId);
  someItem .setAttribute('name', someItem .id);

}

ばかげた例ですが、アイデアはID自体ではなく、メソッドを呼び出す実際のコントロールで送信することです。私はこれができると誓いますが、何を検索するのかさえわからないので部分的に検索できませんでした...

自分は自分だと思ったのですが、自分が持っているスクリプトを実行すると、自分は自分が望んでいるようには見えません。

26
Programmin Tool

thisキーワードを使用します。

<a href="" id="someId" onclick="SomeMethod(this);"></a>
39

アクセスできるクリックイベントオブジェクトがあるので、実際には関数に引数としてthisを渡す必要はありません。そう:

<a href="" id="someId" onclick="clickEventHandler()"></a>
<script>
function clickEventHandler(event) {

    if (!event) {
        event = window.event; // Older versions of IE use 
                              // a global reference 
                              // and not an argument.
    };

    var el = (event.target || event.srcElement); // DOM uses 'target';
                                                 // older versions of 
                                                 // IE use 'srcElement'
    el.setAttribute('name', el.id);

}
</script>
11
James Tikalsky

私はこの属性をHTML属性からのすべての関数呼び出しで使用する傾向があります:

onclick="SomeMethod.call(this)"

次に、JavaScriptで次のようにします:-

function SomeMethod()
{
   this.setAttribute('name', this.id);
}

これは、JavaScriptコードでイベントハンドラープロパティに直接割り当てることもできる場合に、明確な利点があります。

document.getElementById("someID").onclick = SomeMethod

SomeMethodがコンテキスト要素をパラメーターとして受け取った場合、設定が非常に面倒です。

function(id) {
   var elem = document.getElementById(id)
   elem.onclick = function() { SomeMethod(elem); }
}("someID");

さらに悪いことに、これはメモリリークのクロージャになります。

5
AnthonyWJones

この時点で:SomeMethod(this)-thisはウィンドウオブジェクトを返すため、使用しないでください。 thisキーワードを使用する正しい方法は、それをコンテキスト関連にすることなので、SomeMethod.call(this)を使用します。

0
Elnur Shabanov