Javascript не выполняется внутри теневого DOM

Я работаю над приложением, в котором я должен загрузить другие html-страницы на текущую страницу. Другие веб-страницы являются независимыми приложениями. Я пытаюсь загрузить веб-страницу в теневой DOM. Для этого я использовал приведенный ниже код, где он попытается импортировать test-template.html в shadowRoot. Здесь я не использую тег шаблона, потому что я должен динамически отображать шаблон (используя ajax).

  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
  </head>
  <body>
     <input type="button" onclick="loadTemplate()" value="Load template">
     <div id="template-holder"></div>
     <script>
     function loadTemplate() {
      var templateUrl = "test-template.html",
      templateReceivedCallback = function(response) {
         var div = document.getElementById('template-holder'),
            shadowRoot = div.attachShadow({
                mode: 'open'
            });
        shadowRoot.innerHTML = response;
      };
     $.get(templateUrl, templateReceivedCallback);
     }
  </script>
 </body>

И test-template.html будет выглядеть так:

  <div>Hello from template</div>

 <script>
     alert("this text is from script inside of template")
 </script>

Я могу загрузить упомянутый test-template.html на моей текущей странице, но javascript внутри test-template.html не выполняется. Есть ли способ заставить скрипт работать? Если да, пожалуйста, поделитесь работающим примером. Благодарю.

1 ответ

Решение

Чтобы сделать <script> активный, вы должны сначала вставить загруженный файл в <template> элемент. Затем используйте importNode() метод, который будет клонировать content шаблона и выполнить скрипты внутри.

Вместо:

shadowRoot.innerHTML = response;

Делать:

var template = document.createElement( 'template' )
template.innerHTML = response 
shadowRoot.appendChild( document.importNode( template.content, true ) )
Другие вопросы по тегам