Essayé d'enregistrer un widget avec id == values0 mais cet identifiant est déjà enregistré

Je reçois cette erreur, et je ne sais pas comment peut être résolu. J'ai lu ce lien avant.

EDIT: 1

Index.php

<script type="text/javascript"> $(document).ready(function() { $("#customForm").submit(function() { var formdata = $("#customForm").serializeArray(); $.ajax({ url: "sent.php", type: "post", dataType: "json", data: formdata, success: function(data) { switch (data.livre) { case 'tags': $("#msgbox2").fadeTo(200, 0.1, function() { $(this).html('Empty tags').fadeTo(900, 1); }); break; default: $("#msgbox2").fadeTo(200, 0.1, function() { $(this).html('Update').fadeTo(900, 1, function() { $('#conteudo').load('dojo/test_Slider.php'); }); }); break; } } }); return false; }); }); </script> 

Test_slider.php

 <script type="text/javascript"> var slider = []; for (i = 0; i < 5; i++) { slider[i] = ( function(i) { return function() { var node = dojo.byId("input"+[i]); var n = dojo.byId("valores"+[i]); var rulesNode = document.createElement('div'+[i]); node.appendChild(rulesNode); var sliderRules = new dijit.form.HorizontalRule({ count:11, style:{height:"4px"} },rulesNode); var labels = new dijit.form.HorizontalRuleLabels({ style:{height:"1em",fontSize:"75%"}, },n); var theSlider = new dijit.form.HorizontalSlider({ value:5, onChange: function(){ console.log(arguments); }, name:"input"+[i], onChange:function(val){ dojo.byId('value'+[i]).value = dojo.number.format(1/val,{places:4})}, style:{height:"165px"}, minimum:1, maximum:9, } },node); theSlider.startup(); sliderRules.startup(); } })(i); dojo.addOnLoad(slider[i]); } </script> 

Problème: Cliquez d'abord sur submit btn tout fonctionne bien, 5 curseurs sont importés. Deuxième clic, une mise à jour est supposée, mais je reçois ce message:

 Tried to register widget with id==valores0 but that id is already registered 

[Demo video] 2

Juste pour ajouter à la réponse @ missingo et @ commentaires de Kevin. Vous pouvez parcourir les dijits existants en regardant dans le registre:

 var i = i || 0; // Cache this at the end of your loop dijit.registry.map(function (widget) { if (+widget.id.replace(/^[^\d]+/, '') < i) { widget.destroyRecursive(); } }); /* Your loop fixed as described in missingno's answer. */ 

Vous êtes tombé dans le vieux piège de la fermeture des fonctions dans une boucle for. Au moment où les feux addOnLoad et les curseurs sont créés, i serai égal à 2 et les deux curseurs essayeront d'utiliser les mêmes noeuds DOM (ce qui n'est pas autorisé).

Vous devez vous assurer de donner une nouvelle copie de i pour tout le monde. Voici une solution rapide:

 for(i=0; i<2; i++){ (function(i){ slider[i] = ... //everything inside here remains the same //except that they now use their own i from the wrapper function //instead of sharing the i from outside. }(i)); } 

Dijit stocke tous les widgets actifs dans le journal et utilise les identifiants comme qualificatifs uniques. Vous ne pouvez pas créer de dijits avec le même identifiant.

Besoin de nettoyer dojo.registry avant de créer un nouveau curseur dijits. Ajoutez ce code avant de déclarer dijit sur test_slider.php

 dijit.registry["input"+ [i]].destroyRecursive(); 

Pouvez-vous attribuer n'importe quel ID de numéro comme ID généré par un nombre aléatoire à 10 chiffres ou quelque chose avec une combinaison date-heure, de sorte que l'identifiant ne sera jamais identique.