type sirve script que para lista funciona etiquetas ejemplos como caracteristicas javascript permissions popup wrapper bookmarklet

javascript - sirve - ¿Se puede invocar una función definida en un bookmarklet desde un script de nivel de página?



script html ejemplos (2)

Tengo un bookmarklet que necesita abrir una nueva ventana / pestaña. Para evitar el bloqueador de pop-ups, necesito llamar al método window.open() directamente en el bookmarklet, es decir: en el nivel del navegador.

Sin embargo, quiero mantener el bookmarklet actualizable cargando archivos Javascript externos. Para hacer esto, el bookmarklet necesita agregar nodos de script al DOM. Si window.open() poner el código window.open() en uno de estos scripts cargados externamente, el bloqueador de elementos emergentes lo bloquearía desde su nivel de página.

Lo que quiero saber es si puedo crear una función de contenedor alrededor de window.open() en mi bookmarklet, y luego llamarlo desde el script cargado externamente. ¿Cuál es el alcance y cuáles son los permisos en un ajuste como este?


Me pregunté si ese enfoque podría funcionar, es bueno ver que sí funciona.

El problema general aquí es que los navegadores no le permitirán abrir una nueva ventana que no sea la interacción directa del usuario. Por lo tanto, no puede abrir la ventana desde un script remoto.

Está abriendo la ventana directamente desde el bookmarklet, moviéndose a esa ubicación y luego invocando el script remoto.

La alternativa, que fui con, era mover el contenido de la secuencia de comandos remota directamente al bookmarklet. Eso estuvo bien para mi simple aplicación. Escribí eso en mi blog


Se me ocurrió una solución que no es perfecta pero cumple con los requisitos:

Aquí está el código bookmarklet:

javascript:window.open(window.location);window.location="http://www.google.com/";var%20s=document.createElement(''script'');s.setAttribute(''src'',''http://my-script.js'');document.body.appendChild(s);void(0);

El equivalente legible paso a paso es:

window.open(window.location); // Clone the current tab window.location = "http://www.google.com/"; // Navigate to the desired page url var s = document.createElement(''script''); // Create the script s.setAttribute(''src'',''http://my-script.js''); // document.body.appendChild(s); // Embed it into current document

Solo queda un problema: la página que desea mostrar no está activa de manera predeterminada. El clonado es.