2013-02-25 3 views
0

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

var my_field_name = $('#my_field_name'); // a multiple select 
var my_array = {"0":"123","1","456","2":"789"}; 
my_array = $.parseJSON(my_array); 
$.each(my_array, function (k, v) { 
    $("#my_field_name option[value="+v+"]").prop("selected", true); 
} 

до сих пор все работает нормально, но я «хотел бы» использовать my_field_name в цикле $.each, как my_field_name.("option[value="+v+"]").prop("selected", true);, но это кажется неправильным синтаксисом. Является ли $("#my_field_name option[value="+v+"]") единственным способом?

ответ

2

Поскольку my_field_name является экземпляром JQuery для select элемента, нужно использовать children для доступа к options элементов:

$.each(my_array, function (k, v) { 
    my_field_name.children('option[value=' + v + ']').prop("selected", true); 
} 

... но смотри также ниже.

Возможно, стоит отметить, что переменная my_array не указывает на массив. Фактически, эта строка является синтаксической ошибкой (потому что вы использовали запятую после "1", а не двоеточие). (Если бы вы использовали двоеточие, у вас был бы объект с ключами "0", "1" и "2", но он не был бы массивом. Конечно, стандартные «массивы» в JavaScript aren't really arrays at all, но ...) Я думаю, что вы хотели:

var my_array = ["123", "456", "789"]; 

вы также не использовать $.parseJSON на то, что не является строкой.

Еслиmy_array фактически заканчивает тем, массив (либо потому, что вы написали это буквально или потому, что он разбирается с JSON строки, как ["123", "456", "789"]), а не с помощью children вы можете быть лучше просто перекручивание через варианты:

// Let's assume you get jsonString from somewhere else, and it's really a string, 
// as though you had this code: jsonString = '["123", "456", "789"]' 
var my_array = $.parseJSON(jsonString); 
$.each($("#my_field_name")[0].options, function(index, option) { 
    if ($.inArray(option.value, my_array) !== -1) { 
     option.selected = true; 
    } 
}); 

options собственности на сырой select DOM элемента (обратите внимание на [0], чтобы добраться до исходного элемента) представляет собой массив типа объекта с length собственности, так $.each будет Лоо p над ним с использованием индексов. $.inArray будет видеть, есть ли optionvalue в массиве. Вам не нужно кэшировать поиск, используя переменную my_field_name, потому что вы просматриваете только один раз.

Но обратите внимание, что это не будет работать, если строка JSON является {"0": "123", "1": "456", "2": "789"}, потому что $.inArray не будет работать с объектом, не являющийся массивом, как это.


Re ваш комментарий ниже:

... в вашем примере вы все еще используете $ ("# my_field_name"), и это то, что я пытался избежать, так как $ (» #my_field_name ") уже кэшируется поверх скрипта, и хотя я думал об использовании имени var вместо повторения $ (" # my_field_name ") каждый раз, когда мне нужно ссылаться на это поле.

Если вы уже делает

var my_field_name = $("#my_field_name"); 

... над ним в коде, то естественно ни в одном из примеров в этом ответе, если вы видите $("#my_field_name"), вы можете замените его непосредственно на my_field_name. Так, например, если вы видите:

$.each($("#my_field_name")[0].options, function(index, option) { 

и у вас уже есть my_field_name в переменной, вы можете изменить его к этому;

$.each(my_field_name[0].options, function(index, option) { 
+0

Да, цитаты были всего лишь ошибкой здесь, и массив (забыл опубликовать его здесь, анализируется $ .parseJSON). Но это заканчивается тем же самым (как я могу понять). Я отредактирую вопрос. – McRui

+0

@Mario: Я понял. Не меняет ответа. :-) Счастливое кодирование, –

+0

Итак, по вашему мнению, использование кешированной переменной my_field_name - лучший вариант, чем использование полного $ ("# my_field_name")? – McRui

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