Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   innerHTML и input (https://javascript.ru/forum/events/34995-innerhtml-i-input.html)

needle 27.01.2013 16:06

innerHTML и input
 
Приветствую уважаемое сообщество!
Подскажите пожалуйста, я хочу передать серверу содержимое некоего блока, содержащее тэги INPUT. Типа <div><input type='radio' name='radiobutton1' value='page' checked='checked'/></div>

Для этого у меня на сервак отсылается строка innerHTML данного дива, на серваке я хочу через DOM разобрать структуру и получить доступ к параметрам. Но скрипт сбоит, т.к. на сервак приходит строка <input type='radio' name='radiobutton1' value='page' checked='checked'>, т.е. тэг не закрывается. Вопрос - куда девается закрывающий слэш и что с этим можно сделать? Спасибо.

На всякий случай доктайп: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

danik.js 27.01.2013 16:32

Согласно HTML стандартам, закрывающие слэшы не нужны.
Используйте на сервере расширения, позволяющие парсить text/html.


А вобще, не понимаю, зачем парсить html на сервере, когда он на сервере же и сгенерирован, затем отправлен в браузер, затем получен от браузера, и что и теперь его нужно распарсить. Вам не кажется что цепочка мягко говоря, странная? Или html генерится в браузере? А зачем именно html отправлять, нельзя на клиенте выделить нужную инфу и отправить уже чистую на сервер? Так же проще ведь. Короче, опишите задачу свою.

danik.js 27.01.2013 16:41

Хотел предложить XMLSerializer, но оказалось что в хроме он выдает html при сериализации dom-элементов html-документа. Вот не пойму баг это или нет, потому как в FireFox и Opera все работает как надо.
<div><input type='radio' name='radiobutton1' value='page' checked='checked'/></div>

<script>
    var div = document.querySelector('div');
    
    alert(div.innerHTML);
    
    var serializer = new XMLSerializer();
    
    var children = div.childNodes;
    
    var innerXML = '';
    for (var i = 0; i < children.length; i++) {
        innerXML += serializer.serializeToString( children[i] );
    }
    
    alert(innerXML);
</script>

needle 27.01.2013 16:54

Ну да, дерево генерится через JavaScript в браузере. Потом то, что нагенерилось + все, что пользователь там ввел (в частности, проблемные радиобатоны) мне нужно получить со стороны сервера и обработать. Все работает прекрасно кроме того, что JS почему-то приводит изначальный инпут в нечитаемый для XML стандарта вид, хотя в страничке он корректен.

З.Ы. Можно, конечно, через регулярку парсить, но через DOM, имхо, красивее и правильнее

Deff 27.01.2013 17:14

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

needle 27.01.2013 17:22

Ну, у меня там не совсем форма, я отправляю данные через XMLHttpRequest. Т.е., получается, что я должен на все элементы повесить событие по дублированию всех данных в некое созданное, но не прикрепленное дерево?

danik.js 27.01.2013 17:29

Короче, вот так работает даже в хроме. Правда лишний xmlns атрибут проставляет.

<div><input type='radio' name='radiobutton1' value='page' checked='checked'/></div>
 
<script>
    var div = document.querySelector('div');
     
    alert(div.innerHTML);
     
    var serializer = new XMLSerializer();
     
    var children = div.childNodes;

    var fragment = document.implementation.createDocument().createDocumentFragment();
    for (var i = 0; i < children.length; i++) {
        fragment.appendChild( children[i] );
    }
    var innerXML = serializer.serializeToString(fragment);
    alert(innerXML);
</script>

danik.js 27.01.2013 17:32

Почему нельзя просто сувать все элементы в форму? это упростит сбор значений. В jQuery для этого метод есть ( чета типа serialize() или serializeArray() )

needle 27.01.2013 17:49

Спасибо! Прикрутил сериализацию отдельной функцией, то, что нужно. Про форму и jQuerry - изначально я не планировал использовать обертки, т.к. изначальная задача была просто отправкой данных из ячейки сразу по потере фокуса, думал, что обойдусь. Но как часто водится, задача обросла дополнительными потребностями, мне потребовалось сделать табличку, которая должна приходить на сервер уже целиком при нажатии кнопки "отправить". Чтобы не городить огород, использовал те же функции генерации табички, за исключением того, что снял событие отправки данных при потере фокуса. Все уперлось в этот инпут в итоге, но с Вашей помощью все разрулил, спасибо!

danik.js 27.01.2013 17:59

Цитата:

Сообщение от needle
Прикрутил сериализацию отдельной функцией...

Сериализацию во что? В XML ? или в массив значений инпутов? Или речь про $.serializeArray() ?


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