console
(() => {
if (Element.prototype.created) {
return;
}
window.addEventListener("created", function (e) {
if (window.$) {
const $e = new window.$.Event(e);
$e.isImmediatePropagationStopped = function () {
return this.target !== this.currentTarget;
}
jQueryBubble(window.$, e.target, $e);
}
}, true);
function jQueryBubble($, elem, event) {
$(elem).triggerHandler(event);
if (elem === document.documentElement) {
jQueryBubble($, document, event);
} else if (elem.parentElement) {
jQueryBubble($, elem.parentElement, event);
}
}
function callback(mutationsList) {
const array = [];
for (let i = 0; i < mutationsList.length; i++) {
const nodes = mutationsList[i].addedNodes;
for (var j = 0; j < nodes.length; j++) {
const node = nodes[j];
if ("tagName" in node) {
array.push(node);
}
}
}
if (array.length > 0) {
oncreated(array);
}
};
window.addEventListener("load", function () {
const observer = new MutationObserver(callback);
observer.observe(document, { childList: true, subtree: true });
oncreated(document.children);
setInterval(() => callback(observer.takeRecords()), 100);
});
function dispatchByCode(elem, event, code) {
try {
new Function("event", code).apply(elem, [event]);
} catch (e) {
console.error(e);
}
}
Element.prototype.created = function () {
const event = new Event('created');
dispatch(this, event);
}
function dispatch(elem, event) {
const eventType = "on" + event.type;
if (!(eventType in elem.__proto__)) {
const code = elem.getAttribute(eventType);
if (code) {
dispatchByCode(elem, event, code);
}
}
elem.dispatchEvent(event);
}
function oncreated(elements, hookeds) {
if (hookeds == null) {
hookeds = new Set();
oncreated(elements, hookeds);
hookeds = Array.from(hookeds);
while (hookeds.length > 0) {
const topN = hookeds.splice(0, 1000);
setTimeout(() => topN.forEach(x => x.created()));
}
}
for (let i = 0; i < elements.length; i++) {
const element = elements[i];
if (isHooking(element)) {
hookeds.add(element);
}
if (element.childElementCount > 0) {
oncreated(element.children, hookeds);
}
}
}
function isHooking(element) {
return true;
}
})();
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="//cdn.staticfile.org/jquery/1.9.1/jquery.js"></script>
<script src="//jsrun.net/nRcKp.js"></script>
</head>
<body>
<form action="" id="from">
<input id="a" type="text" autocomplete="off"> <br />
<input id="b" type="text"> <br />
<input id="c" type="text"> <br />
<input id="d" type="text"> <br />
<input id="e" type="text"> <br />
</form>
<button onclick='document.body.appendChild(document.createElement("input"))'>动态添加元素</button>
<script>
$(document.body).on("created", "*", function (e) {
console.log("$(document).on >> ", `${e.target.tagName}[${e.target.id}]`);
});
</script>
</body>
</html>