2010-05-06 18 views
5

$ ("input [type = 'botón'] [onclick =^'salvar']")no funciona

y funciona en FF, pero en IE ...

Hay algo mal con la parte del selector onclick. ¿Hay alguna manera de hacer una solución alternativa entre navegadores?

Gracias Pawel

edición:

$("img[src$='scroll.gif']").click(function(){ 
    var targetOffset = $("input[type='button'][onclick^='save']").offset().top; 
    $("html,body").animate({scrollTop: targetOffset}, 400); 
}); 
+0

Así que están tratando de encontrar un botón cuya onclick se une a un método a partir de ahorrar? – justkt

+0

yeap, precisamente – dragonfly

Respuesta

1

Puede crear un selector personalizado (probablemente muy ineficiente sin embargo):

$.extend($.expr[':'], { 
    onclick: function(node, index, args, stack) { 
    var events = $(node).data('events'); 
    var fn = args[3]; 
    if (!events || !events.click) return false; 
    for (i in events.click) { 
     if (events.click[i].name == fn) return true; 
    } 
    return false; 
    } 
}); 

$("input[type='button']:onclick('save')") 

function.name no funciona en IE, sin embargo, por lo que tendrá que pasar por el otro gancho utilizando toString() y las expresiones regulares. En general, es mucho mejor mantener manualmente una lista de nombres de controladores de eventos.

Editar: mirando su fragmento de código, no parece haber ninguna razón para buscar controladores de eventos. En lugar de lanzar violentamente selectores de atributos, use clases e ID para abordar sus elementos de una manera semánticamente significativa, p.

<img id="scroll-icon" src="icons/scroll.gif" /> 
<input id="submit-button" type="submit" onclick="save();" /> 

y luego

$("#scroll-icon".click(function(){ 
    var targetOffset = $("submit-buttton").offset().top; 
    $("html,body").animate({scrollTop: targetOffset}, 400); 
}); 
+0

Sí, agregar ID es la solución más simple. Pero como mencioné anteriormente en un comentario, tengo cientos de esos pares de "imagen de desplazamiento y botón para avanzar" en el proyecto. No preguntes por qué :)) De todos modos, gracias por la respuesta informativa. Creo que terminaré añadiendo atributos ids/clase ... – dragonfly

+1

Las funciones de cruce en jQuery son muy flexibles. Use clases, y probablemente pueda encontrar el botón correcto en función de su posición relativa en el árbol DOM. P.ej. '$ (this) .parents ('. block: first'). find ('. submit-button')' encontrará el contenedor (con 'class =" block "') del ícono y buscará el botón de enviar ahí. – Tgr

+0

Aún más simple (aprendes algo todos los días): '$ (this) .closest ('. Block'). Find ('. Submit-button')' – Tgr

6

Debe ser como:

$("input[type=button]").click(function(){ 
//do something 
}); 

Debería poner esto en document ready función

EDITAR es esto lo que quieres ?

$('img[src="scroll.gif"]').click(function(){ 
     var targetOffset = $(this).offset().top; 
     $("html,body").animate({scrollTop: targetOffset}, 400); 
    }); 
+1

Gracias. Pero quiero lograr algo más. Echa un vistazo al código completo – dragonfly

+0

@dragonfly, ¿qué quieres lograr? ¿Podrías editar tu pregunta? Un poco más de detalles ayudarían – ant

3

¿Tiene más de un botón que es un botón para guardar? Si no, ¿por qué no simplemente le asigna una identificación a su botón? Eso lo hace mucho más simple, y el selector de id, que se ajusta a document.getElementById(), es muy multiplataforma. Entonces, todo lo que necesita es $("#buttonID").

EDITAR: Dado el criterio de OP, sugeriría una clase (solo para usar como un selector) como "jumpToSave". Cada botón debe tener esa clase, y luego el selector podría usar $(".jumpToSave")

+0

Ojalá tuviera solo un botón de ese tipo. Pero desafortunadamente tengo cientos de ellos en un proyecto completo ... Así que quería minimizar el esfuerzo necesario. – dragonfly

+0

¿Puedes darles la misma clase y hacerlo de esa manera? – justkt

2

No se puede buscar un valor como ese en los atributos de evento. El navegador crea una función a partir del valor de cadena en el atributo.

Si usted tiene un atributo de esta manera:

onclick="save();" 

El atributo contiene una referencia a una función en lugar de una cadena. Si lees el atributo y obtienes el valor como una cadena, obtienes el código de la función.

Cuando se lee el valor del atributo en Firefox, esto es lo que hay:

function onclick(event) { save(); } 

Al leer el atributo en Internet Explorer, esto es lo que se obtiene:

function onclick(){save();} 

Usted tiene que usar algún otro atributo para identificar el botón.

+0

Entiendo tu punto. Aunque $ (el) .attr ("onclick") no devuelve string save(), el selector proporcionado anteriormente funcionó en FF, es por eso que quería usarlo. Gracias por la información. – dragonfly