Backbone.js не выполняет document.write в правильное время?
У меня есть своего рода CMS backbone.js, который принимает HTML, а затем отображает его в браузере. Ниже приведен файл шаблона (в формате.hamlc), который отображает объект магистральной страницы.
%h1.text= @page.get('title')
.text.page-content!= @page.get('content')
Это прекрасно работает, пока у меня нет <script>
тег. У меня есть скрипт для виджета (ниже)
<script src='http://www.opentable.com/frontdoor/default.aspx?rid=52900&restref=52900&bgcolor=8AA86B&titlecolor=0F0F0F&subtitlecolor=0F0F0F&btnbgimage=http://www.opentable.com/frontdoor/img/ot_btn_black.png&otlink=FFFFFF&icon=light&mode=short&hover=1'></script>
Этот виджет использует document.write
(что вы можете увидеть, если вы посмотрите на источник). Во-первых, когда я загружаю страницу, она ничего не показывает (я проверил виджет в html-файле сам по себе, и он показывает их обычное ужасное состояние). Когда я проверяю элемент, похоже, что тег script был удален.
Тем не менее, когда я тестирую со следующим:
<script type="text/javascript">
alert(0);
</script>
Это работает. В инспекторе все еще ничего нет.
Наконец, тестирование со следующим:
<script type="text/javascript">
document.write('test');
</script>
Это также работает. Тем не менее, он полностью уничтожает содержимое страницы и просто показывает "тест".
Согласно этой статье об использовании document.write для виджетов, он говорит, что он не может быть запущен после загрузки страницы. Я предполагаю, что здесь происходит то, что document.write запускается после загрузки страницы и уничтожает весь контент, учитывая, что это метод backbone.js, используемый (добавление / замена элементов в DOM после загрузки страницы).
Как я могу заставить свою CMS Backbone.js принимать теги сценария с виджетами document.write, не показывая ничего и не разрушая всю страницу?
3 ответа
Вы вызываете document.write после загрузки страницы, поэтому она перезапишет всю страницу. Вы можете попробовать поместить тег script в iframe или в файл monkey patch document.write, чтобы вести себя по-другому после загрузки страницы. Смотрите лучший ответ на этот вопрос:
Динамически добавленный JavaScript перезаписывает представление HTML-страницы (не код)
Я не могу воспроизвести его, шаблон отображается так, как должно:
$ coffee
coffee> hc = require './src/hamlc'
{ compile: [Function],
template: [Function],
__express: [Function] }
coffee> template = hc.compile ".text.page-content!= @content"
[Function]
coffee> template(content: 'Hello <script>Script</script>')
'<div class=\'page-content text\'>Hello <script>Script</script></div>'
и тег сценария сохраняется. У вас установлена последняя версия?
Если я правильно понимаю, вы пытаетесь включить тег скрипта для виджета в шаблон, что означает, что он вставляется после того, как начальный DOM готов. Это не сработает по причинам, которые вы упомянули; когда скрипт выполняется, он заменит все в DOM.
Вам необходимо загрузить скрипт до завершения начального DOM, то есть в < head
> или в начале < body
>. Это, в свою очередь, означает, что вы должны включить тег script в исходный HTML-код, предоставляемый сервером, а не пытаться динамически генерировать его на стороне клиента.