2009-08-17 2 views
4

Учитывая следующий вид:

<form id="form" name="form"> 
<input name="name"/> 
<input name="version"/> 
<input name="template"/> 
<textarea name="elements"></textarea> 
<textarea name="features"></textarea> 
<textarea name="layout"></textarea> 
<input type="submit" value="Save"/> 
</form> 

и Javascript (с помощью JQuery 1.3.2):

$(function() { 
    $('#form').bind('submit',function() { alert($('#form').serialize()); return false; }); 
    }); 

выход подачи выше форму из приведенного выше предупреждения JavaScript Alert является:

elements=... 

Где ... это то, что содержится в поле элементов.

Я бы ожидать, что $ ('# форма') сериализации() возвращает строку что-то вроде:..

name=&version=&template=&elements=&features=&layout=. 

Я не отметить, что $ ('вход, текстовой') сериализации() делает выполнить ожидаемое поведение (то есть «имя = & версии = & шаблона = & элементов = asdafe & функции = & расположения =» возврата), однако мне очень интересно, почему $ («# формы») версия только возвращается "элементы" =.

Я пробовал это на Safari 4 и Firefox 3.5, поэтому я уверен, что это то, что мне не хватает.

Спасибо за чтение.

+1

Попробуйте добавить название в свою форму. – Zed

+0

@Zed: Спасибо; к сожалению, добавление имени не исправить. –

ответ

17

Это название вашего текстового поля, которое отбрасывает его.

Вот как он ломается. В DOM, form узлы имеют несколько специальных свойств, в первую очередь эти два (которые выставлены в таком порядке)

  1. The elements коллекции, которая является HTMLCollection всех элементов формы (и некоторые другие узлы, как <fieldset> элементы)
  2. Свойства каждого указанного элемента в форме (то есть, формы управления, которые имеют атрибут name)

Поскольку у вас есть <textarea> с именем «элементами», это эффективно перезаписывает встроенный elements коллекция упоминается в # 1 выше, поэтому, когда вы сериализовать форму все, что вы видите

elements=**** 

Потому что одна форма элемент перезаписать всю коллекцию.

Короткое решение? переименовать элементы формы в значения, которые не являются существующими свойствами DOM (<input name="name"/> также относится к этой категории)

+0

+1 информативный! –

+0

Очень полезный/информативный ответ. Спасибо. –

+0

Я открыл соответствующий вопрос: http://stackoverflow.com/questions/1295851/what-are-valid-invalid-names-for-html-form-tags –

-1

Метод .serializeArray() создает массив объектов JavaScript, готовый к кодированию как строка JSON. Он работает с объектом jQuery, представляющим набор элементов формы. Элементы формы могут быть нескольких типов:

2

Если кто-то еще наткнулся на эту проблему, я установил свойство disabled на всех входах до вызова serialize(), чтобы они не были включены в комплект. Удаление disabled перед вызовом serialize() исправляет это.

Смежные вопросы