我是一个后端人,我们的前端人刚离开,虽然我“认为”我解决了这个问题,但我想了解发生了什么。
所以我从Chromium 39.0.2171.65中的脚本Uncaught TypeError: Cannot read property 'indexOf' of undefined
得到了这个错误
浏览器向我展示了导致此问题的这一行: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/网站也没有说清楚。
所以我想知道,如果可能的话,这可能会如何起作用,如果我使用的修复程序还可以,或者我是否应该做其他事情。
答案 0 :(得分: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来演示这个。您可以通过更改注释以包含正确的版本来运行它们,并且可以看到差异。
是否可以更改html以添加以前输入语句的select语句?
答案 1 :(得分: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 type = this.type;也会有用。