在没有数百行代码的情况下很难解释这一点,但我会尝试!
我有一个父对象,其中包含一个子对象数组。父级使用此函数将MULTIPLE选择元素写入页面
function writecollectionmultiselect(name,displayname,selectedrange){
// Create select page element
var collection = $("<select/>");
collection.attr("name",name);
collection.attr("MULTIPLE","multiple");
// Loop over elements in this collection and ask them to draw themselves
for(var i=0; i<this.objectarray.length;i++){
collection.append(this.objectarray[i].writemultioption(selectedrange));
}
return collection;
}
父母要求每个孩子绘制自己的选项元素,具体取决于他们的id是否在“selectedrange”
function writemultioption(selectedrange){
var option = $("<option/>");
option.val(this.data.id);
option.html(this.data.name);
if(selectedrange.indexOf(parseInt(this.data.id)) >= 0){
option.attr('selected', 'selected');
}
return option;
}
当selectedrange作为selectedrange = [1,2,3]提供时,这很好用 但是,如果我使用jquery
读取页面元素的选定值selectedrange = $('[name='+myname+"]").val();
当我尝试调用第一个函数时,indexOf函数似乎完全失败了。我添加了这行调试代码
alert("looking for "+this.data.id+" in "+selectedrange+" result "+selectedrange.indexOf(parseInt(this.data.id)))
当我第一次画选择器时,我得到了这个:
在1,2,3结果0中寻找1
但是,读取值并重新绘制会产生
在1,2,3结果-1中寻找1
我怀疑某种数据类型的问题,但几个小时以来我一直在抨击这个问题。任何帮助表示赞赏。
答案 0 :(得分:1)
jQuery会为您提供一系列字符串,并且您使用this.data.id
将parseInt
转换为数字,因此它们永远不会匹配,因为indexOf
比较是严格的。
一种解决方案是将字符串数组转换为数字。
selectedrange = $.map($('[name='+myname+"]").val(), function(n) {
return parseInt(n, 10);
});
或者另一个解决方案是将数组保持为字符串,但除去parseInt
并执行此操作。
if(selectedrange.indexOf(this.data.id) >= 0){
答案 1 :(得分:0)
indexOf()
函数将String作为参数,在您的示例中,您传入一个整数,不要调用parseInt()
:
alert("looking for " + this.data.id + " in " + selectedrange + "result" + selectedrange.indexOf(this.data.id))
// no parseInt() here
另外,获得-1
的原因是indexOf()
函数在它正在搜索的字符串中找不到匹配项时返回-1
。