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-код, предоставляемый сервером, а не пытаться динамически генерировать его на стороне клиента.

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