Javascript dojo:按dom节点销毁所有小部件
我的内容被ajax替换,但有时一个元素在两个页面上具有相同的id(即,主页上的照片在gallery页面上具有相同的id)。这意味着当调用dojo.parser.parse时,小部件将尝试重新添加,并引发以下错误: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
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);
});