3 回答

TA貢獻1830條經驗 獲得超9個贊
沒有本機 javascript api 允許您查找使用添加的事件偵聽器eventTarget.addEventListener
。
您仍然可以使用onclick
屬性添加事件,無論該屬性是使用 javascript 設置的還是通過 html 內聯的 - 在這種情況下,您沒有獲得事件偵聽器,但是您獲得了onclick
屬性的值,這是兩個不同的東西。
Javascript 沒有為此提供 api,因為 dom 元素可以在事件偵聽器仍然引用它們時被刪除。
如果你想跟蹤附加到 dom 元素的事件監聽器,你必須自己做。
除了 chrome 具有getEventListeners
與 dom 元素一起使用的命令行 api 之外,但它是一個開發人員工具命令行 api,因此它僅在從開發人員工具調用時才有效。

TA貢獻1844條經驗 獲得超8個贊
沒有辦法,直接用 JavaScript 來做。
但是,您可以使用這種方法并在將事件綁定到元素時添加屬性。
document.getElementById('test2').addEventListener('keypress', function() {
this.setAttribute("event", "yes");
console.log("foo");
}
)
document.querySelectorAll('test3').forEach(item => {
item.addEventListener('click', event => {
this.setAttribute("event", "yes");
console.log("bar");
})
})
document.getElementById('test4').onclick = function(event) {
let target = event.target;
this.setAttribute("event", "yes");
if (target.tagName != 'li') {
event.target.addClass('highlight');
}
};
這就是您如何找到具有事件綁定到它們的元素:
var eventElements = document.querySelectorAll("[event='yes']");
var countEventElements = eventElements.length;

TA貢獻1802條經驗 獲得超5個贊
您可以擴展EventTarget.addEventListener
,以便您添加的任何元素然后在其自己的標記中的HTML5 自定義 data-* 屬性EventListener
中聲明該元素。EventListener
聲明后,自定義屬性將如下所示:
data-eventlisteners="['mouseover:showButton','mouseout:fadeButton','click:animateButton']"
一旦一個或多個元素具有此類自定義屬性,您就可以通過 JavaScript 查詢這些元素。
例如
document.querySelectorAll('[data-eventlisteners]')
將顯示頁面上的哪些元素已EventListeners
附加document.querySelectorAll('[data-eventlisteners*=","]')
將顯示頁面上的哪些元素EventListener
附加了多個document.querySelectorAll('[data-eventlisteners*="mouseover:"]')
將顯示頁面上的哪些元素有mouseover
EventListener
附加的document.querySelectorAll('[data-eventlisteners*="click:"][data-eventlisteners*="mouseout:"]')
將顯示頁面上的哪些元素同時具有 aclick
和amouseout
EventListener
附加
等等
工作示例:
const declareEventListeners = () => {
EventTarget.prototype._addEventListener = EventTarget.prototype.addEventListener;
EventTarget.prototype.addEventListener = function(eventType, eventFunction, eventOptions) {
// REINSTATE ORIGINAL FUNCTIONALITY FOR addEventListener() METHOD
let _eventOptions = (eventOptions === undefined) ? false : eventOptions;
this._addEventListener(eventType, eventFunction, _eventOptions);
// THEN, IF EVENTTARGET IS NOT WINDOW OR DOCUMENT
if (this.nodeType === 1) {
let eventAction = eventFunction.name || 'anonymousFunction';
let eventListenerLabel = `${eventType}:${eventAction}`;
let eventListenerLabelsArray = (this.dataset.eventlisteners) ? JSON.parse(this.dataset.eventlisteners.replaceAll( "'", '"')) : [];
eventListenerLabelsArray.push(eventListenerLabel);
let eventListenerLabelsString = JSON.stringify(eventListenerLabelsArray).replaceAll('"', "'");
this.dataset.eventlisteners = eventListenerLabelsString;
}
}
};
const clickMe = (e) => {
e.target.classList.toggle('circle');
}
const mouseoverMe = (e) => {
e.target.style.setProperty('background-color', 'rgb(255, 127, 0)');
}
const mouseoutMe = (e) => {
e.target.removeAttribute('style');
}
const logMarkup = () => {
console.log(document.querySelector('section').innerHTML);
}
declareEventListeners();
document.querySelector('.div1').addEventListener('click', clickMe, false);
document.querySelector('.div2').addEventListener('mouseover', mouseoverMe, false);
document.querySelector('.div2').addEventListener('mouseout', mouseoutMe, false);
logMarkup();
.div1,
.div2 {
float: left;
width: 100px;
height: 100px;
line-height: 50px;
margin-right: 12px;
text-align: center;
color: rgb(255, 255, 255);
background-color: rgb(255, 0, 0);
}
.div1 {
line-height: 100px;
cursor: pointer;
}
.div1.circle {
border-radius: 50%;
}
<section>
<div class="div1">click</div>
<div class="div2">mouseover<br />mouseout</div>
</section>
您將在上面的示例中看到:
.div1
顯示自己有一個EventListener
監聽click
并觸發函數的函數clickMe()
.div2
顯示自己有兩個EventListeners
偵聽mouseover
和mouseout
,分別觸發功能mouseoverMe()
和mouseoutMe()
添加回答
舉報