Динамично вставляющий JavaScript в HTML, который использует document.write

Я думаю, вы должны использовать цикл do-while:

if(c.moveToFirst()) {
    do {
        titles.add(c.getString(name));
        titles.add(c.getString(age));
     } while (c.moveToNext())
}
18
задан Kamiel Wanrooij 10 September 2008 в 13:35
поделиться

6 ответов

Как правило, теги сценария не выполняются при использовании innerHTML. В вашем случае это хорошо, потому что вызов document.write уничтожит все, что уже есть на странице. Однако это оставляет вас без того HTML, который должен был добавить document.write.

Методы манипулирования HTML jQuery будут выполнять сценарии в HTML за вас, трюк состоит в том, чтобы захватить вызовы к document.write и получить HTML в нужном месте. Если это достаточно просто, то подойдет что-то вроде этого:

var content = '';
document.write = function(s) {
    content += s;
};
// execute the script
$('#foo').html(markupWithScriptInIt);
$('#foo .whereverTheDocumentWriteContentGoes').html(content);

Однако это становится сложным. Если сценарий находится в другом домене, он будет загружен асинхронно, поэтому вам придется подождать, пока он не будет готов, чтобы получить контент. Также, что, если он просто запишет HTML в середину фрагмента без элемента оболочки, который вы можете легко выбрать? writeCapture.js (полное раскрытие: я написал его) решает все эти проблемы. Я бы рекомендовал просто использовать его, но, по крайней мере, вы можете посмотреть на код, чтобы увидеть, как он все обрабатывает.

РЕДАКТИРОВАТЬ: Вот страница , демонстрирующая, как звучит желаемый эффект.

15
ответ дан 30 November 2019 в 08:33
поделиться

Я могу заставить некоторое разъяснение сначала удостоверяться, что я получаю проблему?

document.write вызовы добавят содержание к разметке в точке в разметке, в которой они происходят. Например, если Вы будете включать document.write вызовы в функцию, но будете вызывать функцию в другом месте, эти document.write, то вывод произойдет в точке в разметке, которая функция , определил не, где это названо .

Поэтому, чтобы это работало во всех операторах Flickr document.write, должна будет быть часть content в element.innerHTML = content. Этот определенно имеет место?

Вы могли бы быстро протестировать, если это должно работать вообще путем добавления сингла и простой document.write вызов в содержании, которое установлено как innerHTML, и посмотрите то, что это делает:

<script>
  var content = "<p>1st para</p><script>document.write('<p>2nd para</p>');</script>"
  element.innerHTML = content;
</script>

, Если это работает, понятие document.write, работа в наборе содержания как innerHTML из элемента могла бы просто работать.

Мое инстинктивное чувство состоит в том, что это не будет работать, но это должно быть довольно просто для тестирования понятия.

0
ответ дан 30 November 2019 в 08:33
поделиться

Таким образом, Вы используете метод DOM, чтобы создать script элемент и добавить это к существующему элементу, и это затем заставляет содержание добавленного script элемент выполняться? Это звучит хорошим.

Вы говорите, что тег script является частью большей страницы HTML и поэтому не может быть выбран. Разве Вы не можете дать тегу script идентификатор и нацелены на него? Я, вероятно, пропускаю что-то очевидное здесь.

0
ответ дан 30 November 2019 в 08:33
поделиться

document.write является почти столь устаревшим, как они прибывают. Благодаря чудесам JavaScript, тем не менее, можно просто присвоить собственную функцию write метод эти document объект, который использует innerHTML на элементе желания добавить предоставленное содержание.

1
ответ дан 30 November 2019 в 08:33
поделиться

Я создал простую тестовую страницу, которая иллюстрирует проблему:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
        <title>Document Write Testcase</title>
    </head>
    <body>
        <div id="container">
        </div>
        <div id="container2">
        </div>

        <script>
            // This doesn't work!
            var container = document.getElementById('container');
            container.innerHTML = "<script type='text/javascript'>alert('foo');document.write('bar');<\/script>";

            // This does!
            var container2 = document.getElementById('container2');
            var script = document.createElement("script");
            script.type = 'text/javascript';
            script.innerHTML = "alert('bar');document.write('foo');";
            container.appendChild(script);
        </script>
    </body>
</html>

Эта страница предупреждает 'панель' и печатает 'нечто', в то время как я ожидал, что это также предупредит 'нечто' и распечатает 'панель'. Но к сожалению, начиная с эти script тег является частью большей страницы HTML, я не могу выбрать тот тег и добавить его как пример выше. Ну, я могу, но это потребовало бы сканирования innerHTML содержание для script теги и замена их в строке заполнителями и затем вставки их использующий DOM. Звуки не это тривиальный.

5
ответ дан 30 November 2019 в 08:33
поделиться

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

кроме того, эти script тег, кажется, не часть DOM больше после того, как это будет загружено. В нашей среде мой container отделение остается пустым, таким образом, я не могу выбрать эти script тег. Это должно работать, тем не менее, потому что в моем примере выше сценария не становится выполняемым, но все еще часть DOM.

0
ответ дан 30 November 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: