2010-05-06 8 views
5

$ ("entrée [type 'bouton' =] [onclick =^'save']")jQuery sélecteur onclick ne fonctionne pas

et il travaille en FF mais sur IE ...

Il y a quelque chose qui cloche avec la partie sélecteur onclick. Existe-t-il un moyen de contourner le problème des navigateurs?

Merci Pawel

modifier:

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

Vous essayez de trouver un bouton dont onclick est lié à une méthode commençant par sauver? – justkt

+0

Oui, précisément – dragonfly

Répondre

1

Vous pouvez créer un sélecteur personnalisé (probablement très inefficace si):

$.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 ne fonctionne pas dans IE, donc vous devrez sauter par un autre crochet en utilisant toString() et regexps. Dans l'ensemble, il vaut mieux conserver manuellement une liste de noms de gestionnaires d'événements.

Modifier: en regardant votre extrait de code, il semble y avoir aucune raison de chercher des gestionnaires d'événements. Au lieu de lancer des sélecteurs d'attribut de manière extravagante, utilisez des classes et des identifiants pour adresser vos éléments d'une manière sémantiquement significative, par ex.

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

puis

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

Oui, l'ajout d'ID est la solution la plus simple. Mais comme je l'ai mentionné ci-dessus dans un commentaire, j'ai des centaines de ces "scroll image et bouton pour faire défiler" paires dans le projet. Ne demandez pas pourquoi :)) Quoi qu'il en soit, merci pour une réponse informative. Je pense que je finirai par ajouter des attributs ids/class ... – dragonfly

+1

Les fonctions traversal de jQuery sont très flexibles. Utilisez des classes et vous pouvez probablement trouver le bon bouton en fonction de sa position relative dans l'arborescence DOM. Par exemple. '$ (this) .parents ('. block: first'). find ('. submit-button')' trouvera le conteneur (avec 'class =" block "') de l'icône, et cherche le bouton submit Là. – Tgr

+0

Encore plus simple (vous apprenez quelque chose tous les jours): '$ (this) .closest ('. Block'). Find ('. Submit-button')' – Tgr

6

Il devrait ressembler à:

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

Vous devez mettre cela en document ready fonction

EDIT est ce que vous voulez ?

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

Merci. Mais je ne voulais pas réaliser autre chose. Consultez le code complet – dragonfly

+0

@dragonfly que voulez-vous atteindre, pouvez-vous s'il vous plaît modifier votre question, un peu plus de détails aiderait – ant

3

Avez-vous plus d'un bouton qui est un bouton de sauvegarde? Si non, pourquoi n'attribuez-vous pas simplement un identifiant à votre bouton? Cela rend beaucoup plus simple, et le sélecteur d'identifiant, qui enveloppe document.getElementById() est très multiplate-forme. Ensuite, tout ce dont vous avez besoin est $("#buttonID").

EDIT: Compte tenu des critères de l'OP, je suggère une classe (juste pour une utilisation comme un sélecteur) comme "jumpToSave". Chaque bouton doit avoir cette classe, puis le sélecteur peut utiliser $(".jumpToSave")

+0

Je voudrais avoir un seul bouton de ce genre. Mais malheureusement j'en ai des centaines dans tout le projet ... Donc je voulais minimiser les efforts nécessaires. – dragonfly

+0

Pouvez-vous leur donner tous la même classe et le faire de cette façon? – justkt

2

Vous ne pouvez pas rechercher une valeur comme celle-là dans les attributs d'événement. Le navigateur crée une fonction à partir de la valeur de chaîne dans l'attribut.

Si vous avez un attribut comme ceci:

onclick="save();" 

L'attribut contient une référence de fonction plutôt qu'une chaîne. Si vous lisez l'attribut et obtenez la valeur sous forme de chaîne, vous obtenez le code de la fonction.

Lors de la lecture de la valeur d'attribut dans Firefox, c'est ce que vous obtenez:

function onclick(event) { save(); } 

Lors de la lecture de l'attribut dans Internet Explorer, c'est ce que vous obtenez:

function onclick(){save();} 

Vous devez utiliser un autre attribut pour identifier le bouton.

+0

Je comprends votre point. Même si $ (el) .attr ("onclick") ne renvoie pas la chaîne save(), le sélecteur fourni ci-dessus a fonctionné dans FF, c'est pourquoi je voulais l'utiliser. Merci pour l'information. – dragonfly

Questions connexes