簡體   English   中英

JavaScript事件處理程序范圍和此

[英]JavaScript event handler scope and this

如果我想動態地向HTML元素添加事件處理程序,而不是丟棄或破壞任何現有的事件處理程序。

下面的代碼不會這樣做,因為如果現有的處理程序在指向'this'的元素上注冊了一個事件,那么我的處理程序鏈會中斷該操作。 實際上,如果可能的話,我實際上也希望能夠在新處理程序中使用“ this”,但是我想我總是可以解決這個問題。

<script type="text/javascript">

    function oldHandler()
    {
         alert("old handler; this.value=" +this.value);
    }

</script>

<form name="test1" id="test1">

    <fieldset>
        <legend>My Test</legend>
        <ol>
            <p>
            <li>
                <label for="tf1">Test Field 1</label>
                <input id="tf1" onchange="existingHandler();" name="tf1"/>
            </li>
        </ol>
    </fieldset>

</form>

<script type="text/javascript">

    function myAddHandler(element, event, newHandler)
    {
        var existingHandler = element[event];
        element[event] = function() {
                            newHandler();
                            existingHandler();
                         }
    }

    function myOnChangeHandler()
    {
        alert("new handler; this.value=" +this.value);
    }

    myAddHandler(document.getElementById('tf1'), "onchange", myOnChangeHandler);

</script>

謝謝。

你想要做什么或者是注入的價值this

element[event] = function () {
  old.apply(this, arguments);
  new.apply(this, arguments);
};

或使用不會互相覆蓋的真實事件監聽器

element.addEventListener(event, new);

為了將“ this”指向正確的對象,我在事件處理程序的頂部執行以下操作:

var that = e.target || e.srcElement; 

“ that”現在指向觸發事件的對象

讓您的生活更輕松。 通過使用JavaScript框架附加和分離事件。 例如在jQuery $("#someID").bind("click", clickHandler); 或者,如果您不想使用jQuery,則還有很多其他JavaScript框架:MooTools,Dojo等。

查看http://api.jquery.com/category/events 當然,您可以使用舊式JavaScript執行此操作,但是您需要管理附加/分離事件的所有跨瀏覽器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM