我怎样才能 update/refresh Google 我动态添加到我的页面的 MDL 元素?

How can I update/refresh Google MDL elements that I add to my page dynamically?

我正在使用 Google Material 设计组件,为了简单起见,这些组件被剥离,然后在加载页面时更完整地呈现。简化如下以说明问题:

index.html 文件中显示的内容:

<div class="switch"></div>

加载页面时呈现给 DOM 的内容:

<div class="switch">
   <div class="switch_track"></div>
   <div class="switch_thumb"></div>
</div>

我正在创建一个拖放 HTML 编辑器,并且每个组件类型都有模板文件。开关的模板文件很简单:

switch.html

<div class="switch"></div>

问题是当我将其拖到 canvas 时。 jQuery 查看 switch.html 并将 <div class="switch"></div> 呈现给 DOM,但由于它是动态添加的,因此添加附加内容的脚本不会 "seen"轨道和拇指标签。

我该如何解决这个问题,以便在更新 DOM 时重新运行任何脚本?理想情况下,我想避免接触任何 Material 设计脚本文件。

我在 this MDL Github forum post from MDL contributor Jonathan Garbee 中找到了解决方案:

The component handler [ componentHandler.upgradeDom() ] will handle upgrading everything if you just call it with no parameters.

所以我的解决方案的伪代码是:

 // Callback function of jquery-ui droppable element
 drop: function(event, ui) {
    // Add the element from it's template file
    $.get("templates/" + elem + ".html", function(data) {
      $("#canvas").append(data);

      // Expand all new MDL elements
      componentHandler.upgradeDom();
    });
 });

对于 Material Design Lite (MDL) 框架的未来读者和用户,您还可以单独刷新动态添加的元素(而不是组合整个 DOM)。

例如,componentHandler.upgradeDom("mdl-menu")将升级mdl-menu个元素。

Further reading here.

您可以使用 componentHandler.upgradeDom(); 动态升级元素或使用以下行降级现有元素并再次升级它

类型 1:

   $(".data").find(".is-upgraded").each(function(){                 
       $(this).removeAttr("data-upgraded").find(".mdl-switch__ripple-container,.mdl-switch__track").remove();  //downgrade the existing upgraded elements
   });
    componentHandler.upgradeDom(); // upgrade the elements

类型 2:

 $(".data").html("{{content}}").promise().done(function(){                 
           componentHandler.upgradeDom(); // upgrade the newest elements 
 });