????????????????????????????????????????????????????e??????????????顣capture??target??bubble????????????????
???????????????????????????????? capture ??????????????????????????y?????
?????????????£??????????????????????????????????????????????????????????????????????????á?
????????? Demo ??????????????????е?????????????????Щ?????ж??????????????

 

<button onclick="console.log('xss')">CLICK ME</button>
<script>
document.addEventListener('click'?? function(e) {
console.log('bubble');
});
document.addEventListener('click'?? function(e) {
var element = e.target;
var code = element.getAttribute('onclick');
if (/xss/.test(code)) {
e.stopImmediatePropagation();
console.log('??????????:'?? code);
}
}?? true);
</script>
Run

??????????????????????????????????????????xss???????????????????????????????????????????????????С???????????????ж??????????????????????????????????
????????????????????????????????ɡ?
?????????????????λ??и?С????????????e??????????????????????????????????????????????????????? e.stopImmediatePropagation() ???? element.onclick = null ???????
??????????????????? onclick?????????????????????????????????????????????????????????????????????????????????????????????????????г?????????????????????????????????????г?????
?????????????????? document ??????????????????????????? document.onxxx ????????????????????????? document ?????????????е????????
<img src="*" onerror="console.log('xss')" />

 

<script>
function hookEvent(onevent) {
document.addEventListener(onevent.substr(2)?? function(e) {
var element = e.target;
if (element.nodeType != Node.ELEMENT_NODE) {
return;
}
var code = element.getAttribute(onevent);
if (code && /xss/.test(code)) {
element[onevent] = null;
console.log('??????????:'?? code);
}
}?? true);
}
console.time('???');
for (var k in document) {
if (/^on/.test(k)) {
//console.log('???:'?? k);
hookEvent(k);
}
}
console.timeEnd('???');
</script>
Run

????????????????????????????????????????????????????????????????????????