2010-05-13 4 views
0

J'essaie de définir l'attribut "onclick" d'un lien généré avec jQuery.jQuery paramètre onclick ne fonctionne que sur FireFox?

Alors que d'autres attributs fonctionnent sans problème (par exemple. Href, mais aussi d'autres attrs personnalisés), le réglage "onclick" semble fonctionner que dans FireFox. Sur d'autres navigateurs, l'attribut est simplement ignoré.

Un conseil? Ce comportement est-il correct? Et pourquoi?

<html><head> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
<script type="text/javascript"> 
    jQuery(function(){ 
    var obj = $('<a/>'); 
    obj.html('click me'); 
    obj.attr({'href':'#test', 'onclick':'alert("o hai"); return false;'}); 
    $('body').append(obj); 
    }); 
</script> 
</head><body /></html> 

EDIT: Je sais au sujet de la .cliquez() méthode jQuery; mais ce n'est pas le point, je veux juste définir l'attribut et ne peux pas comprendre pourquoi cela ne fonctionne pas comme tout autre attr fait.

Répondre

4

Est-ce un comportement correct?

En tant que attr('onsomeevent', ...) n'a jamais été le moyen d'ajouter des écouteurs d'événements, n'a jamais été pris en charge, et ne fonctionne que sur Firefox en raison de la coïncidence, oui.

Et pourquoi?

Parce que IE avant la version 8 ne peut pas obtenir/définir directement les attributs HTML. L'appel setAttribute() définit uniquement une propriété DOM du même nom. Et la propriété onclick n'est pas une propriété de chaîne de sorte que vous ne pouvez pas lui écrire une chaîne. Il accepte seulement une valeur de fonction.

attr() de jQuery Muddies la question en étant appelé attr mais en train d'écrire à des propriétés DOM et non des attributs HTML ... mais en utilisant des noms d'attribut HTML (comme par exemple. class) plutôt que des noms de propriété DOM (comme className).

(Sauf quand il ne, parce que pour certains cas, il essaie de cacher la différence en utilisant des attributs. Sauf qui ne fonctionne toujours pas tout le temps dans IE pour la raison ci-dessus. Ce n'est pas un des moments les plus fiers de jQuery.)

De toute façon, en général ayant JavaScript dans une chaîne est une odeur de code. La meilleure solution pour jQuery et le JavaScript moderne en général consiste à utiliser des objets de fonction (éventuellement des expressions en ligne function() { ... }).

+0

Pas une réponse, problème existait même sur Google Chrome, et je n'essayais pas de définir un gestionnaire d'événements, juste l'attribut DOM. Merci quand même. – Patonza

+1

Comme je l'ai dit, 'attr()' définit une propriété DOM. C'est exactement la même chose que dire 'element.onclick = 'alert()';', ce qui est évidemment invalide. Les propriétés du gestionnaire d'événements requièrent une valeur de fonction, pas une chaîne. – bobince

+0

Eh bien merci, alors. Je pense que les propriétés DOM peuvent contenir n'importe quel type d'objet et échouent finalement lorsqu'elles sont appelées en tant que gestionnaire d'événement si elles ne sont pas du type 'function'. – Patonza

2

l'essayer manière jQuery ....

<script type="text/javascript"> 
    jQuery(function(){ 
    var obj = $('<a/>'); 
    obj.html('click me') 
     .attr('href','#test') 
     .click(function() { 
      alert("o hai"); 
      return false; 
     }) 
    $('body').append(obj); 
    }); 
</script> 

modifier: essayez de changer onclick onClick, noter la capitale "C"

jQuery(function(){ 
    var obj = $('<a/>'); 
    obj.html('click me'); 
    obj.attr({'href':'#test', 'onClick':'alert("o hai"); return false;'}); 
    $('body').append(obj); 
    }); 
+0

Je connais "la façon jQuery". Je dois cependant définir l'attribut, et je n'arrive pas à comprendre pourquoi cela ne fonctionne pas. – Patonza

+0

s'il vous plaît voir modifier ... – Reigel

+0

En utilisant "onClick" avec la capitale C fonctionne à la fois sur FF et Chrome. Je vous remercie. Il est assez étrange, cependant, que l'inspecteur Chrome DOM affiche un attribut avec le "c" minuscule. Et de toute façon il est encore brisé sur IE, mais cela peut être un autre problème. – Patonza

Questions connexes