Как встроить объект HTML-документа в DOM, не затрагивая внешний сайт? - PullRequest
0 голосов
/ 28 августа 2018

У меня есть проблема, которую я еще не смог решить сам. Короче говоря: я пишу приложение openui5, которое преобразует XML в HTML, и я хочу, чтобы оно выводило преобразованный HTML на той же странице. Однако, когда я добавляю объект HTML-документ в мой DOM, это влияет на «внешний» HTML (приложение UI5).

Проблемы:

  • Нажатие на ссылку (href = "# section") во встроенном HTML-коде изменяет хэш сайта (таким образом, нарушая механизм маршрутизации UI5)
  • CSS во встроенном HTML применяется к внешнему HTML
  • загрузка встроенного тела не выполняется

Поэтому мне нужно встроить объект Document в DOM.

Встраивание статического HTML работает следующим образом:

<embed src="embed.html"/>

В этом случае полученный DOM выглядит как здесь . Перечисленные выше проблемы не существуют.

Однако мой преобразованный HTML - это не файл на сервере, а созданный во время выполнения на клиенте; поэтому мне нужно встроить объект Document (или DocumentFragment).

Если я сделаю это следующим образом: (sHtml содержит строку HTML, target - это идентификатор <div>) ...

function embed() {
    var oHtml = new DOMParser().parseFromString(sHtml, "text/html"),
        oTarget = document.getElementById("target");

    oTarget.appendChild(oHtml.documentElement);
}

... проблемы выше do существуют. Внешнее тело HTML синее, потому что стиль внутреннего говорит, что элементы тела - это. Самое главное, что хеш меняется при нажатии на ссылку.

В данном случае DOM: см. Здесь

Итак, мой последний вопрос:

Можно ли даже обработать узел документа HTML, как если бы он был внешним?

Я пытался использовать <embed>, <div>, <iframe> и другие сценарии добавления содержимого документа в DOM, но если это просто не сработало. Это , как выглядит мое приложение UI5.

Так что, надеюсь, кто-нибудь может помочь мне с этой проблемой:)

Спасибо очень заранее!

Леннарт


Вот мои минимальные примеры, если вы хотите играть:

index.html:

<html>
    <head>
        <title>Embedding</title>
        
        <script type="text/javascript">
            var sHtml =
            "<html>\
                <head>\
                    <style type=\"text/css\">\
                        body {\
                            background: lightskyblue;\
                        }\
                    </style>\
                </head>\
\
                <body onload=\"alert('embedded')\">\
                    <div style=\"position: absolute; left: 100px\">\
                        <span>I'm embedded.</span>\
                        <a href=\"#my-section\">Link</a>\
                    </div>\
                </body>\
            </html>";
            
            function embed() {
                var oHtml = new DOMParser().parseFromString(sHtml, "text/html"),
                    oTarget = document.getElementById("target");
                
                oTarget.appendChild(oHtml.documentElement);
            }
        </script>
    </head>
    
    <body onload="embed()">
        <span>I'm outside.</span>
        <div style="position: absolute; left: 300px; width: 500px; height: 300px; background: yellow">
<!--            <embed src="embed.html"/>-->
            <div id="target"/>
        </div>
    </body>
</html>

embed.html:

<html>
    <head>
        <style type="text/css">
            body {
                background: lightskyblue;
            }
        </style>
    </head>
    
    <body onload="alert('embedded')">
        <div style="position: absolute; left: 100px">
            <span>I'm embedded.</span>
            <a href="#my-section">Link</a>
        </div>
    </body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...