变量属性的jQuery语法

时间:2013-02-25 14:06:14

标签: jquery syntax var

我试图压缩和优化某些代码,并且我想要压缩以下类型,但无法获得正确的语法:

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+"]")是唯一的出路吗?

1 个答案:

答案 0 :(得分:2)

由于my_field_nameselect元素的jQuery实例,因此您使用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实际上最终成为数组(要么是因为你是字面写的,要么是因为它是从{{1}这样的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; } }); DOM元素上的options属性(注意要转到raw元素的select)是一个类似于数组的对象,具有[0]属性,所以length将使用索引循环它。然后,$.each会查看数组中是否存在$.inArray的{​​{1}}。您不需要使用option变量缓存查找,因为您只进行一次查找。

但请注意,如果JSON字符串为value,则将不会工作,因为my_field_name将无法与非数组对象一起使用。


重新评论以下内容:

  

...在你的例子中,你仍在使用$(“#my_field_name”),这就是我试图避免的,因为$(“#my_field_name”)已经缓存在脚本之上,尽管我我想在每次需要引用该字段时使用var名称而不是重复$(“#my_field_name”)。

如果你已经在做

{"0": "123", "1": "456", "2": "789"}

...在代码中位于其上方,然后自然在此答案的任何示例中,如果您看到$.inArray,则可以直接将其替换为var my_field_name = $("#my_field_name"); 。例如,如果您看到:

$("#my_field_name")

并且您已在变量中拥有my_field_name,您可以将其更改为此内容;

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