為什麼動態產生的物件無法觸發 JQuery click 事件!?

前言

最近臨時被公司抓回去寫著C# .NET的專案,只能把源碼掃描丟在一邊了

然後在撰寫著Menu功能時遇上了今天的這個問題

覺得蠻有趣的就記錄下來了

本文

現在直接來看下範例,大家就能了解我說的問題了

<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script> 
<span id="static" class="test">靜態</span>
</br>
</br>
<div id="div"></div>

<script>
$('.test').on('click', function () {
	var clickID = $(this).attr('id');
    alert('點擊的元素ID是:' + clickID);
})

var d = $('#div');
var span = document.createElement('span');
span.id = 'dynamic';
span.className = 'test';
span.textContent = '動態';

d.append(span);
</script>

可以看到有一個簡單的.on click事件,若是元素class為test ,點擊就會alert它的ID

另外寫了個動態產生的span,也有一樣的class

但這時候神奇的事情發生了,點擊「靜態」都沒問題,但「動態」卻完全沒反應!!

左思右想,都覺得這件事怎麼會發生!?

後來得出的結論大概是,在「$(‘.test’).on(‘click’, function ()…」這一段的時候

JQuery會去檢查頁面上所有element並確認帶有class為test的元素

可能透過ID,或是XPath等方式記錄下來

並在點擊時就可以進行判斷,這樣就解釋得通為什麼後面產生的元素沒辦法觸發了

解決方法

其實也很簡單,先將物件動態產生後再來寫JQuery的全域 on click事件

或是直接用JS的click就可以直接綁在特定的元素上面了

像是這樣 :

var span = document.createElement('span');
span.id = 'dynamic';
span.className = 'test';
span.textContent = '動態';
span.onclick = function () {
    console.log('動態 <span> 元素被點擊了');
};

結論

這個真的是一個大坑!! 原來JQuery的事件是在定義.on click那時候巡查頁面元素並綁定的

不過想想也算合理的,就是一個初始化的感覺~

🧡幫我點一個小小的廣告或留言,都是對我的支持(來個人陪我聊聊天也好!!)

⭐如有任何疑問,歡迎透過留言或messenger讓我知道 !

工程師的秘密筆記

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *