Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   При открытии нового окна window.open, слетают значения в input text (https://javascript.ru/forum/misc/36370-pri-otkrytii-novogo-okna-window-open-sletayut-znacheniya-v-input-text.html)

bistok 13.03.2013 14:07

При открытии нового окна window.open, слетают значения в input text
 
На сайте существует длинная форма заказа товаров, котороя содержит большое кол-во input type='text'.
Появилась необходимость сделать печать заполненной формы заказа (только формы а не всей страницы)
Для печати помещаю область в блок <div id="print" class="contentpane"> и использую след. ф-цию
var prtContent = document.getElementById(strid);
var prtCSS = '<link rel="stylesheet" href="/templates/css/template.css" type="text/css" />';
var WinPrint = window.open('','','left=50,top=50,width=800,height=640,toolbar=0,scrollbars=1,status=0');
WinPrint.document.write('<div id="print" class="contentpane">');
WinPrint.document.write(prtCSS);
WinPrint.document.write(prtContent.innerHTML);
WinPrint.document.write('</div>');
WinPrint.document.close();
WinPrint.focus();
WinPrint.print();
/*WinPrint.close();*/
prtContent.innerHTML=strOldOne;


Но уже при открытии нового окна все значения в input обнуляются.

Подскажите куда копать? Или как можно передлать ф-цию печати области страницы, чтобы не обнулялись значения в input

danik.js 13.03.2013 14:37

Все верно. Свойство value != атрибут value. Атрибут - это начальное значение для свойства. Динамически измененное свойство не приводит к изменению атрибута. Это касается свойств value, checked и других некоторых.
Как вариант - пробежаться по элементам формы и проставить их значения в атрибуты.
И не нужно "писать" в документ закрывающие теги (7 строчка). Это бесполезно.

bistok 13.03.2013 14:46

Спасибо за быстрый ответ.
Я практически не разбираюсь в джаваскрипте, буду очень признателен, если подскажите как пробежаться по элементам формы, чтобы перенести значения в новое окно. Массивом или как-то еще?

А заодно было бы правильно сразу запретить редактирование input в новом окне. Это реально сделать?

danik.js 13.03.2013 15:22

var form = document.getElementsByTagName('form');
for (var i = 0; i < form.elements.length; i++) {
    form.elements[i].setAttribute('value', form.elements[i].value);
}


Можно еще так:
var clone = form.cloneNode(true);
printWindow.document.body.appendChild(clone);

bistok 13.03.2013 16:49

Большое спасибо, намучился, но сделал.

bistok 13.03.2013 16:55

А запретить редактирование только на новой странице реально?
Я попробовал добавить запрет, но он срабатывает и на основную страницу.

Очень бы хотелось установить запрет на редактирование только в новом окне.

danik.js 13.03.2013 16:59

Пройтись по элементам клона и проставить element.readOnly = true

bistok 13.03.2013 17:38

Понял, дело в том что я сначала пошел по пути form.elements[i].setAttribute('value', form.elements[i].value);

Потому что я не копировал полностью форму, копировал все кроме кнопки "Отправить".

Если использовать клон, то все ок с readonly, но кнопка не нужна.
Как можно убрать кнопку из клона формы?

bistok 13.03.2013 17:42

в принципе если использовать disabled кнопка не активна, так что все ок, но если подскажете как удалить элемент, все равно пригодится.

danik.js 13.03.2013 17:49

Можно и первым путем идти. Просто после записи в окно, используем код типа
var form = WinPrint.document.getElementsByTagName('form')[0];
// тут цикл с проходом по элементам и установкой readOnly = true


Или вторым путем, просто кнопку удалить через
var button = form.getElementsByTagName['button'][0];
button.parentNode.removeChild(button);

bistok 13.03.2013 19:07

Огромное спасибо.
Вроде все сделал как хотел.

Остался послдений неприятный момент.
Во всех браузерах все нормально, кроме ИЕ. Тестирую на ие8.

По ссылке он открывает даже новое окно, но оно пустое...
весь код это "<HTML></HTML>"
Сам код ф-ции
var myform = document.forms[1];
var myclone = myform.cloneNode(true);
var WinPrint = window.open('','','left=50,top=50,width=800,height=640,toolbar=0,scrollbars=1,status=0');

for (var i = 0; i < myclone.elements.length; i++) 
{
myclone.elements[i].readOnly='true';
myclone.elements[i].disabled='true';
}
	
WinPrint.document.body.appendChild(myclone);
WinPrint.document.close();
WinPrint.focus();
WinPrint.print();


Джаваскрипт вроде включен, окно же открывается... но почему ничего не выводит не могу понять.

danik.js 13.03.2013 19:27

F12
В случае если мы в document ничего не пишем, то и close() не нужен. Возможно в IE окно пустое, то есть даже без 'body', хотя врятли.
Короче, F12

bistok 13.03.2013 20:48

а я и не знал что в ие есть средства разработчика, спасибо)

bistok 13.03.2013 21:11

WinPrint.document.body.appendChild(myclone);
про эту строчку отладчик выдает, что интерфейс не поддерживается

Deff 13.03.2013 21:28

WinPrint.contentWindow.document.body.appendChild(myclone);

danik.js 13.03.2013 21:31

Скорее всего в ie нельзя в документ "подсаживать" элементы из чужого документа. Тогда с innerHTML остается вариант.


Часовой пояс GMT +3, время: 23:39.