Создайте оболочку над Node.addEventListener()
, которая будет перехватывать все прослушиватели событий, добавленные к кнопке, когда она отображается другой библиотекой. Это может выглядеть так (этот код должен быть выполнен до того, как внешняя библиотека создаст кнопку):
let ael = Node.prototype.addEventListener
let eventListeners = []
Node.prototype.addEventListener = function(type: string, listener: EventListenerOrEventListenerObject | null, options?: boolean | AddEventListenerOptions): void {
if((this as HTMLElement).id === "buttonID")
eventListeners.push({type, listener, options})
this.addEventListener = ael
this.addEventListener(type, listener, options)
}
Создайте компонент реакции с помощью вашей кнопки - вы можете создать новый или ввести, используя опасноSetInner Html. Передайте массив eventListeners
как опору. При монтировании и размонтировании компонента добавьте / удалите прослушиватели событий для вашей кнопки.
function ClonedButton({eventListeners}: any){
useEffect(()=>{
eventListeners.forEach((el) => document.getElementById("my-migrated-new-button")!.addEventListener(el.type, el.listener, el.options));
return () => {
eventListeners.forEach((el) => document.getElementById("my-migrated-new-button")!.removeEventListener(el.type, el.listener, el.options));
}
}, [])
return <button id="my-migrated-new-button"></button>
}