2014-12-03 69 views
0

我是一个后端人,我们的前端人员刚刚离开,虽然我“认为”我解决了这个问题,但我想知道发生了什么事情。为什么我的'type'属性没有被“看到”?

所以我得到这个错误,从脚本Uncaught TypeError: Cannot read property 'indexOf' of undefined - 在铬39.0.2171.65

浏览器给我看了这条线是造成该问题:if (type.indexOf('select') == 0),从中我明白,type是不确定的。

那么什么是type

$('form :input[type!=hidden][type!=submit]').each(function() { 
... 
var type = $(this).attr('type'); 
... 
} 

我调试了我的元素,结果发现其中有16个。

当他们中的每一个运行此$(this).attr('type')声明,我得到这个错误Uncaught TypeError: undefined is not a function$(this).type回报undefined,虽然this.type定义并具有适当的值,如果我用这条线,一切都似乎是工作作为预期。

这个问题可能是由于jQuery-ui的升级,从1.8到1.11,但我真的不知道,并且这http://api.jquery.com/attr/网站也没有说清楚。

所以我想知道,如果可能的话,这可能是如何工作的,如果我使用的修复程序足够好,或者我是否应该做其他事情。

+1

将$(this).attr('type')'更改为'$(this).prop('type')'。 – 2014-12-03 18:08:42

+0

有可能您的一些输入没有设置类型? – 2014-12-03 18:11:46

+0

'this.type'是检查输入类型的最合适的方法,真的不需要在这里使用任何jQuery对象 – 2014-12-03 18:11:48

回答

3

Suchit的回答是正确的。然而,要回答你为什么会发生这样的问题,为什么它以前工作过,等等......这需要一些解释。

在javascript中属性和属性是有区别的。有时候既有属性又有属性,但有时候不是。例如,对于有type="text"的输入元素,既有一个称为type的属性,又有一个称为type的属性。

但是,在这种情况下,您似乎在寻找一个select元素,它没有“type”属性,但会有一个type属性。

在jQuery 1.6之前,jQuery的.attr()方法在某些情况下会返回类型和属性。这在1.6中已被弃用,尽管它可能仍然有效。我的猜测是,在某个时间点(也许在jQuery 1.8之后),实际的功能被删除了,从jQuery 1.6开始已经被弃用了。

看起来这个区域在jQuery 1.9中发生了变化。

http://jquery.com/upgrade-guide/1.9/#attr-versus-prop-

编辑:

经进一步调查,我看不出如何做到这一点jQuery的1.8,在所有工作过。该行为在1.6版本中发生了变化,并且不允许继续按照我第一次怀疑的方式工作。

我已经创建了一个jsfiddle来演示这个。您可以通过更改注释来包含正确的版本来运行它们,并且可以看到差异。

http://jsfiddle.net/3104wcbp/

是否有可能将HTML改为增加他们在那里以前输入的语句select语句?

1

尝试使用:

$(this).prop('type'); 

演示在这里:

<!DOCTYPE html> 
<html> 
<body > 
<script> 
$(document).ready(function(){ 
    $('form :input[type!=hidden][type!=submit]').each(function() { 
     var type = $(this).prop('type'); 
     console.log(type); 
     }); 
}); 
    </script> 
    <form> 
<input type='text' name ="name"value="something1"> 
<input type='radio'name ="r" value="something2"> 


</form> 

注: VAR类型= this.type;也将起作用。

+0

这将是更合适的示例'',使用default输入类型(它是'text') – 2014-12-03 18:19:43

相关问题