Mi extensión le permite ingresar o copiar texto de la página (usando document.getSelection() ) y luego intenta hacer clic en un botón usando document.querySelector y luego el evento de click .
Si ingreso el texto manualmente, todo funciona como se esperaba. Sin embargo, si pego el texto en la extensión usando getSelection , el evento de click se pierde.
Como referencia, esta es una versión abreviada de mi código:
//content.js function messagesFromReactAppListener(msg, sender, sendResponse) { switch (msg.method) { case "getSelection": sendResponse({ text: document.getSelection().toString() }); break; case "replyToEmail": const replyBtn = document.querySelector(...); if (replyBtn) { replyBtn.click(); sendResponse(true); } else { sendResponse(false); } break; return true; } // paste function, called when button pressed on extension export function pasteText(): Promise<PasteTextRespType> { return new Promise((resolve) => { chrome.tabs && chrome.tabs.query( { active: true, currentWindow: true, }, (tabs) => { chrome.tabs.sendMessage(tabs[0].id || 0, { method: "getSelection" }, (response: PasteTextRespType) => { resolve(response); }); } ); }); } // associated with a submit button on the extension handleSubmit(event: any) { ... chrome.tabs && chrome.tabs.query({ active: true, currentWindow: true }, tabs => { chrome.tabs.sendMessage( tabs[0].id || 0, { method: REACT_MSG_METHODS.replyToEmail }, (resp) => { ... } ); }); event.preventDefault(); } Sé que sería mejor si tuviera un oyente en el evento de clic antes de enviar la respuesta con verdadero, pero no he podido hacerlo de la manera correcta. La ayuda con eso también sería apreciada, pero hacer clic simplemente no funciona después de usar paste arriba.
Solo me tomó 5 días darme cuenta de esto, y me estaba volviendo completamente loco. Resulta que, cuando haces document.getSelection() , se enfoca en lo que selecciones, lo que evita que los eventos de click se disparen en otros elementos. Fue raro porque pude, por ejemplo, cambiar el css de fondo del elemento seleccionado. La solución fue cambiar el caso getSelection a:
case "getSelection": { let sel = document.getSelection(); sendResponse({ text: sel.toString() }); sel.removeAllRanges(); break; } Lo que elimina el foco/la selección y habilita el click para disparar.