2011-11-12 8 views
5

Me di cuenta de que mi bookmarklet Javascript estaba fallando en ciertos sitios como Google Reader y páginas de resultados de búsqueda de Google (y al azar en algunos sitios que no son de Google). En cuanto a la consola, pude ver que, para estas páginas, haga clic en el bookmarklet no anexar elementos para la cabeza/cuerpo como lo hacía normalmente, sino que creó un nuevo documento en el que se veía así:Javascript bookmarklet falla en ciertos sitios, crea fantasmal nuevo <html> página

<html> 
    <head></head> 
    <body></body> 
</html> 

Incluso cuando Reduje mi bookmarklet al javascript:alert(window.location.href);, crearía esta página en blanco y ejecutaría el bookmarklet allí, de modo que la alerta mostrara about:blank. En la mayoría de los sitios, esta página en blanco no se crea y se muestra la ubicación correcta.

¿Alguien puede explicar esto? ¿Estos sitios están protegiendo el código ejecutado externamente como una medida de seguridad?

ACTUALIZACIÓN: Actualmente no puedo reproducir esto en navegadores que no sean Chrome 17.0.932.0 dev. Avíseme si alguien más puede reproducir estos resultados en Chrome u otros.

+0

No puedo reproducir sus conclusiones. ¿Qué navegador está causando problemas? –

+0

Increíble. Podría haber jurado que esto estaba sucediendo en todos los navegadores, pero ahora solo puedo reproducirlo en Chrome dev. A menos que alguien más pueda reproducirse en otros navegadores, considere este problema en espera. – glortho

+0

¿Estás haciendo pruebas a través de marcadores o pegar en la barra de direcciones? –

Respuesta

1

Debe asegurarse de que el código más alto, es decir, el que está justo después de javascript:, no devuelve nada.

Por lo general, esto se hace envolviendo todo en void():

javascript:void(alert(window.location.href)); 

Es muy raro que se rompe con alert() aunque desde la propia función no devuelve nada ...

+0

Gracias, ThiefMaster. Lo intenté con el vacío y tuve los mismos resultados. Todavía lo obtengo muy a menudo en Chrome dev. Ábrelo en FF y bookmarklet it = no hay problema. Tengo que probar más en Chrome estable y reportarles. – glortho

1

Si una url javascript: devuelve una cadena, se usará para crear un nuevo documento:

javascript:'foo bar baz'; 

Esto puede ser un problema difícil de solucionar si no sabes cuidarlo. Puede surgir si se utiliza una función que devuelve una cadena o termina su bookmarklet con una línea que establece un valor de cadena:

javascript: a = prompt('foo bar baz'); b = a; 

Una solución simple es utilizar un cierre:

javascript:(function(){ var a; a = prompt('foo bar baz'); window.b = a}()); 

Un la alternativa es terminar con void 0;

javascript: a = prompt('foo bar baz'); b = a; void 0; 
Cuestiones relacionadas