Javascript dojo:按dom节点销毁所有小部件

Javascript dojo:按dom节点销毁所有小部件,javascript,dojo,Javascript,Dojo,我的内容被ajax替换,但有时一个元素在两个页面上具有相同的id(即,主页上的照片在gallery页面上具有相同的id)。这意味着当调用dojo.parser.parse时,小部件将尝试重新添加,并引发以下错误: Error: Tried to register widget with id==____ but that id is already registered 理想情况下,我想做的是在AJAX替换的DOM节点上运行递归。我已经尝试了以下两种方法,但都没有成功(我认为destroyRe

我的内容被ajax替换,但有时一个元素在两个页面上具有相同的id(即,主页上的照片在gallery页面上具有相同的id)。这意味着当调用dojo.parser.parse时,小部件将尝试重新添加,并引发以下错误:

Error: Tried to register widget with id==____ but that id is already registered
理想情况下,我想做的是在AJAX替换的DOM节点上运行递归。我已经尝试了以下两种方法,但都没有成功(我认为destroyRecursive适用于小部件而不是DOM?)


有没有一个好的方法可以做到这一点,或者我需要尝试并确保我的所有id都是不同的吗?

您的思路是正确的,并且您正确地认为destroyRecursive只存在于小部件上。然而,要完成您想要做的事情,有两种选择

如果您在很大程度上使用了小部件,并且所讨论的div经常被用作存储包括小部件在内的内容的存储桶,那么我强烈建议您看看
dijit.layout.ContentPane
。ContentPane是一个小部件,主要关注容器的概念,该容器可以直接接收内容,也可以从URL接收内容,其中可能包括小部件,也可能不包括小部件

现在,在每次页面更改中,您可能都会执行类似的操作:

dojo.xhrGet({
    url: 'something.html',
    load: function(html) {
        dojo.byId('main').innerHTML = html;
        dojo.parser.parse(dojo.byId('main'));
    }
    error: function(error) { ... }
});
使用ContentPane,您可以执行以下操作:

cp.set('href', 'something.html'); //use attr instead of set if < dojo 1.5

基本上,选择节点。。。通过使用
dojo.byNode(node)
,然后使用
destrorecursive(true),可以获得映射为小部件的对象

我解决了一个类似的问题,只需使用dijit.registry.remove('idName')从注册表中删除内容,然后使用destroyRecursive(false)删除内容,然后再重新加载

    if(typeof registry.byId("tableOfContents") != "undefined"){
        registry.byId("tableOfContents").destroyRecursive(false);
        dijit.registry.remove('tableOfContents');
    }

如果您在一个页面上有多个小部件要销毁,下面的解决方案对我很有用

var widg = dijit.findWidgets(dojo.byId('root-id')); // root-id is top div id which encloses all widgets
 $(widg).each(function(){

    dijit.byId($(this).attr("id")).destroy(true);

  });

AMD注释:dojo.forEach-导入“dojo/_base/array”作为数组,然后使用array.forEach | dijit.findwidget-导入“dijit/registry”然后使用registry.findWidgetsHow,如果只在HTML模板(如前导窗格)中定义contentPane,那么您是否可以从javascript访问contentPane?因此,基本上在javascript中,我需要销毁接收该窗格中的小部件。
dojo.query('selector').forEach(function(node){
   dijit.byNode(node).destroyRecursive(true);
});
    if(typeof registry.byId("tableOfContents") != "undefined"){
        registry.byId("tableOfContents").destroyRecursive(false);
        dijit.registry.remove('tableOfContents');
    }
var widg = dijit.findWidgets(dojo.byId('root-id')); // root-id is top div id which encloses all widgets
 $(widg).each(function(){

    dijit.byId($(this).attr("id")).destroy(true);

  });