ExtJS:autoLoad在IE中不起作用

时间:2009-06-30 16:41:15

标签: javascript internet-explorer extjs autoload

使用ExtJS 2.2.1,我有一个容器元素,应该使用以下命令从服务器加载一段HTML:

autoLoad: { url: 'someurl' }

这在Firefox中运行良好,但对于IE7,这会导致在第7170行的ext-all-debug.js中出现语法错误:

 this.decode = function(json){   
   return eval("(" + json + ')');
 };

我通过将此功能转换为此来修复此问题:

 this.decode = function(json){   
    return eval('(function(){ return json; })()');  
 };

然后autoLoad在两个浏览器中运行良好,但是有一些奇怪的错误,此外,你真的不想在ExtJS库中修复它,因为它将无法维护(特别是在缩小的ext-all.js中就像单行上的一半大量的Javascript一样)。

我无法找到很多关于这个bug的信息。

我尝试过的变化:

// With <script> tags around all the HTML
autoLoad: { url: 'someurl', scripts: true }
// With <script> tags around all the HTML
autoLoad: { url: 'someurl', scripts: false }

如果没有<script>标签,反之亦然。 HTML中也没有任何Javascript,但它应该是可能的,因为最终我们将在返回的HTML中使用Javascript。

问题不在HTML中,因为即使使用最简单的HTML,错误也是一样的。

更新 - 对donovan的回应:

使用它的最简单的情况是这个:

changeRolesForm = new Ext.Panel({
        height: 600,
        items: [{ autoScroll: true, autoLoad: WMS.Routing.Route("GetRolesList", "User")   + '?userID=' + id}]
    });

此处不涉及数据存储区。响应类型也是text\html,而不是json,所以也不能混淆它。如上所述,它在Firefox中工作得很好,在Firefox中,它也执行相同的eval函数,但没有错误。所以它不像Firefox遵循不同的执行路径,它是相同的,但没有eval上的错误。

5 个答案:

答案 0 :(得分:4)

检查你的JSON。 FF允许在JSON对象中使用尾随逗号,而IE则不允许。 e.g。

{foo:'bar',baz:'boz',}

可以在FF中工作但在IE中它会引发语法错误。为了没有语法错误,JSON需要:

{foo:'bar',baz:'boz'}

答案 1 :(得分:2)

我找到了问题的根源,确实没有使用ExtJS。应用程序中有一个部分监听Ext.Ajax'requestcomplete'事件,并尝试将response.responseText解码为json,即使响应是HTML(仅在一两个案例中)。 IE对此并不感兴趣。

答案 2 :(得分:1)

如果您自动加载到Panel或Element中,那么JSON解码甚至不应该参与该过程。 UpdateManager只是延迟到Ext.Element.update(..),它带有一个html字符串。

我认为您的响应将被解析为JSON的唯一原因是,如果您使用JSONStore来请求它 - 您在使用什么?

你应该可以做这样简单的事情:

var panel = new Ext.Panel({
  autoLoad: 'someurl'  // this is the short form, you can still use the object config
});

OR

var element = Ext.get('element id').update({
  url: 'someurl'
});

对更新的回应:

只要WMS.Routing.Route(...)方法没有发生奇怪的事情,这看起来是正确的。我实际上目前正在研究ExtJS应用程序,因此我能够快速测试一些不同的服务器响应,无法重现您的问题。我还重新审视了ExtJS 2.2.1源代码,但仍然没有在相关的Element更新和UpdateManager中看到任何内容,它会调用您正在看到的Ext.util.JSON.decode(...)。

我正在想象它来自您应用程序另一部分中不相关的AJAX请求。如果您还没有,我会使用firebug / firebug lite来帮助调试 - 特别是尝试获取堆栈跟踪以确保您的问题的来源真的是这个autoLoad。

答案 3 :(得分:1)

我不知道问题是什么,但我想指出你的“修复”使它只是将json作为字符串而不是eval'd对象返回,所以当然不再有错误 - - 您删除了该功能。它可以简单地说:

 this.decode = function(json){   
     return json;
 }

一般来说,像这样的随机错误通常不会指示Ext中的错误,特别是在通常用作Ext.decode的函数中。我猜想在JSON中有一些东西,IE不喜欢其他浏览器忽略,或者更有可能的是,你的应用程序中有一些意外情况发生在你的描述中并不明显。您是否尝试过检查Firebug中的请求日志以查看JSON实际上是什么样的?您是否尝试首先将Route调用的结果转换为变量以在填充面板之前验证其内容?另外,尝试将Firebug中的“中断所有错误”选项设置为true - 很多时候,当你从堆栈顶部的Ext中获取随机函数时,罪魁祸首实际上是一些你不是的应用程序代码期待。

答案 4 :(得分:1)

我有同样的问题,请原谅我的英语,我来自Mejico,我希望我可以帮助...我提交表格登录时触发了我的问题,我的PHP返回一个带有响应的JSON,以防万一这样:

$respuesta = "{success: false, msgError: 'El usuario o contrase&ntilde;a son incorrectos'}";

但是当它成功时我没有发送resposne,当它取得了真正的成功时,然后ExtJS它试图解码我的JSON响应,但没有什么可以解码,我想那就是,在我的情况下再次,问题...我解决了刚刚发回真正成功的回复,FF,Chrome,Safari,没有发现问题,但Opera和IE8确实...我希望我帮助别人,再见