为什么我的'键入'属性是"看到"?

时间:2014-12-03 18:07:00

标签: jquery jquery-ui

我是一个后端人,我们的前端人刚离开,虽然我“认为”我解决了这个问题,但我想了解发生了什么。

所以我从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/网站也没有说清楚。

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

2 个答案:

答案 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来演示这个。您可以通过更改注释以包含正确的版本来运行它们,并且可以看到差异。

http://jsfiddle.net/3104wcbp/

是否可以更改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;也会有用。