2017-06-06 35 views
0

我想知道什麼是最好的天然JS實踐一個jQuery委派事件處理程序是這樣的:什麼是推薦的本地JavaScript等同於jQuery委託事件?

$('body').on('click','.my-class', event => { 
    // perform action 
}); 

事件代表團這樣可以讓你添加點擊事件動態添加HTMLElements因爲你是聽着都點擊bodydocument

現在我正在做這樣的事情,感覺有點混亂,有時如果用戶點擊svg就會中斷。此外,當您想要在相當長的HTMLElement.classList(例如'.my-main-class.my-temp-class')中定位多個班級時,這變得很困難。

document.body.addEventListener('click', event => { 
    if (event.target.classList.contains('my-class')) { 
    // perform action 
    } 
}); 

即使是我可以導入的NPM dom幫助程序庫,我們將不勝感激。

回答

1

這是一個演示JavaScript函數來檢查是否元素有多個類使用class屬性而不是classList

document.body.addEventListener('click', function(e){ 
 

 
    console.log('Does element have classes my-class and svg - ' + e.target.hasClasses('my-class svg')); 
 
    
 
    console.log('Does element have class my-class - ' + e.target.hasClasses('my-class')); 
 
    
 
}); 
 
     
 
Element.prototype.hasClasses = function(classes) { 
 
    // get element classses string 
 
    var elementClass = this.getAttribute('class'); 
 
    
 
    // return false if class is not set at all 
 
    if(elementClass == null) return false; 
 
    
 
    // check if this class is found in elementClass string 
 
    return classes.split(' ').reduce(function(acc, current){ 
 
     return Boolean(acc && ~elementClass.indexOf(current)); 
 
    }, true); 
 
    
 
};
<button class="my-class">I have my-class</button> 
 
<br/> 
 
<p class="not-valid some-other">I have not-valid and some-other classes</p> 
 
<br/> 
 
<svg width="100" height="100" style="background-color:blue;" class="my-class svg"> 
 
    <circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" class="circle class"/> 
 
</svg>

照顧與SVG。嘗試單擊藍色背景並在圓圈內部查看區別

+0

'元素'的不錯的擴展。將測試這一點。 – etoxin

+0

謝謝,我希望它對你有用,但要注意''他們很棘手:) – codtex

1

一種方式做到這一點:

編輯:更新後處理動態地添加元素

// Handle clicks 
 
function clickHandler(event) 
 
{ 
 
    console.log(event.target.id); 
 
} 
 
// Handle dynamic element changes 
 
function domchangeHandler(mutations) 
 
{ 
 
    console.log("changed"); 
 
    var eList=document.getElementsByClassName('my-class'); 
 
    for (var i = 0; i < eList.length; i++) { 
 
    eList[i].addEventListener('click',clickHandler); 
 
    } 
 
} 
 

 
// Create new MutationObserver 
 
var observer = new MutationObserver(domchangeHandler); 
 
var config = { attributes: true, childList: true }; 
 
observer.observe(document.body, config); 
 

 

 
// Add dynamic elements 
 
for (var i=1;i<4;i++){ 
 
    var button=document.createElement('button'); 
 
    button.id="div"+i; 
 
    button.className="my-class class-"+i; 
 
    button.innerText="Click me, I'm Button "+i; 
 
    document.body.appendChild(button); 
 
} 
 

 
var div= document.createElement('div'); 
 
div.innerHTML='<svg id="svg1" width="100" height="100" style="background-color:blue;" class="my-class svg"><g><circle id="circle" cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" class="circle class"/></g></svg>' 
 
document.body.appendChild(div);

+0

這不會處理動態添加的「HTMLElements」。我會更新我的問題,以便更清楚。 – etoxin

+0

好@etoxin,你的問題現在更清楚了。在這種情況下,你需要你已經擁有的東西。或者每次更新DOM時重新註冊您的事件。要麼跟蹤你的自我,要麼使用「雜亂」的突變觀察者API https://developer.mozilla.org/en/docs/Web/API/MutationObserver – visibleman

+0

當我在StackOverflow上運行此代碼時(通過單擊「運行代碼片段「),它的作品。但是,當我嘗試將其放入自己的計算機網頁中時,即使使用相同的瀏覽器也無法正常工作。有沒有我需要加載的JavaScript庫? –

相關問題