【问题标题】:Inconsistent IE behavior jQuery getScript不一致的 IE 行为 jQuery getScript
【发布时间】:2012-06-22 15:16:55
【问题描述】:

IE9 中的一些 ajax 问题,使用 jQuery。我目前从与来自<script> 的页面一起加载的JavaScript 文件中调用jQuery 的getScript()。这会将一些 JSONP 数据加载到window 对象,然后执行一个函数以将其成员解析为<option>s 中的<select>。 (这在 Chrome 和 Firefox 中都可以正常工作。)

然而,在 IE9 中getScripts 根本没有回调(甚至明显被调用),从而使页面处于半加载状态。还有一个函数可以调用三个相关的getScript()s,称为piGetScripts(),我试图在经过一定时间后通过用户单击使其可调用,但是单击此元素不会调用它(但是将调用其中的任何alert()s)。

奇怪,如果我打开 IE JavaScript 控制台然后再次单击该元素,则调用成功。从那时起,在随后的页面加载 (Ctrl+R) 中,直到浏览器关闭,页面才能正确加载(就像 Chrome 和 Firefox 一样)。如果在控制台打开的情况下加载页面,调用也会正确发生。

有人遇到过这种情况吗?

我很想找出这种晦涩行为的原因。

【问题讨论】:

  • 我已经看到了这种行为,尽管它与 jQuery 无关。当您从 JavaScript 调用 console 时,除非您打开开发者工具,否则它会引发异常,该工具会初始化 console 对象并在之后工作。可能是这样。如果您没有使用console,那么我不知道发生了什么(尽管您可能会给我们更多细节:实际代码+ jQuery 版本)。祝你好运!
  • @freakish 做到了!非常感谢你。这是一个 console.log() 被调用的实例,它一定把一切都搞砸了。不愿意链接到代码,因为它对我工作的人正在为什么客户工作是准敏感的,但试图在没有它的情况下足够彻底地描述设置。但现在已经修好了,我非常感激。
  • 我已经发布了一个答案,所以你可以接受它! :D

标签: jquery ajax internet-explorer getscript


【解决方案1】:

按照我自己的评论:

我已经看到了这种行为,尽管它与 jQuery 无关。 当您从 JavaScript 调用控制台时,它会引发异常 除非你打开开发者工具,它会初始化控制台对象和 它之后工作。可能是这样。如果您不使用 控制台,那么我不知道发生了什么(虽然你可以给我们 更多细节:实际代码 + jQuery 版本)。祝你好运!

看来确实是这样。好的。我想给你一些关于调试的更多建议。您可以(并且应该)创建自己的类来处理调试。例如,这可以是一种选择:

function Debuger() {
    var self = this;
    self.cache = [];

    self.dump = function() {
        if (window.console && window.console.log) {
            var l = self.cache.length;
            for (var i = 0; i < l; i++)
                window.console.log.apply(window.console, self.cache[i]);
            self.cache = [];
            /* We have console, we can deactivate monitor... */
            self.deactivate();
            /* ...and even redefine log! */
            self.log = function() {
                window.console.log.apply(window.console, arguments);
            };
        }
    };

    self.log = function() {
        var args = arguments;
        self.cache.push(args);
        self.dump();
    };

    self.monitor_fn = function() {
        self.dump();
    };

    self.activate = function() {
        self.monitor = setInterval(self.monitor_fn, 1000);
    };

    self.deactivate = function() {
        clearInterval(self.monitor);
        self.monitor = null;
    };
}

像这样简单地使用它:

debuger = new Debuger();
debuger.activate();
debuger.log('Test');

它应该可以在任何浏览器下工作(虽然没有测试过),如果创建了console 对象,那么它会将缓存的消息转储到它。显然,您应该根据自己的需要对其进行自定义。

【讨论】:

  • 谢谢!一旦我注意到开发工具打开时的不同行为,谷歌就会把我发到这里。我没有意识到我在那里有任何登录。您为我节省了几个小时(包括潜在的客户站点之旅)。我通常不会对 SO 如此热情洋溢,但这一次让我非常恼火。希望我能多次投票。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 2018-06-29
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多