2011-10-12 86 views
6

我得到這個錯誤,我不知道如何解決。我之前閱讀this link試圖註冊id爲id = valores0的小部件,但該ID已經註冊

編輯: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> 

問題:首先單擊提交BTN一切運作良好,5個滑塊都是進口的。第二次點擊,更新是應該的,但我得到這個消息:

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

[演示視頻]2

回答

3

只是添加到@ misso的回答和@ Kevin的評論。您可以通過查看註冊表來查看現有的dijits:

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. 
*/ 
+0

當if條件被刪除時,這個答案適用於我。你能解釋一下情況嗎? –

+0

這是一個六歲的答案。我懷疑登記處仍然以同樣的方式佈置。這個想法是刪除舊的小部件,但我最近沒有觸及dojo,所以沒有連接到新版本。 – fncomp

1

你在內部建立功能關閉for循環的古老陷阱下跌。在addOnLoad觸發並創建滑塊時,i將等於2,並且這兩個滑塊將嘗試使用相同的DOM節點(不允許的內容)。

您需要確保您爲每個人提供i的新副本。下面是一個快速修復:

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)); 
} 
+0

缺失,您建議解決問題。但是,如果我有一個.load(dojo.php),並且每當我提交表單時,我將重新加載dojo內容,我又遇到了一個問題,試圖註冊ID ...你明白我的意思嗎?每次我打電話給dojo時,我都有x個不同的IDS。但是對於每個負載,這組id是相同的。 – user455318

+0

我知道PHP很多。通過打電話給道場,你的意思是什麼?爲什麼這些道德對你來說是同樣的事情? – hugomg

+0

問題如下:我有一個按鈕,當按下時將此dojo內容導入到另一個文件。關鍵是,該按鈕可以被多次按下,並且應該刷新內容。在第二次點擊該按鈕後,我再次得到:嘗試使用id == input0註冊小部件,但該ID已註冊。 – user455318

1

Dijit的商店在dijit.registry所有活動部件,並使用ID的獨特預選賽。您無法使用相同的ID創建dijits。

需要在創建新滑塊dijits之前清理dojo.registry。加上test_slider.php

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

我在返回函數(){}後添加了你的代碼,並且我得到這個錯誤:>>> dijit.registry [「input」+ i]未定義(13超出範圍4)。你的意思是dijit.registry(「input」+ [i])。destroyRecursive()?以及在這種情況下,我得到dijit.registry不是一個功能(13超出範圍4) – user455318

+1

對不起,我打錯了我的反應,你需要把[我]。第二個錯誤信息是爲什麼dijit.registry是一個數組而不是函數。 dijit.registry [「input」+ [i]]。destroyRecursive(); – linkamp

+0

'input'+ [i]將調用[i] .toString(),這將返回i,這是多餘的。你的意思是'input ['+ i +']'? – FloydThreepwood

0

聲明dijit的前這段代碼可以爲您分配了10位隨機數字或日期時間與組合產生的東西像ID任意數量的ID,這樣的ID將永遠不會相同。

+0

我無法使用唯一的ID。我需要JS和html之間相同的id名稱 – user455318