2009-06-30 182 views
5

工作中使用ExtJS的2.2.1,我有这应该利用来加载从服务器一段HTML的容器元素:ExtJS的:自动加载不能在IE

autoLoad: { url: 'someurl' } 

这工作正常,在Firefox ,但对于IE7这导致在内线,全debug.js语法错误在行7170:

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

我通过开启该功能到这个固定的:

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

然后自动加载运行良好两个浏览器,但后来有一些奇怪的错误,此外,你真的不想在ExtJS的库来解决这个问题,因为这将是难以维护(尤其是在缩小的EXT-all.js这是就像一条线上的半个Javascript脚本一样)。

我一直没能找到很多关于这个错误。

的变化,我试过:

// 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,错误是一样的。

更新 - 响应多诺万:

哪里,这是使用最简单的情况是这样的一个:

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

没有这里涉及到数据存储。响应类型也是text\html,而不是json,所以不能混淆它。正如所说的,它在Firefox中运行得很好,在Firefox中,它也执行相同的功能,但没有错误。所以它不像Firefox遵循不同的执行路径,它是一样的,但没有eval上的错误。

+0

没有任何“答案”解决了错误只发生在IE中的事实。我们在Ext 3.3.0中仍然遇到同样的情况。 – 2011-02-10 22:11:58

+0

嗨朱利安,如果你看看FireBug,从服务器返回什么?如果请求和响应已发布(包括头文件),Ext会在服务器调用服务器之后进行调用 – 2011-02-11 21:36:00

回答

2

我找到问题的根源,它确实不是ExtJS的。应用程序中有一部分听取Ext.Ajax'requestcomplete'事件,并尝试将response.responseText解码为json,即使响应是HTML(仅在一种或两种情况下)。 IE没有被这个感觉好笑。

1

如果你autoLoad'ing到面板或元素,然后一个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应用程序,所以我能够快速测试一些不同的服务器响应,并且无法重现您的问题。我也relooked在ExtJS的2.2.1源,仍然可以看到在相关元素的更新和UpdateManager没有什么会拨打电话给你看到Ext.util.JSON.decode(...)。

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

1

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

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

一般来说,这样的随机误差通常不表明分机的错误,尤其是不能作为常用的Ext.decode功能。我猜想,无论是JSON中的某些东西,IE不喜欢其他浏览器忽略的内容,或者更有可能的是,在您的应用程序中出现了某些意想不到的情况,这在描述中并不明显。你有没有试过在Firebug中检查你的请求日志,看看JSON实际上是什么样子?你有没有尝试过让你的路由调用的结果变成一个变量首先验证其内容之前填充面板?此外,尝试将Firebug中的“打破所有错误”选项设置为true - 当您从堆栈跟踪顶部的Ext获得随机函数时,很多时候,罪魁祸首实际上是一些您不是的应用程序代码期待。

4

检查您的JSON。 FF允许JSON对象中的尾随逗号,而IE不允许。例如

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

将在FF工作,但在IE中会抛出一个语法错误。为了在那里不会有语法错误的JSON将需要:

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

我有同样的问题,原谅我的英语,我来自Mejico,我希望我可以帮助...当我提交表单登录时,我的问题被触发,我的PHP返回一个JSON的响应失败像这样:

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

,但我无法发送resposne当它的成功,以及当它有一个真正的成功,那么,ExtJS的,它试图解码我JSON响应,但没有什么解码,我猜测这就是在我的情况下,这个问题......我解决了只是回传一个真正的成功,FF,铬,Safari的反应,不要问题,但Opera和IE8 ......我希望我帮助别人,再见