Рефакторинг функции, которая использует window.open для использования DOM, а не write ()

У меня есть приложение, которое использует window.open() для создания динамических всплывающих окон. К сожалению, у меня возникли проблемы с созданием содержимого новых окон с использованием стандартных функций DOM (createElement, appendChild), и я перешел на использование document.write() для создания страницы.

Конкретно, как я могу выйти из этого:

function writePopup()
{
    var popup = window.open("", "popup", "height=400px, width=400px");
    var doc = popup.document;
    doc.write("<html>");
    doc.write("<head>");
    doc.write("<title>Written Popup</title>");
    doc.write("</head>");
    doc.write("<body>");
    doc.write("<p>Testing Write</p>");
    doc.write("</body>");
    doc.write("</html>");
    doc.close();
}

К функции, которая создает такое же всплывающее окно с помощью DOM?

Обновлено: я подумал об использовании абсолютно позиционированного элемента для имитации всплывающего окна, и, хотя он выглядит лучше, пользователи должны иметь возможность распечатать отображаемую информацию.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
792
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Почему бы не использовать библиотечную функцию, такую ​​как http://plugins.jquery.com/project/modaldialog, вместо того, чтобы изобретать колесо?

[РЕДАКТОР

function writePopup(){
    var popup = window.open("", "_blank", "height=400px, width=400px");
    var doc = popup.document;
    doc.title = 'Written Popup';

    var p = doc.createElement('p');
    p.innerHTML = 'Testing Write';
    doc.body.appendChild(p);
}

Пользователи должны иметь возможность распечатать содержимое всплывающего окна, что исключает все, что использует фальшивое всплывающее окно, например этот модуль.

Dan Monego 05.11.2008 18:21

вы мог используете CSS, чтобы скрыть все, кроме всплывающего окна (div) при печати ... новое окно, вероятно, проще, но это все еще возможно без него.

nickf 05.11.2008 22:06

Можно ли было бы иметь другую страницу, которая генерирует динамический контент и открывать ее, передавая аргументы, которые идентифицируют контент, который вы хотите сгенерировать, вместо попытки записи в новое окно?

Просто выполняя быстрые тесты, я могу получить документ для добавления HTML-кода, созданного DOM, в мое всплывающее окно следующим образом:

var popup = window.open("", "popup", "height=400px, width=400px"); 
var doc = popup.document.documentElement;
var p = document.createElement("p"); 
p.innerHTML = "blah"; 
doc.appendChild(p);

В моем примере получается абсолютно недопустимый HTML, который я знаю, но он работает (очевидно, с ограниченным тестированием).

Один дамп .innerHTML должен работать лучше, чем миллион строк document.write ();

Я бы построил DOM по мере необходимости и сбрасывал с помощью

doc.innerHTML = newDOM;

По-прежнему отчасти хакерский, но лучше, чем document.write ();

I've gone to using document.write() to generate the page.

Я думаю, вам, вероятно, придется использовать хотя бы какой-то document.write (), чтобы разместить скелетную страницу, прежде чем вы сможете взаимодействовать с DOM:

doc.write('<!DOCTYPE ...><html><head></head><body></body></html>');
doc.close();
doc.body.appendChild(...);

Перед вызовом write () документ нового окна находится в неопределенном состоянии, еще нет документа, с которым можно было бы взаимодействовать. Firefox, по крайней мере, помещает временный скелетный документ, пока вы не вызовете сначала document.write (), но я не вижу, чтобы это действительно где-то задокументировано, поэтому на него, вероятно, лучше не полагаться.

var popup = window.open("", "popup", "height=400px, width=400px");

В window.open не требуется единица «px».

вы могли бы использовать что-то вроде

function writePopup(){
  var htmlString=[
    "<html>",
    "<head>",
    "<title>Written popup</title>",
    "</head><body>",
    "<p>Testing write</p>",
    "</body></html>"
  ].join("\n");
  window.open("data:text/html,"+encodeURIComponent(htmlString), "_blank", "height=400px, width=400px");
}

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