Einige Projekte verwenden JS-Vorlagen, aber die Tags in der Vorlage sind HTML-Tags, deren Zeichenfolgen nicht normal ausgeführt werden. Nachdem die Ereignisbindung für die am Anfang der Seite geladenen Tags durchgeführt wurde, werden die sp?ter geladenen Tags nur dann geladen, wenn jQuery dies tut Mir f?llt nichts ein, was ich zum überwachen und Implementieren der Ereignisbindung verwenden k?nnte.
Das Projekt schreibt vor, dass Frameworks wie jQuery und zetpo nicht verwendet werden dürfen, daher m?chte ich wie im Titel fragen.
<p class="p">標(biāo)簽p</p>
<script>
var ps = document.querySelectorAll('.p');
for (var i = 0; i < ps.length; i++) {
ps[i].addEventListener('click', function(){
var that = this;
console.log(that.innerText);
})
}
</script>
<script type="template">
<p class="p">字符串標(biāo)簽p</p>
</script>
歡迎選擇我的課程,讓我們一起見證您的進(jìn)步~~
事件委托吧,一個(gè)最基本的代碼如下!
window.onload = function(){
document.onclick = function(ev){
var ev = ev || window.event;
var target = ev.target || ev.srcElement;
if(target.className.toLowerCase() === 'p'){
console.log(this.innerHTML);
}
}
}
document可以用其它元素代替,但是,代替的元素必須是一開始就存在!不能是頁面加載了再動(dòng)態(tài)加進(jìn)來的!
事件委托是沒錯(cuò),說白了就是利用 DOM 的事件冒泡, @守候你 的答案說明了原理,也解決了基本的問題。但在實(shí)際應(yīng)用中還是會(huì)有一些局限,它只能處理終點(diǎn)擊的那個(gè)元素,而不是處理冒泡過程中遇到的元素。
我寫了一個(gè)冒泡過程中的示例:https://jsfiddle.net/4L7p5drb/1/
const outer = document.getElementById("outer");
/**
* host,已經(jīng)存在的元素,用來綁定代理事件的
* evnetName,事件名稱
* predicate,用來判斷代理事件的目標(biāo)對(duì)象 (el: HtmlElement) => bool 類型
* handler,處理函數(shù),(e: Event) => any 類型,其 this 指向?qū)嶋H目標(biāo)對(duì)象
*/
function proxyListener(host, eventName, predicate, handler) {
host.addEventListener(eventName, e => {
let target = e.target || e.srcElement;
while (target !== host) {
if (predicate(target)) {
handler.call(target, e);
// 這里沒有 break 主要是考慮一多層都擁有可判斷為 true 的對(duì)象呢
// 可以根據(jù)實(shí)際需要加 break;
}
target = target.parentNode || target.parentElement;
}
});
}
proxyListener(outer, "click",
t => t.classList.contains("middle"),
function(e) {
console.log("hit", this);
});