27.01.2013, 16:06
|
Новичок на форуме
|
|
Регистрация: 27.01.2013
Сообщений: 6
|
|
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">
|
|
27.01.2013, 16:32
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Согласно HTML стандартам, закрывающие слэшы не нужны.
Используйте на сервере расширения, позволяющие парсить text/html.
А вобще, не понимаю, зачем парсить html на сервере, когда он на сервере же и сгенерирован, затем отправлен в браузер, затем получен от браузера, и что и теперь его нужно распарсить. Вам не кажется что цепочка мягко говоря, странная? Или html генерится в браузере? А зачем именно html отправлять, нельзя на клиенте выделить нужную инфу и отправить уже чистую на сервер? Так же проще ведь. Короче, опишите задачу свою.
|
|
27.01.2013, 16:41
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Хотел предложить 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>
|
|
27.01.2013, 16:54
|
Новичок на форуме
|
|
Регистрация: 27.01.2013
Сообщений: 6
|
|
Ну да, дерево генерится через JavaScript в браузере. Потом то, что нагенерилось + все, что пользователь там ввел (в частности, проблемные радиобатоны) мне нужно получить со стороны сервера и обработать. Все работает прекрасно кроме того, что JS почему-то приводит изначальный инпут в нечитаемый для XML стандарта вид, хотя в страничке он корректен.
З.Ы. Можно, конечно, через регулярку парсить, но через DOM, имхо, красивее и правильнее
|
|
27.01.2013, 17:14
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Можно креатить форму скриптом и вставлять считанные данные в открытую, но не добавленную еще форму,
затем добавить её на страницу и отослать
|
|
27.01.2013, 17:22
|
Новичок на форуме
|
|
Регистрация: 27.01.2013
Сообщений: 6
|
|
Ну, у меня там не совсем форма, я отправляю данные через XMLHttpRequest. Т.е., получается, что я должен на все элементы повесить событие по дублированию всех данных в некое созданное, но не прикрепленное дерево?
|
|
27.01.2013, 17:29
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Короче, вот так работает даже в хроме. Правда лишний 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>
|
|
27.01.2013, 17:32
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Почему нельзя просто сувать все элементы в форму? это упростит сбор значений. В jQuery для этого метод есть ( чета типа serialize() или serializeArray() )
|
|
27.01.2013, 17:49
|
Новичок на форуме
|
|
Регистрация: 27.01.2013
Сообщений: 6
|
|
Спасибо! Прикрутил сериализацию отдельной функцией, то, что нужно. Про форму и jQuerry - изначально я не планировал использовать обертки, т.к. изначальная задача была просто отправкой данных из ячейки сразу по потере фокуса, думал, что обойдусь. Но как часто водится, задача обросла дополнительными потребностями, мне потребовалось сделать табличку, которая должна приходить на сервер уже целиком при нажатии кнопки "отправить". Чтобы не городить огород, использовал те же функции генерации табички, за исключением того, что снял событие отправки данных при потере фокуса. Все уперлось в этот инпут в итоге, но с Вашей помощью все разрулил, спасибо!
|
|
27.01.2013, 17:59
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от needle
|
Прикрутил сериализацию отдельной функцией...
|
Сериализацию во что? В XML ? или в массив значений инпутов? Или речь про $.serializeArray() ?
|
|
|
|