HTML5 Импорт с динамически созданной ссылкой

Я пытаюсь понять, почему HTML5 Import не работает с динамически созданным link элемент.

Первый пример Это нормально работает.

main_page.html:

<head>
    <link rel="import" href="import.html">
</head>
<body>
    <script>
        var imported = document.querySelector('link[rel="import"]').import;
        var el = imported.querySelector('#foo');
        document.body.appendChild(el);
    </script>
</body>

import.html:

<div id="foo">foo</div>

Второй пример По какой-то причине это не работает.

main_page.html:

<body>
    <script>
        var link = document.createElement('link');
        link.rel = 'import';
        link.href = 'import.html';
        document.head.appendChild(link);

        var imported = document.querySelector('link[rel="import"]').import;
        var el = imported.querySelector('#foo');
        document.body.appendChild(el);
    </script>
</body>

import.html:

<div id="foo">foo</div>

Почему это происходит и как это можно исправить?

1 ответ

Решение

Это произошло бы потому, что link еще не загружен, когда вы звоните querySelector('link[rel="import"]'),

Один из способов исправить это - запустить следующий код, когда ссылка загружена с помощью link.onload, Вы даже можете сохранить это querySelector вызов, который должен сделать это немного быстрее:

 var loadFoo = function(event) {
   var imported = event.target.import;
   var el = imported.querySelector('#foo');
   document.body.appendChild(el);
 }

 var link = document.createElement('link');
 link.rel = 'import';
 link.href = 'import.html';
 link.onload = loadFoo;
 document.head.appendChild(link);

Вы можете (и, вероятно, должны) добавить onerror обработчик для запуска, когда что-то идет не так.

Другие вопросы по тегам