2010-08-24 10 views
0

Je deviens fou en essayant de comprendre pourquoi cela ne fonctionne pas. Je crée une checkbox dynamiquement avec JS pour activer/désactiver un champ de texte (également créé dynamiquement).Le gestionnaire onclick ne se déclenche pas pour la case à cocher créée avec document.createElement

code

est assez simple:

var text = $(document.createElement("input")); 
text.type = "text"; 
container.appendChild(text); 

... 

var check = $(document.createElement("input")); 
check.type = "checkbox"; 
check.onclick = function(event) { 
    if (this.checked) text.enable(); 
    else text.disable(); 
}; 
container.appendChild(check); 

J'ai essayé de mettre le gestionnaire d'événements après container.appendChild(check);, mais qui donne le même résultat.

Il n'y a pas d'erreur JS et les résultats sont identiques dans Chrome, FF3.6 et IE7. Est-ce que quelqu'un peut expliquer pourquoi cela ne fonctionne pas? Toutes les corrections seraient appréciées.

Étrangement (parce que, théoriquement, il devrait être le même que ci-dessus), en ajoutant les éléments suivants (après container.appendChild(check);) fonctionne (case à cocher est d'abord à la page):

$$("input[type=checkbox]")[0].onclick = function(event) { 
    if (this.checked) text.enable(); 
    else text.disable(); 
}; 

Je ne aime pas vraiment cela, comme semble "sale", et la case à cocher peut ne pas être la première sur la page plus tard ...

BTW, $ et $$ sont de Prototype.

Merci d'avance pour toute aide.

+0

Lorsque je visite la case avec Chrome (et FF), il dit qu'il n'a pas d'écouteurs d'événement. Peut-être que cela aide ... – Valera

Répondre

3

je me suis dit ce qui était à l'origine du problème ...

Après tout ce code, j'ajoutais un texte en ajoutant à innerHTML de container. Pour une raison quelconque, cela a rejeté tous les gestionnaires d'événements pour ce conteneur.

L'utilisation de container.appendChild(document.createTextNode("...")); a permis de résoudre le problème.

Hope this helps toute autre personne qui pourrait être d'avoir ce genre de problème ...

+0

Aha! Plus de contexte était nécessaire :) –

+0

Ouais, je ne savais pas que l'ajout direct à innerHTML pouvait interférer avec ça ... Merci pour l'aide! – Valera

0

Etes-vous sûr de ne pas avoir d'erreur?

craeteElement est mal orthographié dans la première ligne. Après avoir réglé cela, tout fonctionne sur ma machine avec 1.6.1 et 1.7RC1.

http://jsfiddle.net/4XWP3/

+0

Désolé, c'était ma faute (faute de frappe). Il est orthographié correctement dans mon code, et ne fonctionne pas ... – Valera

+0

est-ce que le lien que j'ai posté fonctionne pour vous? Sinon, pouvez-vous poster un exemple reproductible sur http://jsfiddle.net ou ailleurs – Anurag

+0

Oui, le lien fonctionne. Mais étrangement, mon code ne fonctionne toujours pas. – Valera

0

Works pour moi. Prototype ne fait rien pour vous ici, alors je vous suggère de le laisser tomber. Les travaux et les choses suivantes: simplifie

var text = document.createElement("input"); 
text.type = "text"; 
container.appendChild(text); 

... 

var check = document.createElement("input"); 
check.type = "checkbox"; 
check.onclick = function(event) { 
    text.disabled = !this.checked; 
}; 
container.appendChild(check); 
+0

En utilisant $ (...) wrappers pour IE, avoir des méthodes Prototype collées sur les nouveaux objets. – Valera

+0

J'ai réécrit ma réponse. –

+0

Le problème n'est pas que le gestionnaire ne fonctionne pas, c'est que le gestionnaire ne se fait même pas virer. Je peux mettre une alerte ("") là et cliquez sur la case à cocher et rien ne se passe. C'est probablement plus efficace que ce que j'avais, donc je vais probablement utiliser ça ... – Valera

0

Avez-vous besoin d'utiliser les emballages $(...)? Pourquoi ne pas:

var text = document.createElement("input"); 
text.type = "text"; 
container.appendChild(text); 
... 
var check = document.createElement("input"); 
check.type = "checkbox"; 
check.onclick = function(event) { 
    if (check.checked) text.enable(); 
    else text.disable(); 
}; 
container.appendChild(check); 

Notez également que j'ai changé if (this.checked) à if (check.checked) depuis this peut devenir fou à JS.

+0

Pas besoin de changer 'this' en' check': dans ce cas, 'this' est une référence à la case à cocher. Il est plus utile de comprendre pleinement les règles à propos de ceci que de l'éviter complètement. –

+0

Utilisation des wrappers $ (...) pour IE, pour avoir des méthodes Prototype collées sur les nouveaux objets. J'ai essayé les deux. et vérifie. mais les mêmes résultats. Je préfère utiliser vérifier. de toute façon, avait comme ça. de coller hors de l'attribut HTML ... – Valera

Questions connexes