【问题标题】:Dojo: placing the same dom-node a second time doesn't work on IE11Dojo:第二次放置相同的 dom 节点在 IE11 上不起作用
【发布时间】:2017-12-08 15:41:14
【问题描述】:

这是一个我只是出于科学兴趣而提出的问题。我没有发现与我的问题相关的问题,但我已经制定了解决方法。

问题: 我的小部件中有一个我想要放置的节点,它与小部件的逻辑上下文相关,是已经构建的其他三个 dom 节点之一。我将domconstruct.place() 用于此任务,并带有“仅”选项以轻松替换可能已放置在此节点中的所有子节点。

它适用于 Chrome、Firefox 和 Edge。在 Internet Explorer 11(以及旧版本)中,每个已构建的 dom 节点将仅在第一次放置。如果第二次放置 dom 节点,则目标节点将为空(旧的子节点将被删除,不会添加新的子节点或至少只有一个没有内容的子节点)。

这是一个简化的JSFiddle 示例来说明问题。

这个小提琴已经包含一个解决方法:只需在放置时重新创建节点。因此,第一个按钮将与 ie 一起使用,每次放置“test1”。按钮 2 和 3 将第一次工作,但从第二次开始不会放置任何东西。如果发生这种情况,第一个按钮仍然可以使用。

不幸的是,在我的真实代码中,提供的解决方法是不可能的。我目前的解决方案包括嗅探 ie 并将所有节点放在同一个地方,使用可见性属性。

如开头所述,我对这个问题很感兴趣。有人知道这种行为吗?它是一个道场/即错误吗?我做错了吗?

【问题讨论】:

    标签: javascript internet-explorer dojo


    【解决方案1】:

    这不是 dojo 或 IE 错误,它只是浏览器删除节点的方式不同。当您将only 属性用于place() 函数时,您的容器节点的内容将被node.removeChild() 清除。虽然您有一个指向您的节点的链接,但它仍然存在于内存中,并且只会从树中删除。不同的浏览器以不同的方式执行此操作。在您的情况下,chrome 和 firefox 将您的节点及其内容保留在内存中,而 IE 仅保留节点,但 innerHTML 被清除。

    Here is same question, but regarding IE 7

    在我看来你有几个选择:

    1. 每次都像在 div1 示例中那样创建新节点

    2. 将所有节点同时放入容器并切换它们的可见性。

    3. 为您的节点创建模板小部件并每次都实例化它。

    1 和 2 你已经尝试过了。也许还有其他选择,但我目前看不到。

    【讨论】:

    • 感谢您的精彩解释和其他主题。为了完整起见,我不得不提到 Edge 像 FF 和 Chrome 一样处理 removeChild,所以 IE 非常孤独地处理这种处理。不幸的是,我保留在内存中并希望重用的这些节点是由另一个框架在 dojo 之上创建的节点。这个框架很烦人,因为它通过在“配置”中定义它们来创建许多东西,并且创建发生在启动时。我不知道以编程方式(轻松)重新创建此对象的可能性。所以解决方案 1 和 3 永远不会对我有用。解决方案 2 运行良好,我很满意 :)
    • @Onsokumaru 不,谢谢。嗯,现在我明白你的问题了。所以看起来你真的不能在这里做任何事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2013-08-06
    • 2016-01-03
    相关资源
    最近更新 更多