IE 中的 jQuery CSS 选择器

Posted

技术标签:

【中文标题】IE 中的 jQuery CSS 选择器【英文标题】:jQuery CSS selectors in IE 【发布时间】:2010-09-16 06:11:15 【问题描述】:

以下在 Firefox 中有效,但在 IE7 和 8 中中断:

$("#my-first-div, #my-second-div").hide();

所以我必须这样做:

$("#my-first-div").hide();
$("#my-second-div").hide();

这正常吗?

编辑:好的,我实际的代码是这样的:

$("#charges-gsm,#charges-gsm-faq,#charges-gsm-prices").html(html);

我的错误是这样的

( IE8): Message: 'nodeName' is null or not an object
  Line: 19 Char: 150 Code: 0
  URI: http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js 

【问题讨论】:

这对我来说适用于 IE7 和 Firefox 【参考方案1】:

您指定的位置说明:

Message: 'nodeName' is null or not an object
    Line: 19 Char: 150 Code: 0
    URI: http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js

那个特定的 jquery 是:

nodeName:function(elem,name)
    return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();

它本身就是为调用jQuery.extend() 而创建的闭包。所以我想问一下,如果你做一个“查看源代码”或它的 IE 等效项,是否有任何其他出现的字符串“nodeName”可能会干扰 jQuery。

您也可以通过创建一个xx.html文件并在IE7/8中打开它来测试以下内容吗?它在 Ubuntu 的 Firefox 3 下运行良好,无论选择器中的逗号后面有没有空格。

<html>
  <head>
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script>
  <script type="text/javascript">
    $(document).ready(function()
      $("a").click(function(event)
        $("#charges-gsm,#charges-gsm-faq,#charges-gsm-prices").html("xx")
        event.preventDefault();
      );
    );
  </script>
  </head>
  <body>
    <a href="http://jquery.com/">jQuery</a>
    <hr>
    <div id="charges-gsm">CHARGES-GSM</div>
    <div id="charges-gsm-faq">CHARGES-GSM-FAQ</div>
    <div id="charges-gsm-prices">CHARGES-GSM-PRICES</div>
  </body>
</html>

【讨论】:

感谢这个 Pax。你的例子工作正常。我会做一些调试,让你知道我的问题是什么。至少我现在知道这是我的错;)非常感谢! 这绝不是开发人员的错 :-),更可能是 jQuery 和其他 AJAXian 事物(如 Google API)之间的恶意交互。这就是为什么我使用该示例将其缩小为 jQuery 或非 jQuery。【参考方案2】:

嗯,我似乎无法在 IE7 中复制该问题(这两种形式对我来说都很好)。怎么破?是不隐藏,还是只隐藏第一个?

【讨论】:

好的,我的实际代码是这样的: $("#charges-gsm,#charges-gsm-faq,#charges-gsm-prices").html(html);我的错误是这样的(IE8):消息:'nodeName'为空或不是对象行:19 字符:150 代码:0 URI:ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js【参考方案3】:

你试过逗号后没有空格吗? The examples given in the specification have no space.

【讨论】:

【参考方案4】:

应该工作,根据documentation。您需要删除逗号后的尾随空格字符。

【讨论】:

【参考方案5】:

碰巧,您的一个元素是否嵌套在另一个元素中?

即:

<div id="foo">
  <div id="bar"> 
    <div id="baz">
  </div>
</div>

如果是这样,您可能遇到了指针问题,IE 可能在您尝试确定它是一个 div 之前释放了 bar。

的行为
$("#foo,#bar,#baz").html("xx"); 

在这种情况下是:

    将 #foo 替换为 xx 将#bar 替换为xx 将 #baz 替换为 xx

但是,如果在第 2 和第 3 阶段,#bar 和 #baz 不再存在,您将获得一些乐趣。 (如果 xx 恰好包含 #bar 和 #baz 的副本并不重要,它们可能是不同的对象,并且您要替换的初始对象已经被捕获,只是不再在 DOM 中: / )

您可以通过将过程封装在 try/catch 中来抑制(是的,gah,糟糕的想法)这个错误

try  
  $("#foo,#bar,#baz").html("xx"); 

catch( e ) 

   /* DO NOTHING D: */ 

但这是你最后的手段,在获得某种 JS 调试器绑定 IE 并将错误跟踪到其核心之后。

【讨论】:

以上是关于IE 中的 jQuery CSS 选择器的主要内容,如果未能解决你的问题,请参考以下文章

CSS JQuery 位置选择器在 IE 上为空

在 IE 8 中加速 ":not" jQuery CSS 选择器?

在 jQuery 中使用第 n 个子选择器是不是依赖于浏览器对 CSS3 的支持?

JQUERY选择器第一天

jQuery中的一些选择器

IE 的 CSS 选择器限制中如何计算媒体查询?