document.write не работает, но console.log
Поэтому я создаю массив из событий, созданных определенным пользователем на facebook, у меня есть все работающие API-интерфейсы и все, но я не могу поменять его document.write по какой-то причине.
for( var i = 0 ; i < response.length ; i++ ) < if (response[i]['eid'] >0) < document.write([response[i]['name']] + '' + response[i]['description']), console.log([response[i]['name']] + '' + response[i]['description']); > >
Когда я запишу его, это прекрасно, но я не могу его отобразить на странице. alert() также работает.
Любые идеи, как я могу выплюнуть эти переменные?
Когда вы вызываете document.write после загрузки страницы, он перезаписывает текущую страницу, которая не содержит возвращенных данных или циклов, итераций по этим данным. Поскольку вы используете API FB, я предполагаю, что это выполняется после загрузки страницы. Попробуйте использовать решение для шаблонов на стороне клиента, чтобы отобразить все эти данные. Таким образом вам не придется делать кучу конкатенации строк, чтобы создать HTML для ваших данных.
Если единственной целью страницы является отображение результатов вызова FB api, то пока ваша страница будет настроена как действительный HTML, а весь ваш javascript содержится в главной части документа, document.write должен работать. document.write обычно используется только до загрузки страницы и внутри тела. Как только страница загружается, вся часть тела документа записывается и заменяется. Поэтому, если любой из ваших скриптов находится внутри тела, он также будет заменен.
На мой взгляд, гораздо лучшей альтернативой является наличие div и заполнение div результатами.
var results = ""; for( var i = 0 ; i < response.length ; i++ ) < if (response[i]['eid'] >0) < results += response[i]['name'] + '' + response[i]['description']; console.log(response[i]['name'] + '' + response[i]['description']); > > document.getElementById("results").innerHTML = results;
Изменение: мое объяснение выше неверно, document.write переписывает весь документ, если он используется после загрузки страницы. Мое решение выше по-прежнему на 100%.
Принятый ответ выше не на 100% правильный… приведенный ниже код наглядно демонстрирует, что даже когда документ перезаписывается, по крайней мере, функции и переменные, уже установленные в глобальном объекте (окне), не теряются, и они все еще запустить. Поэтому, если вы зацикливаете данные, которые уже установлены, он все равно будет запускаться и отображать результаты, поэтому проблема с этим связана скорее, чем с переписанным javascript.
window.onload = function () < setTimeout(function () < for (i = 0; i < 10; i++) // this runs 3 seconds after the page loads, so after the first iteration // the entire document is erased and overwritten with 'hi', // however this loop continues to run, and write() continues to execute, // showing that the javascript still exists and operates normally. write(); >, 3000); >; // this variable will still exist after the page is overwritten window.someVar = "foo"; // this function still exists and executes after the page is overwritten function write() hello
Перестал работать document.write()
перестал работать вот такой код, не могу понять почему. Проблемма в переменной Х, но какая? Раньше работал.
x = <> div class='litle-tizer-baner' style='width: 350px; height: 350px; border: 1px solid #666;'> h1>Testh1> img alt="1351102311" class="menu_icon" src="http://localhost:3000/uploads/img/1351102311.gif" title="тайтлы" /> p style='font-size:11px;'> еще описание p> div> >.toString(); document.write(x);
document.write
Подскажите что не так? Фрагмент HTML работает как должен Такой JavaScript не работает:
document.write()
var nW = window.open("http://www.ya.ru"); nW.document.write("<input type =button value = ‘CLICK’.
Document write can be a from eval
исходник var i,j; document.write("<table border=\"1\" cellspacing=\"0\" cellpadding=\"2\".
GetElementById и document.write
Искал подобную тему на форуме и в поисковике. Было очень много про getElementById, но практически.
JavaScript не работает после document.write
Я использую jQuery BlockUI для открытия новой веб-страницы, которая занимает некоторое время из-за большого количества запросов к базе данных со следующим javascript:
function productSheet(url2) < $.blockUI.defaults.overlayCSS = <>; $.blockUI(< >); $.ajax( < url: url2, success: function (respones) < var win = window.open(); with (win.document) < open(); write(respones); close(); >> >); >;
На новой странице я получил jQuery JavaScript и ссылку на внешний скрипт jQuery. Однако при рендеринге страницы после JavaScript выше мой сценарий выдает ошибку для: «$ undefined». Я могу обновить страницу, и все начинает работать, и я не получаю никаких ошибок скрипта. Эта проблема возникает только при отладке в IE 9, в Firefox все работает (ошибки JavaScript и сценарий не работают). Кто-нибудь имеет представление о том, какая проблема может быть? РЕДАКТИРОВАТЬ: Отображение iam страницы — это представление MVC 3. Таким образом, сценарий выше относится к действию MVC, которое возвращает это представление:
@model WebApplication.Controllers.ProductSheetModel @if (Model.IsPDFExport == false) < @Html.DisplayFor(model =>model.ArticleMain, "ProductSheetHeader") > . some more partical views. Текст внутри TD.
Также существует метод document.writeln(str) – не менее древний, который добавляет после str символ перевода строки "\n" .
Только до конца загрузки
Во время загрузки браузер читает документ и тут же строит из него DOM, по мере получения информации достраивая новые и новые узлы, и тут же отображая их. Этот процесс идёт непрерывным потоком. Вы наверняка видели это, когда заходили на сайты в качестве посетителя – браузер зачастую отображает неполный документ, добавляя его новыми узлами по мере их получения.
Методы document.write и document.writeln пишут напрямую в текст документа, до того как браузер построит из него DOM, поэтому они могут записать в документ все, что угодно, любые стили и незакрытые теги.
Браузер учтёт их при построении DOM, точно так же, как учитывает очередную порцию HTML-текста.
Технически, вызвать document.write можно в любое время, однако, когда HTML загрузился, и браузер полностью построил DOM, документ становится «закрытым». Попытка дописать что-то в закрытый документ открывает его заново. При этом все текущее содержимое удаляется.
Текущая страница, скорее всего, уже загрузилась, поэтому если вы нажмёте на эту кнопку – её содержимое удалится:
Из-за этой особенности document.write для загруженных документов не используют.
В некоторых современных браузерах при получении страницы с заголовком Content-Type: text/xml или Content-Type: text/xhtml+xml включается «XML-режим» чтения документа. Метод document.write при этом не работает.
Это лишь одна из причин, по которой XML-режим обычно не используют.
Преимущества перед innerHTML
Метод document.write – динозавр, он существовал десятки миллионов лет назад. С тех пор, как появился и стал стандартным метод innerHTML , нужда в нём возникает редко, но некоторые преимущества всё же есть.
- Метод document.write работает быстрее, фактически это самый быстрый способ добавить на страницу текст, сгенерированный скриптом. Это естественно, ведь он не модифицирует существующий DOM, а пишет в текст страницы до его генерации.
- Метод document.write вставляет любой текст на страницу «как есть», в то время как innerHTML может вписать лишь валидный HTML (при попытке подсунуть невалидный – браузер скорректирует его).
Эти преимущества являются скорее средством оптимизации, которое нужно использовать именно там, где подобная оптимизация нужна или уместна.
Однако, document.write по своей природе уникален: он добавляет текст «в текущее место документа», без всяких хитроумных DOM. Поэтому он бывает просто-напросто удобен, из-за чего его нередко используют не по назначению.
Антипример: реклама
Например, document.write используют для вставки рекламных скриптов и различных счётчиков, когда URL скрипта необходимо генерировать динамически, добавляя в него параметры из JavaScript, например:
Закрывающий тег в строке разделён, чтобы браузер не увидел и не посчитал его концом скрипта.
Здесь вместо : обратный слеш \ обычно используется для вставки спецсимволов типа \n , а если такого спецсимвола нет, в данном случае \/ не является спецсимволом, то будет проигнорирован. Так что получается такой альтернативный способ безопасно вставить строку .
Сервер, получив запрос с такими параметрами, обрабатывает его и, учитывая переданную информацию, генерирует текст скрипта, в котором обычно есть какой-то другой document.write , рисующий на этом месте баннер.
Проблема здесь в том, что загрузка такого скрипта блокирует отрисовку всей страницы.
То есть, дело даже не в самом document.write , а в том, что в страницу вставляется сторонний скрипт, а браузер устроен так, что пока он его не загрузит и не выполнит – он не будет дальше строить DOM и показывать документ.
Представим на минуту, что сервер ads.com , с которого грузится скрипт, работает медленно или вообще завис – зависнет и наша страница.
В современных браузерах у скриптов есть атрибуты async и defer , которые разрешают браузеру продолжать обработку страницы, но применить их здесь нельзя, так как рекламный скрипт захочет вызвать document.write именно на этом месте, и браузер не должен двигаться вперёд по документу.
Альтернатива – использовать другие техники вставки рекламы и счётчиков. Примеры вы можете увидеть в коде Google Analytics, Яндекс.Метрики и других.
Если это невозможно – применяют всякие хитрые оптимизации, например заменяют метод document.write своей функцией, и она уже разбирается со скриптами и баннерами.
Итого
Метод document.write (или writeln ) пишет текст прямо в HTML, как будто он там всегда был.
- Этот метод редко используется, так как работает только из скриптов, выполняемых в процессе загрузки страницы. Запуск после загрузки приведёт к очистке документа.
- Метод document.write очень быстр. В отличие от установки innerHTML и DOM-методов, он не изменяет существующий документ, а работает на стадии текста, до того как DOM-структура сформирована.
- Иногда document.write используют для добавления скриптов с динамическим URL. Рекомендуется избегать этого, так как браузер остановится на месте добавления скрипта и будет ждать его загрузки. Если скрипт будет тормозить, то и страница – тоже. Поэтому желательно подключать внешние скрипты, используя вставку скрипта через DOM или async/defer . Современные системы рекламы и статистики так и делают.