Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Динамическая подгрузка HTML+javascript (https://javascript.ru/forum/misc/77866-dinamicheskaya-podgruzka-html-javascript.html)

pokk 27.06.2019 09:13

Динамическая подгрузка HTML+javascript
 
Добрый день. Есть у меня сайт состоящий из несколько страниц, переключение которых осуществляется вкл/выкл отображения div, т.е при загрузке index.html загружаются все страницы.
Теперь же одна из страниц сильно разрослась, и я её хочу убрать, вынести в другой файл и соответственно вынести JS который обрабатывается на этой странице.
Сделал пока так:
HTMLElement.prototype.load = function (url,id) {
    // var el = this; // сслыка на DOM-объект
    var el=document.getElementById(id);
    var http = new XMLHttpRequest();
    http.open("GET", url);
    http.onreadystatechange = function () {
        if(http.readyState != 4 && http.status != 200) return; // можно ошибки обрабатывать
        el.innerHTML = http.responseText;
    }
    http.send(null);
}

Где Html сайт выглядит примерно так:
<script>
function test(){
	alert("13123");
}
</script>
<div class="steeldetail_block" id="sdb2">
<input type="button" value="Test" onclick="test();">
....
</div>


HTML загружаться нормально, а вот скрипт не работает =(
Видел решение проблемы вызов через eval функции, но это если js файл отдельно подгружается, а как быть если он вместе с HTML загрузился?

Отдельную страницу хочу сделать не зависимой, и внутри неё будет inline js, может быть CSS(собираеться через gulp), для того что бы было меньше запросов при погрузке страниц.

Dilettante_Pro 27.06.2019 16:48

Цитата:

Сообщение от pokk
Отдельную страницу хочу сделать не зависимой

Так может грузить ее в iframe?

Malleys 28.06.2019 07:49

Там, где у вас в 8-ой строке написано...
el.innerHTML = http.responseText;


Замените на...
el.innerHTML = http.responseText;

for(const oldScript of el.querySelectorAll("script")) {
	const script = document.createElement("script");
	script.textContent = oldScript.textContent;
	el.appendChild(script);
	script.remove();
}


А зачем вам добавлять метод load ко всем HTML-элементам? Может достаточно будет статичного метода?

pokk 28.06.2019 08:23

Malleys, Круто, то что надо!!!!!!!

Только как это работает ? Считываем все скрипты, которые есть в ответном HTML создаем объект с ним и добавляем его в текший объект скрипта?

SuperZen 28.06.2019 14:28

если используется какой-нибудь сборщик типа webpack'а, можно сделать
https://webpack.js.org/guides/code-splitting/
https://webpack.js.org/guides/lazy-loading/

и еще какой-нибудь mvvm
https://github.com/jorgebucaran/hyperapp
https://reactjs.org

но это все долго если не в теме ) уже...

destus 28.06.2019 21:25

Дополню предыдущий ответ возможностью использования нативного dynamic import, который уже в stage 4
https://github.com/tc39/proposal-dynamic-import

pokk 01.07.2019 05:13

Цитата:

и еще какой-нибудь mvvm
https://github.com/jorgebucaran/hyperapp
https://reactjs.org
Глянул в эту сторону, есть пару вопросов.
1) Где происходит рендеринг? Так как я пишу web под встраиваемые системы(250кб всей памяти), то на сервере не могу выполнять рендеринг, а на клиенте пишут что это медленно работает =(.
2) Можно ли все компоненты собрать в кучу, т.е скомпилировать монолитный Html+js перед тем как залить его на сервер.

Мне нравиться идея, создание компонента HTML+JS, но останавливаю предыдущие вопросы =(


Часовой пояс GMT +3, время: 01:31.