2010-11-16 23 views
1

我想遍历DOM元素列表(复选框)并继续下去,只要这个列表已定义。元素是'c1r1','c1r2','c1r3'等。一旦我遇到一个未定义的元素,我就停下来。该问题似乎是使用DOM元素的typeof。在DOM元素上使用Javascript的typeof来检查未定义的(IE问题)

这里是有问题的代码:

function domIsDefined(idString){ 
    alert(idString); 
    var isItDefined = (typeof $(idString) != 'undefined'); 
    alert(isItDefined); 
    return isItDefined; 
} 
... 
for(i=1; domIsDefined('c1r' + i); i++){ 
    if($('c1r' + i).checked==true){ 
     // do stuff 
    } 
} 

问题的关键是这一行:

var isItDefined = (typeof $(idString) != 'undefined'); 

的问题,因为我发现,是typeof运算$(idString)总是返回对象,无论是否定义。有没有什么好办法做这种事情?我想我会尝试一下,并尽早检查.checked属性,但那会让人感到恶心。

+0

你使用的是什么库? – 2010-11-16 17:54:53

+1

是否有任何特定的原因,你不能使用单一的DOM方法,即getElementsByTagName('输入')和迭代节点集合获得所有的checboxes?或者,如果你使用jQuery,只是'$(':checked')。each(function(){/ * do stuff * /});' – pawel 2010-11-16 17:58:09

+0

这是使用原型,对于混淆抱歉。我应该澄清一点。 – jtpereyda 2010-11-16 18:02:27

回答

5
function domIsDefined(idString){ 
    return !!document.getElementById(idString); 
} 
+0

天才!这里的问题是typeof丢失信息,因为它返回给定“任何其他对象”的“对象”或null。尽管null和HTML对象的布尔值不同。所以第一!投到一个布尔,这是我真正需要的。 谢谢!这很漂亮! – jtpereyda 2010-11-16 18:30:24

+0

对不起,我没有投票的声望。 :( – jtpereyda 2010-11-16 18:31:13

+0

另外,我喜欢疯狂的解决方案,以非正统的方式使用多个操作符。 – jtpereyda 2010-11-16 18:35:29

1

jQuery总是返回一个对象(一个数组)。如果没有找到具有该ID的元素,然后返回数组的长度为0。

var isItDefined = ($(idString).length > 0); 

更新:为原型,你应该检查空,看是否找到对象

var isItDefined = ($(idString) !== null); 
+0

这个答案也适用于原型吗? – jtpereyda 2010-11-16 18:04:26

+0

我的意思是,我可以自己检查一下。原型并不总是返回一个数组(我很确定),所以我尝试将其转换为数组。这虽然没有结果。 var tempA = new Array(); tempA [0] = idString; var isItDefined =($(tempA).length> 0); – jtpereyda 2010-11-16 18:11:55

+0

@Josh - 更新原型。 – jball 2010-11-16 18:23:24

0

$(),在jQuery中,将始终返回一个对象。试试这个:

var isItDefined = (typeof document.getElementById(idString) != 'undefined'); 
+0

这是行不通的;对象仍然返回。 – jtpereyda 2010-11-16 18:07:51

1

检查数组的长度。 jQuery总是返回一个jquery实例,并带有匹配元素的数组。

$(idString).length > 0 
1
if($("#id").length){} 
+0

我不知道这是否意味着任何jQuery,但它崩溃原型。 – jtpereyda 2010-11-16 18:17:23