5

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

autoLoad: { url: 'someurl' }

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

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

我通过把这个函数变成这个来解决这个问题:

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

然后 autoLoad 在两个浏览器中都能正常工作,但是还有一些奇怪的错误,此外,你真的不想在 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 中,它也执行相同的eval功能,但没有错误。所以它不像 Firefox 遵循不同的执行路径,它是相同的,但没有eval.

4

5 回答 5

4

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

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

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

{foo:'bar',baz:'boz'}
于 2009-07-01T17:53:56.150 回答
2

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

于 2009-07-01T18:07:29.747 回答
1

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

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

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

于 2009-07-01T17:38:53.003 回答
1

我遇到了同样的问题,请原谅我的英语,我来自 Mejico,我希望能帮上忙……当我提交表单登录时触发了我的问题,我的 PHP 返回一个 JSON 响应,以防出现这样的失败:

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

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

于 2010-10-18T18:32:27.633 回答
1

如果您要自动加载到面板或元素中,那么 JSON 解码甚至不应该参与该过程。UpdateManager 只是遵循 Ext.Element.update(..) ,它接受一个 html 字符串。

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

你应该能够做这样简单的事情:

var panel = new Ext.Panel({
  autoLoad: 'someurl' // 这是简写形式,你仍然可以使用对象配置
});

或者

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

对更新的回应:

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

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

于 2009-06-30T17:01:40.943 回答