2011-01-05 27 views
10

escribí un bookmarklet para traducir rápidamente el texto seleccionado utilizando Google Translator en una ventana emergente:Cómo un bookmarklet puede evitar el bloqueo de ventanas emergentes

javascript:(function(){ 
    var text = encodeURI(document.getSelection()); 
    if (!text.length) { 
     text = prompt('Texto') 
    } 
    var url = 'http://translate.google.com/translate_t?hl=&ie=UTF-8&text=' + text + ' &sl=es&tl=pt#'; 
    window.open(url,'trans','left=20,top=20,width=1000,height=500,toolbar=0,location=0,resizable=1'); 
})(); 

Sin embargo, el bloqueo de ventanas emergentes de Firefox no permite la nueva ventana que se abrirá . Puedo agregar excepciones para cada sitio donde utilizo el menú emergente, pero puede ser bastante molesto ...

Pensé que los bookmarklets podrían abrir ventanas emergentes, de hecho, muchos lo hacen, ¿verdad? ¿Qué estoy haciendo mal? ¿O no es posible hacerlo?

Respuesta

10

Hay otra forma de solucionar el bloqueador de pop-ups incluyendo primero un enlace superpuesto en la página y luego permitiendo al usuario hacer clic para generar la ventana emergente. El bookmarklet javascript se puede almacenar en un archivo separado. Así es como bookmarklet de Pinterest logra hacerlo. Primero seleccionan imágenes de la página y las superponen directamente en la página. Luego, cuando el usuario hace clic para seleccionar una de las fotos, aparece la ventana emergente. Debido a que esta acción fue iniciada por el usuario, la ventana emergente funciona.

Aquí hay un código que puede utilizar para la prueba:

colocar esto en un bookmarklet archivo llamado.js

var popupProperties='width=600,height=400,toolbar=0,location=0,resizable=1'; 
var newA = document.createElement("a"); 
var url = 'http://www.stackoverflow.com'; 
newA.setAttribute("href","javascript:window.open(url,'Hi',popupProperties);"); 
newA.setAttribute("style","position:fixed;z-index:9999999;top:0;left:0;width:100px;height:100px;color:#000;background:#fff;display:block;"); 
var newT = document.createTextNode("Open this"); 
newA.appendChild(newT); 
document.body.appendChild(newA); 

Y luego su enlace bookmarklet puede ser así:

javascript:var jsCode = document.createElement('script');jsCode.setAttribute('src', 'http://localhost/bookmarklet.js?r='+Math.random()*99999999);document.body.appendChild(jsCode); 

Como alternativa, es necesario incluir la ventana emergente en el enlace real bookmarklet. Lo que a su vez significará que la única forma de realizar cambios es que el usuario vuelva a instalar el bookmarklet.

EDITAR: Además del método anterior, más tarde descubrí que hay incluso otra forma de evitar esto usando easyXDM. Puede ayudarle a evitar la Política de origen idéntico http://easyxdm.net/wp/

Al usar esto, puede usar un marco flotante para su bookmarklet e incluso puede tener un enlace "cerrado" dentro de su iframe que podrá eliminar el iframe del padre página.

+1

Incluso puedes arrojar una identificación en ese anclaje y hacer algunas travesuras como document.getElementById ('myid'). Click() y simplemente disparar desde el bate (área gris aquí ...) DOM nativo .click es difícil de encontrar soporte documentación para, pero el moderno Chrome y FF funcionan bien en mis breves pruebas. –

-1

El bloqueador de ventanas emergentes tiene la posibilidad de agregar excepciones. tal vez trate de añadir una excepción para translate.google.com

(herramientas menu-> opciones-> sección de contenido)

+1

En realidad, no funciona porque el sitio con el contenido se considera el sitio de origen. Por ejemplo, si le pido que traduzca una palabra en es.wikipedia.org, debería agregar una excepción a es.wikipedia.org y otros sitios ... – brandizzi

+0

Disculpe, de alguna manera me perdí esa parte de su OP – horatio

+0

En realidad, lo agregué después de publicar pero sin ver su sugerencia. Entonces, está bien :) – brandizzi

1

Interesante pregunta, mi instinto me dice que no es posible debido a que el navegador no tiene por qué seguir la pista cuyo código está tratando de abrir una nueva ventana, por lo que no puede 'permitir' ya que proviene del sitio X.

Una opción que creo que es realmente mejor es abrir el contenido en un cuadro de diálogo en el mismo ventana. Echar un vistazo a cómo implementar un bookmarklet jQuery y el resto debe ser recta hacia adelante:

http://www.latentmotion.com/how-to-create-a-jquery-bookmarklet/

+0

Es extraño porque pepole dice que sería posible aquí: stackoverflow.com/q/4048008/287976 Sin embargo, traté de usar un bookmarklet que creí que podría hacerlo (un bookmarklet para guardar enlaces en Delicious): primero falló, y luego cambió la ubicación del documento ... Eso es desafortunado, porque realmente quería abrirlo en otra ventana ... Tal vez intento jQuery, pero apuesto a que será suficiente para para agregar excepciones para algunos sitios comunes desde donde quiero traducir un poco de texto ... – brandizzi

7

Una forma de evitar que los navegadores que provocó un bloqueador de pop-up es que su Javascript totalmente contenida dentro del anclaje etiqueta.

Una vez que haga referencia a otro archivo, aparentemente desencadena el bloqueador de elementos emergentes del navegador.

Por ejemplo, el siguiente código no se dispara un bloqueador de pop-up cuando un usuario arrastra el anclaje a la barra de marcadores de su navegador:

<a href="javascript:window.open('http://tagsby.me/index.small.php','newWindowName','width=960,height=400,scrollbars=yes,status=no,titlebar=no,toolbar=no');void(0);">No blocker</a> 

Sin embargo, si hace referencia el mismo código en otro archivo noblocker.js que se ha añadido al objeto del documento para el sitio el usuario está visitando actualmente:

<a id="tbm" class="testing" href="javascript:(function(){document.body.appendChild(document.createElement('script')).src='http://domain.com/noblocker.js';})();"> 

se activa un bloqueador de ventanas emergentes. Puede haber otra manera, pero esto es lo que tengo trabajando en mi sitio http://tagsby.me en este momento.

+0

¿Has encontrado otra forma? Veo que Pinterest logra tener una ventana emergente no bloqueada a través de su marcador "Pin it" aunque se llame a través de un archivo javascript remoto - Compruébelo en vivo en http://pinterest.com/about/goodies/ – gwendall

Cuestiones relacionadas