jQuery类选择器不能在IE6 / 7中运行?

时间:2011-07-11 20:46:25

标签: jquery jquery-selectors

我遇到了jQuery 1.5.1(无法在我们的开发周期中升级太晚)和IE6和7中的类选择器的问题。

我在页面上有一个div,我使用Javascript创建另一个div并将其插入到现有的div中。创建的div被赋予my-class-name类。这个类没有风格,它只是一个通用的“标记”类。

当我使用此选择器时,它总是返回空:$('.my-class-name').length // always zero.

它在IE8 +以及所有其他浏览器中都能正常工作。有什么想法吗?

编辑: 这与我的代码类似。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>Test page</title>
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"></script>
    <script type="text/javascript">
      var i = 0;

      function addContent() {
        var newDiv = document.createElement('div');
        newDiv.setAttribute('id', 'newdiv-' + i);
        newDiv.setAttribute('class', 'my-class');

        var nc = $('#NewContent');
        nc.append(newDiv);

        i += 1;
      }

      function showContentCount() {
        alert($('.my-class').length);
      }
    </script>
  </head>
  <body>
    <div>
      <p>Some content</p>
      <input type="button" onclick="javascript:addContent();" value="Add new content" />
      <input type="button" onclick="javascript:showContentCount();" value="Show new content count" />
      <div id="NewContent"></div>
    </div>
  </body>
</html>

IE8 +工作正常,只有6和7给我带来了问题。

2 个答案:

答案 0 :(得分:1)

我找到了答案。原因是IE6 / 7不使用class作为class属性。他们使用className代替。因此,行newDiv.setAttribute('class', 'my-class');没有达到预期的效果,而必须是newDiv.setAttribute('className', 'my-class');。我提出了一些逻辑来解释这一点,现在一切都按预期运行。

答案 1 :(得分:0)

还有一些原因未被发现。尝试调试:

alert ( $('.my-class-name').length );
var mylen =  $('.my-class-name').length;
alert(mylen);
var mynewLen = $('.my-class-name').size();
alert(mynewLen);

.size().length

的jQuery别名

哪个版本的jQuery?页面上还有什么?

注意:如果这是在动态创建的元素上,则必须在元素位于DOM之后运行。

编辑:注意试试这个

$('div.my-class-name').length;

注意:某些jQuery版本中的类选择器在某些上下文中无法正常工作 - 例如当VML元素在页面上时(请参阅jQuery bug#7071)。我虽然在黑暗中完全射击。解决方法:在页面上取出.live(),升级到jQuery版本1.6.1+并使用.delegate()代替.live();