Dojo - 当DOM节点被销毁时销毁提示工具部件

3
我在一个有许多domConstuct.destroy()和domConstuct.place()的页面上使用dijit/tooltips。所以每当我从DOM中删除一些节点时,我想要删除附加到这些节点的工具提示(tooltips)。目前我的页面上工具提示(widgets)的数量不断增长。
是否有一种方法可以在相应的DOM节点被删除时自动删除小部件(widget),或者检查现有工具提示(widget)的连接DOM节点是否仍然存在?

你能告诉我你是如何实例化你的工具提示的吗?你使用 connectId 还是 Tooltip.show("...", myNode)(临时)或者使用 selector 属性? - g00glen00b
2个回答

3

在Dimitri的回答的帮助下,我找到了解决我的问题的方法。现在我不再为每个工具提示创建单独的工具提示小部件,而是使用它的.addTarget()方法将所有工具提示放在一个工具提示中。解决方案的第二部分是迭代工具提示的connectId属性并检查DOM节点是否仍然存在。我必须使用Javascript本机方法.contains()和.getElementById()来执行此操作,因为Dojo的dom.byId()和query()给了我虚假结果。所以,我的代码现在看起来像这样:

// creating Tooltip
var tooltips = new Tooltip({
    getContent: function(matchedNode){
        return matchedNode.getAttribute("tooltiptext");
    }
});

// adding tooltips
tooltips.addTarget(nameNode);

// deleting sufficient connects
for(var i = tooltips.connectId.length -1; i >= 0 ; i--){
    if(!document.contains(tooltips.connectId[i]) && !document.getElementById(tooltips.connectId[i])){
        tooltips.removeTarget(tooltips.connectId[i]);
    }
}

我必须同时使用.contains()和.getElementById(),原因是我给一些节点附加了工具提示,这些节点具有id,而另一些节点则没有,而Tooltip小部件将其中一些存储为字符串(id),另一些存储为DOM节点。

3
你可以一次将单个工具提示小部件附加到多个节点,这可能是解决方案,因为您不必再“管理”工具提示了。所有工具提示都创建了一个工具提示小部件,因此您不必再销毁它。
最好的方法是使用“选择器”属性,如参考指南中所述。
new Tooltip({
    connectId: "myTable",
    selector: "tr",
    getContent: function(matchedNode){
        return matchedNode.getAttribute("tooltipText");
    }
});

如果它们没有共同的connectId和/或selector,那么您仍然可以使用单个工具提示,通过使用{{link1: addTarget()}}函数将目标添加到同一工具提示实例中。
要删除目标,您还可以使用removeTarget(),它接受一个DOM节点(因此只需传递要删除的DOM节点)。
如果这两种解决方案都无法帮助您,我想知道您如何实例化工具提示,有多种方法可以做到这一点。例如,通过使用connectId或使用show()函数创建临时工具提示。

我为每个connectId创建了一个新的Tooltip实例,我甚至不知道selector属性。现在我可以说问题出在Dojo文档上(我经常发现它们令人困惑且缺乏信息),但事实是,我没有详细阅读有关此事的文档。无论如何,非常好的答案,谢谢。 - Zemljoradnik
不幸的是,我现在意识到我仍然有一个类似的问题,如果不是同样的问题。提示工具的数量不会增加,但连接的数量会增加。如果我销毁包含多个具有提示工具连接的节点的DOM节点,则必须检查每个后代节点是否与提示工具连接,以便在销毁DOM节点之前将其作为目标删除。有什么想法吗? - Zemljoradnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接