2011-10-12 12 views
6

tôi gặp lỗi này và tôi không biết cách giải quyết. Tôi đã đọc this link trước đây.Đã cố đăng ký tiện ích với id == valores0 nhưng id đó đã được đăng ký

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> 

Vấn đề: Đầu tiên nhấp vào trình btn tất cả hoạt động tốt, 5 thanh trượt được nhập khẩu. nhấp chuột thứ hai, một bản cập nhật được cho, nhưng tôi nhận được tin nhắn này:

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

[Demo video]2

Trả lời

3

Chỉ cần thêm vào câu trả lời của @ missingo và nhận xét của @ Kevin. Bạn có thể xem qua các di chuyển hiện có bằng cách xem trong sổ đăng ký:

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

câu trả lời này phù hợp với tôi khi điều kiện if bị xóa. Bạn có thể giải thích điều kiện được không? –

+0

Đây là câu trả lời 6 năm tuổi. Tôi nghi ngờ việc đăng ký vẫn được đặt ra theo cùng một cách. Ý tưởng là để loại bỏ các widget cũ, nhưng tôi không chạm vào dojo nhiều những ngày này, do đó, không có kết nối trên các phiên bản mới. – fncomp

1

Bạn rơi vào cái bẫy lâu đời của việc đóng cửa chức năng bên trong một vòng lặp for. Bởi thời gian addOnLoad cháy và thanh trượt được tạo ra, i sẽ bằng 2 và cả hai thanh trượt sẽ cố gắng sử dụng cùng một nút DOM (một cái gì đó không được phép).

Bạn cần đảm bảo rằng bạn cung cấp một bản sao mới là i cho mọi người. Sau đây là một sửa chữa nhanh:

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

thiếu sót, những gì bạn đề xuất giải quyết vấn đề. Nhưng nếu tôi có một .load (dojo.php) và mỗi lần tôi gửi một biểu mẫu, tôi sẽ tải lại nội dung dojo, tôi lại gặp vấn đề với một Tried to register id ... Bạn có hiểu ý tôi không? mỗi lần tôi gọi võ đường tôi có x ID khác nhau. Nhưng đối với mỗi tải, nhóm các id là như nhau. – user455318

+0

Tôi biết php nhiều. Những gì bạn có nghĩa là bằng cách gọi dojo và tại sao các id là cùng một vấn đề với bạn? – hugomg

+0

vấn đề là như sau: tôi có một nút khi nhấn nhập nội dung dojo này vào tệp khác. Vấn đề là nút đó có thể được nhấn nhiều lần và có thể làm mới nội dung. Sau một lần nhấp chuột thứ hai trong nút đó, tôi nhận được một lần nữa: Cố gắng đăng ký widget với id == input0 nhưng id đó đã được đăng ký. – user455318

1

Dijit lưu trữ tất cả các tiện ích đang hoạt động trong dijit.registry và sử dụng id làm vòng loại duy nhất. Bạn không thể tạo các dijits có cùng id.

Cần xóa sạch dojo.registry trước khi tạo một thanh trượt mới. Thêm mã này trước khi kê khai dijit trên test_slider.php

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

Tôi đã thêm mã của bạn sau hàm trả về() {và tôi nhận được lỗi này: >>> dijit.registry ["input" + i] không xác định (13 trong phạm vi 4). Ý của bạn là dijit.registry ("input" + [i]).destroyRecursive()? tốt trong trường hợp này tôi nhận được dijit.registry không phải là một chức năng (13 trong phạm vi 4) – user455318

+1

Xin lỗi tôi gõ nhầm câu trả lời của tôi, bạn cần phải đặt [i]. Thông báo lỗi thứ hai là lý do tại sao dijit.registry là một mảng chứ không phải một hàm. dijit.registry ["đầu vào" + [i]]. destroyRecursive(); – linkamp

+0

'đầu vào' + [i] sẽ gọi [i] .toString() sẽ trả về i, điều này là thừa. Ý của bạn là 'input [' + i + ']'? – FloydThreepwood

0

bạn có thể gán bất kỳ số ID như ID được tạo ra bởi 10 chữ số ngẫu nhiên hoặc một cái gì đó với sự kết hợp datetime để id sẽ không bao giờ giống nhau.

+0

Tôi không thể sử dụng một ID duy nhất. Tôi cần các tên id giống nhau giữa JS và html – user455318