2012-04-27 19 views
6

Este sitio web tiene una galería de imágenes. Cada vez que hago clic en una imagen en miniatura, se abre la URL en una nueva pestaña (no porque configuro Firefox para abrir enlaces en pestañas nuevas). Quiero simplemente abrir la URL en la misma ventana. Un ejemplo de cómo se ven las imágenes en miniatura es esto.Cómo reemplazar el evento onclick con GreaseMonkey?

<span class="thumb" id="789"> 
<a href="/post/image/12345" onclick="return PostMenu.click(12345)"> 
<img class="preview" src="http://abc.com/image.jpg" title="title" alt=""> 
</a> 
</span> 

Creo que onclick="return PostMenu.click(12345)" es hacer esto. ¿Cómo puedo reemplazar la función PostMenu.click() con mi propia función vacía en GreaseMonkey? ¿Hay alguna manera de hacer que un script de GreaseMonkey intercepte todos los eventos onclick?

Mi única otra opción es pasar por todas las clases span y eliminar onclick="return PostMenu.click(12345)" de las etiquetas de enlace. Pero como puede haber más de un centenar de estos en una sola página, prefiero no hacer eso.

+0

¿Cuál es el código de 'PostMenu.click', lo hace más que' window.open() '? – Bergi

Respuesta

4

En realidad, eliminar el onclick s no es en absoluto una tarea onerosa.

con jQuery, el código sería simplemente:

$("span.thumb a").prop ("onclick", null); 

O, para versiones anteriores de jQuery:

$("span.thumb a").removeAttr ("onclick"); 

Un guión completo:

// ==UserScript== 
// @name  _Kill select onClicks 
// @include http://YOUR_SERVER/YOUR_PATH/* 
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js 
// ==/UserScript== 

$("span.thumb a").prop ("onclick", null); 


La ventaja de este enfoque es que:
(1) Conserva PostMenu.click() en caso de que lo desee, o lo necesite, en otro lugar,
(2) Está eliminando la suciedad de la página, lo que lo hace un poco menos manejable.
(3) Sospecho que también podría necesitar desenvolver o modificar ese enlace, en cuyo caso, el enfoque de reescritura dirigido utilizando jQuery es el camino a seguir.


Si realmente desea reemplazar la función PostMenu.click() con su propia función vacía, el código para que sea justo:

unsafeWindow.PostMenu.click = function() {}; 

En cuanto a tener intercepción Greasemonkey todos los eventos onclick ... Es decir no es fácil de hacer de manera confiable. Olvídese de ese enfoque a menos que haya una necesidad abrumadora por algún motivo (que no parece haber, en este caso).

+0

Solo me pregunta, para el script 'prop', tan pronto como la página se carga ... ¿se ejecuta inmediatamente? ¿Y realmente elimina el atributo 'onclick'? Lo probé y ya no se abre en una nueva pestaña, pero cuando revisé la fuente, el atributo 'onclick' todavía estaba allí. Un problema menor es que el sitio tiene paginación automática, así que al desplazarme hacia abajo, se generan más miniaturas para que el script 'prop' no funcione en las miniaturas recién compiladas. La segunda secuencia de comandos funciona bien sin embargo. – Jack

+0

En realidad, al pensarlo, creo que la razón por la que se abre en una nueva pestaña se debió a la búsqueda automática, ya que presionar nuevamente hace que tenga que volver a cargar desde el principio. Al desactivar la paginación automática, al hacer clic en enlaces se abre en la misma pestaña. – Jack

+0

Sí, el código 'prop' solo se dispara una vez y los enlaces agregados por AJAX después de la carga de la página inicial no se verán afectados. Puede hacer un script para verificar y eliminar los 'onclicks' a medida que aparecen, pero parece que ya tiene una solución alternativa y/o el enfoque de función vacía. –

Cuestiones relacionadas