Pourquoi mon sélecteur JQuery retour a n.fn.init[0], et quel est-il?
J'ai un ensemble de généré dynamiquement, cases à cocher, où chacun d'eux a un data-id
attribut correspondant à une base de données d'identification entier. Quand je remplir mon html-forme avec un objet pour le modifier, il ya une liste d'entiers représentant les cases à cocher qui doit être vérifié. Les cases sont enveloppés dans un div
avec classe checkbox-wrapper
.
Donc html ressemble à ceci:
<div class="checkbox-wrapper">
<input type="checkbox" id="checkbox1" data-id="1">
<label for="checkbox1">Checkbox 1</label>
</div>
<div class="checkbox-wrapper">
<input type="checkbox" id="checkbox2" data-id="2">
<label for="checkbox2">Checkbox 2</label>
</div>
<div class="checkbox-wrapper">
<input type="checkbox" id="checkbox3" data-id="99">
<label for="checkbox3">Checkbox 99</label>
</div>
Note que le code s'exécute sur l'auto incrémentation des numéros d'index, alors que les données-id peut avoir un id différent de la valeur. Je tiens à les sélectionner par data-id.
Maintenant, à l'aide de JQuery, je sais que je peux sélectionner les cases correspondantes comme ceci:
$(".checkbox-wrapper>input[data-id='99']");
$(".checkbox-wrapper>input[data-id='1']");
Cela fonctionne dans ma console, en chrome, et il retourne pertinentes DOM-élément. De même, ci-dessous, définit les cases à coché:
$(".checkbox-wrapper>input[data-id='99']").prop("checked", "checked");
$(".checkbox-wrapper>input[data-id='1']").prop("checked", "checked");
Cependant, si je itérer sur une liste d'entiers dans mon code javascript (pas directement dans la console), et de connecter les éléments retournés, basé sur les valeurs d'id, j'obtiens des résultats étranges:
var ids = [1,2]
$.each(ids, function(index, myID){
console.log($(".checkbox-wrapper>input[data-id='"+myID+"']"));
$(".checkbox-wrapper>input[data-id='"+myID+"']").prop("checked", "checked");
});
Tout d'abord, aucune des cases sont cochées. Deuxièmement, ma console imprime des résultats étranges:
n.fn.init[0]
context: document
length: 0
prevObject: n.fn.init[1]
selector: ".checkbox-wrapper>input[data-id='1']"
__proto__: n[0]
n.fn.init[0]
context: document
length: 0
prevObject: n.fn.init[1]
selector: ".checkbox-wrapper>input[data-id='2']"
__proto__: n[0]
L'imprimé sélecteur de Cordes semble parfait. Exactement la même sélecteurs renvoie les DOM-éléments, de les écrire directement dans la console chromée. Puis ils retournent des objets comme ceci:
[<input type="checkbox" id="checkbox1" data-id="1">]
Qu'est-ce que le n de.fn.init[0], et pourquoi il est revenu? Pourquoi mes deux apparemment identiques fonctions JQuery retour des choses différentes?
- Le "étrange" résultat que vous voyez dans la console c'est l'objet jQuery lui-même. Vous pouvez aussi voir que le
length
propriété est0
, ce qui signifie que l'élément n'est pas trouvé dans le sélecteur vous avez fourni, d'où l'utilisation deprop()
n'a aucun effet. Comme vous pouvez le voir dans cet exemple votre code comme vous l'avez décrit, il fonctionne. Cela signifie que vous avez besoin de vérifier la console d'erreurs, d'ailleurs dans votre code. Le problème pourrait être que vous n'avez pas compris la bibliothèque jQuery correctement, ou que vous êtes en cours d'exécution de votre code avant que le DOM est prêt. - Probablement le dernier. Mes cases sont créés à partir de données dynamiques. La case à cocher en-html est généré et ajouté au document par le biais d'une méthode, qui est appelée chaque fois qu'un datepicker est changé, c'est lors du chargement de l'objet pour remplir le formulaire. En d'autres termes, juste avant la vérification qui a des cases à cocher. Il est fait par le déclenchement d'une
changeDate
-événement, je ne pense pas que s'arrête l'exécution de ma population de la méthode, jusqu'à ce qu'il se fait de la création de la case DOM-éléments. @RoryMcCrossan, votre commentaire est en fait une réponse à ma question. Vous devriez écrire une réponse. - Donné, ça ne résout pas mon problème, mais il répond à la question parfaitement, et me donne une chance de passer, et enquêter sur la prochaine étape. D'autres questions que j'ai le plus approprié pour une nouvelle question.
.prop("checked", "checked")
devrait être.prop("checked", true)
- vous avez raison, mais il n'a pas vraiment d'importance à cette question, n'est ce pas? ref: stackoverflow.com/questions/10650233/...
- (C'est pourquoi j'ai présenté comme un commentaire et non une réponse.) Vous exécutez votre code lorsque la page est complètement chargée? Si non, les DOM ne sera pas chargé et pas de sélecteurs va correspondre à quoi que ce soit.
- Mon commentaire précédent sera répondre à votre question parfaitement
Vous devez vous connecter pour publier un commentaire.
Une autre approche(à l'Intérieur de
$function
à asure que leeach
est exécuté surdocument ready
):De travail violon: https://jsfiddle.net/robertrozas/w5uda72v/
Sur
n.fn.init[0]
, permet de regarder le noyau de la Bibliothèque Jquery:Looks familiar, right?, now in a minified version of jquery, this should looks like:
Ici, c'est comment faire une vérification rapide pour voir si
n.fn.init[0]
est causée par votre DOM-éléments qui ne se chargent pas dans le temps. Retarder votre sélecteur de fonction en l'enveloppant danssetTimeout
fonction comme ceci:Ce sera la cause de votre sélecteur de fonction à exécuter avec un retard de 5 secondes, ce qui devrait être suffisant pour beaucoup de choses à charger.
C'est juste un gros hack pour vérifier si DOM est prêt pour votre sélecteur de fonction ou pas. Ce n'est pas un (permanente) de la solution.
Les moyens privilégiés pour vérifier si le DOM est chargé avant l'exécution de votre fonction sont les suivantes:
1) Envelopper votre sélecteur de fonction en
2) Si cela ne fonctionne pas, utilisez DOMContentLoaded
3) Essayer de la fenêtre.onload, qui attend toutes les images à charger en premier, de sorte que son la moins préférée
4) Si vous êtes en attente pour une bibliothèque à la charge de qui se charge en plusieurs étapes ou a une sorte de retard de son propre chef, alors vous pourriez avoir besoin de certains compliqué solution personnalisée. C'est ce qui m'est arrivé avec "MathJax" de la bibliothèque. Cette question explique comment vérifier lors de MathJax bibliothèque chargée de ses éléments DOM, si elle est d'aucun secours.
5) Enfin, vous pouvez coller avec codée en dur
setTimeout
fonction, rendant peut-être de 1 à 3 secondes. C'est en fait le moins privilégiées de la méthode, à mon avis.Cette liste de correctifs est probablement loin d'être parfait afin de toute personne est la bienvenue pour le modifier.
J'ai fait face à ce problème parce que mon sélecteur était dépendent
id
pendant ce tempsI did not set id for my element
mon
selector
étaitmais mon
HTML element
Votre objet de résultat est un élément jQuery, pas un tableau javascript. Le tableau que vous souhaitez doit être l'objet .get()
Je veux juste ajouter quelque chose à ces réponses. Si votre
DOM
élément ins pas de chargement dans le temps. Vous pouvez toujours définir la valeur.let Ctrl = $('#mySelectElement');
...
Ctrl.attr('value', myValue);
après que plus
DOM
éléments qui acceptent une valeur d'attribut doit remplir correctement.Erreur, c'est que vous êtes en utilisant 'ID' en minuscule comme "checkbox1", mais lorsque vous boucle objet json son retour en majuscules. Si vous avez besoin de remplacer "checkbox1" à "CHECKBOX1".
Dans mon cas :-
Avant
J'obtiens le même message d'erreur mais lorsque je remplace l'id dans le code html de son beau travail.
Après