2008-10-05 1 views
7

Последний раз I asked about the reverse process и получили очень эффективные ответы. Я нацелен на наименьшие строки кода здесь. У меня есть форма полей и ассоциативный массив в формате {fieldname: data}, я хочу заполнить с ним соответствующую форму.Заполняют форму с данными из ассоциативного массива с jQuery

ответ

7

Когда я сделал это для проекта, я установил, что для установки значения полей выбора, переключателей и флажков потребовался более сложный код, что-то вроде строк:


jQuery.each(data, function (name,value) { 
    jQuery("input[name='"+name+"'],select[name='"+name+"']").each(function() { 
    switch (this.nodeName.toLowerCase()) { 
     case "input": 
      switch (this.type) { 
       case "radio": 
       case "checkbox": 
        if (this.value==value) { jQuery(this).click(); } 
        break; 
       default: 
        jQuery(this).val(value); 
        break; 
      } 
      break; 
     case "select": 
      jQuery("option",this).each(function(){ 
       if (this.value==value) { this.selected=true; } 
      }); 
      break; 
    } 
    }); 
}); 

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

Мне не позволено комментировать комментарии здесь (пока), поэтому .... Как отмечено в комментарии, метод jQuery .val (val) обрабатывает установку переключателей, флажки и выделения.

Вам все равно нужно поместить select [name = ...] в шаблон селектора jQuery или элементы выбора не будут обновляться.

10

Если ваши формы элементы их ID устанавливается в имя_поля:

$.each(myAssocArry, function(i,val) { $('#'+i).val(val); }); 
+0

Этот шов пропускает флажки. Он не проверяет их, а изменяет значение, определенное для них. – Pentium10 2011-06-14 20:27:54

5

Или аналогично предыдущему предложению, используя имена полей вместо идентификаторов:

$.each(data, function(name,value) { 
    $("input[name='" + name + "']").val(value); 
}); 
+0

Хороший ответ, но он не будет выбирать отдельные поля или текстовые поля. Возможно, измените «input [name = ...]» на «* [name = ...]»? Кроме того, я только что исправил синтаксическую ошибку в вашем коде. – nickf 2008-10-06 04:04:58

+0

Я не уверен, что «*» будет работать, и это может быть несколько интенсивным, если это произойдет. Вы можете добавить другие параметры, разделенные запятыми - $ ("input [name ...], выберите [name ...], textarea [name ...]). Val ... – 2008-10-06 18:48:07

1

Я не видел, чтобы дескриптор jQuery передавал одно значение (без массива) в val() для радио или ввода флажка. Вы должны обязательно обернуть одно значение в массив.

Я также, как правило, не хотел изменять значения кнопочных входов, поэтому я отфильтровываю их.

Вот функция, которая обрабатывает обработку массива, фильтрацию кнопок, а также ограничивает выбор ввода для данного элемента формы. Параметр формы является необязательным. Если значение left/null/undefined, то будут выбраны все входы на странице.

function populateForm(data, form) { 
    $.each(data, function(name, value) { 
     var input = $(":input[name='" + name + "']:not(:button,:reset,:submit,:image)", form); 
     input.val((!$.isArray(value) && (input.is(':checkbox') || input.is(':radio'))) ? [ value ] : value); 
    }); 
}; 
Смежные вопросы