2012-06-22 89 views
2

在IE9中,使用jQuery的一些ajax问题。我目前从一个加载了<script>页面的JavaScript文件调用jQuery的getScript()。这会将一些JSONP数据加载到window对象,然后执行一个函数将其成员解析为<option> s,并将其写入<select>。 (这一切工作在Chrome和Firefox的罚款。)不一致的IE行为jQuery getScript

在IE9中,但是,则getScript s的根本callbacking(甚至demonstrably被称为),离开页面在半载状态。还有一个函数调用了三个相关的getScript() s,这个函数叫做piGetScripts(),我试图通过用户点击在一定的时间过去之后进行调用,但点击这个元素不会调用它(但会调用任何alert()在里面)。

奇怪,如果我打开IE浏览器的JavaScript控制台,然后再次点击元素,调用成功。从此之后,在随后的页面加载(Ctrl + R),直到浏览器关闭,页面加载正常(如Chrome和Firefox)。如果页面在打开控制台的情况下加载,调用也会正常进行。

有没有人遇到过这个?

我很想找出造成这种模糊行为的原因。

+2

我已经看到了这种行为,尽管它与jQuery无关。当你从JavaScript调用'console'的时候,它会抛出一个异常,除非你打开开发工具,它初始化'console'对象并且它在事后工作。情况可能如此。如果你不使用'console',那么我不知道发生了什么(尽管你可能会给我们更多的细节:实际的代码+ jQuery版本)。祝你好运! – freakish

+0

@不错!非常感谢你。这是一个调用console.log()的实例,它一定会把所有东西搞砸。不愿链接到代码,因为它对我工作的人员的客户正在努力工作的准确敏感,但试图在没有这些的情况下彻底地描述设置。但现在已经修好了,我非常感激。 –

+0

我已经发布了一个答案,所以你可以接受它! :D – freakish

回答

2

按照我自己的评论:

我见过的行为,虽然它没有任何关系与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对象,那么它会将缓存的消息转储给它。显然你应该根据自己的需要定制它。

+0

谢谢!一旦我注意到开发工具的不同行为,Google会将我发送到此处。我没有意识到我有任何登录。您节省了我的时间(包括潜在的客户网站之旅)。我通常不会那么热情,但这个让我很烦恼。希望我可以多劳多得。再次感谢。 – Hobo