jQuery - получить массив с входными именами в качестве ключей - PullRequest
2 голосов
/ 31 января 2011

Мне нужно получить тот же тип массива, который возвращает this.form.elements, с входными именами в качестве ключей массива.

Я пробовал this.toArray(), но, несмотря на то, что он выглядит одинаково, в нем отсутствуют ключи имен (клавиши являются цифрами).

Вот полная функция:

(function( $ ) {
  $.fn.blah = function(){
    var that = this;
    return this.each(function(){
       $(this).bind('change', function(){
           var matches1 = that.toArray();  // this doesn't work
           var matches2 = this.form.elements;  // this works.

           console.log(matches1); // but both arrays look the same. wtf?
           console.log(matches2);

           return true;
        }).change();

   });
 };

 })(jQuery);

, используя ее как $("input").blah();

Ответы [ 3 ]

3 голосов
/ 31 января 2011

В javascript вы не используете массив для именованных ключей. Вы бы использовали объект вместо этого. Я предполагаю, что значения должны быть самими элементами.

var result = {};

$.each(this.form.elements, function() {
    result[ this.name ] = this;
});

Что касается вашего обновления, эта строка:

var matches1 = that.toArray();  

... не работает, потому что вы вызываете jQuery toArray() для объекта jQuery.

Если вы хотите использовать это, вы вызовете его из библиотеки и передадите ему объект jQuery.

var matches1 = $.toArray( that );  

... хотя я не знаю, почему вы хотите превратить объект jQuery, представляющий все элементы <input>, в массив при каждом событии change.

Эта строка:

var matches2 = this.form.elements;  // this works.

... работает, потому что это просто ссылка на элементы формы из элемента <input>, который получил событие. Он использует собственные свойства API DOM для получения коллекции (технически это не массив).


Пришлось отредактировать мой ответ, потому что я ошибался насчет использования toArray(). Я думал о makeArray(). Метод toArray() является оберткой для .get() и делает то же самое.

2 голосов
/ 31 января 2011

Сериализация - это возможный выбор.http://api.jquery.com/serializeArray/

$ (this) .serializeArray () перезапускает его.:)

1 голос
/ 31 января 2011

form.elements возвращает объект HTMLCollection или HTMLFormControlsCollection в HTML5.

Элементы в этих объектах доступны по индексу или имени. Поэтому, если у вас есть форма с единственным элементом ввода с именем «login», вы можете сделать:

form.elements.[0]

или

form.elements["login"]

для доступа к тому же элементу. Вы можете смоделировать такой объект, добавив две записи для каждого элемента формы с соответствующим индексом и именем. Но если form.elements работает для вас, я бы рекомендовал использовать это напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...