javascript - jQuery 代码适用于 Chrome,不适用于 IE9

标签 javascript jquery internet-explorer google-chrome extjs4

这里是 jQuery 的新手,我有一段代码在 Chrome 中运行正常,但在 IE9 中失败(还没有尝试过 FF)。

代码如下:

var textColor = $('#navmenu-body').css('color');
textColor = textColor.slice(4);

在 IE9 中,我得到一个错误,导致无法调用 slice,因为 textColor 未定义。

我不确定是因为 jQuery 找不到 #navmenu-body 元素还是找不到 CSS 属性 color

所以我做了:

var j = $('#navmenu-body');
var textColor = $('#navmenu-body').css('color');
textColor = textColor.slice(4);

在 IE9 的控制台中,j.length 返回 0。所以选择器确实不起作用

这是 #navmenu-body HTML DOM

<div id="navmenu-body" class="x-panel-body x-panel-body-cssmenu x-layout-fit x-panel-body-cssmenu" style="height: 398px; left: 0px; top: 0px; width: 200px;">
</div>

是否需要为 IE9 支持做其他事情?

根据 T.J. Crowder 回答,我想我可能会遇到一个问题,即在我尝试获取的元素可用之前调用选择器。

我主要在 Chrome 中开发(使用动态生成所有 HTML 内容的 ExtJS,因此可能与 jQuery 有一些冲突),我不得不更改:

$(document).ready(function () {
    ...
    var textColor = $('#navmenu-body').css('color');
    textColor = textColor.slice(4);
});

到:

$(window).load(function () {
    ...
    var textColor = $('#navmenu-body').css('color');
    textColor = textColor.slice(4);
});

让它在 Chrome 中工作。但是这个“修复”显然在 IE9 中不起作用。据我所知,ExtJS(它生成我所有的 HTML 内容)似乎是在 DOM 和 jQuery 准备就绪后初始化的,所以这可以解释它......那为什么它会在 Chrome 中工作?

我想我需要打开一个新的、与 ExtJS 相关的问题。

最佳答案

var j = $('#navmenu-body');
var textColor = $('#navmenu-body').css('color');
textColor = textColor.slice(4);

So in IE9's debugger, turns out j is defined so it would seem jQuery has troubles getting the CSS attribute and textColor ends up being null.

没有。 jQuery 的工作方式,$(...)总是 返回一个 jQuery 对象。该 jQuery 对象中可能没有匹配的元素,但它不会是 undefinednull

但是那个对象显然是空的,因为这是 jQuery 唯一一次从 css("color") 返回 undefined。 (即使集合中的第一个元素没有颜色,它也会返回"",而不是undefined。)

Do I need to do something else for IE9 support ?

不,所有当前版本的 jQuery 都直接支持 IE9。

这里发生的事情是,在您的 IE9 测试中,选择器 #navmenu-body 在您运行时没有匹配任何元素。您必须确定原因,因为我们在问题中没有足够的信息来回答这个问题。

我猜,这听起来像是 IE9 比 Chrome 更早地触发了一些事件或回调(或者你有一个竞争条件,这只是平局的运气)。或者您正在使用条件注释,而该元素在 IE9 中不存在。 (IE9 仍然有条件注释。)或者 IE9 的其他地方发生错误,停止您的代码并阻止您将该元素添加到 DOM。等等 因此,请查看相对于创建该元素的位置执行此代码的位置。从根本上说,如果该元素存在并且在您运行 var textColor = $("#navmenu-body").css("color"); 时位于 DOM 中,textColor 将是一个字符串。它可能是一个空字符串,但它将是一个字符串。


关于从 ready 切换到 load 的编辑:听起来您为创建元素所做的任何 ExtJS 工作都是在 ajax< 之后发生的 调用或类似的调用,并且该调用在 load 事件在 Chrome 上触发之前完成(因此该元素在那里)但在 load 在 IE9 上触发之后(因此它不是)。

理想情况下,您想向 ExtJS 注册一个回调,告诉 ExtJS 在创建元素的操作完成时调用您。那么你就不需要使用ready或者load了。

一个非常肮脏的解决方法是轮询:

$(document).ready(function () {
    // ...

    init();
    function init() {
        var navmenuBody = $('#navmenu-body');
        if (!navmenuBody[0]) {    // **Very** dirty workaround
            setTimeout(init, 50); // It wasn't there yet, so check back in 50ms
            return;
        }
        var textColor = navmenuBody.css('color');
        textColor = textColor.slice(4);
    }
});

但同样,这是一个非常肮脏的解决方法。我确定您可以从 ExtJS 获得相关的回调。

关于javascript - jQuery 代码适用于 Chrome,不适用于 IE9,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24041209/

相关文章:

javascript - 如何使用 javascript/jquery 触发带有延迟点击的 css 动画?

javascript - 使用 jquery 将 css 类添加到行的特定列

javascript - 我想删除主 div 中拖动的插入元素

javascript - 是否有一个 IE javascript 命令可以重新处理类定义?

internet-explorer - Microsoft Edge 会使用 -webkit- 或 -ms- 等前缀吗?

javascript - 在整个代码中使用 AJAX 结果变量

javascript - 抛出 JS 后继续执行

javascript - React/Redux/Immutable.js - 不可变操作(错误 : Actions must be plain objects)

javascript - 如何通过使用 javascript 单击复选框来将 id 添加到数组?

javascript - 溢出 : auto on a DIV with a child TABLE scroll bar stays around when elements are removed