В качестве альтернативы вы можете вызвать событие исходного объекта с помощью dispatchEvent()
.Но обратите внимание, что если функция использует ссылку this
, она будет ссылаться на оригинальный элемент, к которому прикреплено событие.То же самое верно, если используется параметр event
(function(event){}
).
document.getElementById("test").addEventListener("change", function() {
console.log("test");
console.log("triggered element id: " + this.id);
});
document.getElementById("manual").addEventListener("click", function() {
document.getElementById("test").dispatchEvent(new Event('change'));
});
<input id="test">
<button id="manual">manual</button>
Другой альтернативой является перезапись стандартной функции addEventListener()
, чтобы она сохраняла ссылку на данную функцию.Это пример этого.Вероятно, вы хотите сохранить ссылку другим способом, но в качестве примера вам это не мешало.
Необходимо только убедиться, что функция перезаписана перед созданием элемента.
//Store the orignal addEventListener() function under a new name so we can still use it.
Node.prototype.originalAddEventListener = Node.prototype.addEventListener;
//Create a variable where we store the handler for the #test1 element
var test1Handler;
//overwrite the orignal function with our own so it will store a reference to the #test1 event handler in the variable
Node.prototype.addEventListener = function(e, fn){
if(this.id === 'test1') {
test1Handler = fn;
}
this.originalAddEventListener(e, fn);
}
//Attach event with the overwritten function, lets say this is done by an extarnal libary.
document.getElementById('test1').addEventListener('change', function(){
console.log("Changing element id: " + this.id);
});
//When the button is clicked the change handler of test1 is copied to test2.
document.getElementById('exec').addEventListener('click', function(){
document.getElementById('test2').addEventListener('change', test1Handler);
});
<label for="test1">Test 1</label><input id="test1"><br>
<button id="exec">Add Test 1 change handler to Test 2</button><br>
<label for="test2">Test 2</label><input id="test2"><br>
Если вы хотите сделать это для объекта окна, вам, вероятно, нужно перезаписать window.addEventListener
, потому что окно не является Node