【问题标题】:ExtJS: autoLoad does not work in IEExtJS:自动加载在 IE 中不起作用
【发布时间】:2009-06-30 16:41:15
【问题描述】:

使用 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 }

反之亦然,没有&lt;script&gt; 标签。 HTML 中也没有任何 Javascript,但应该有可能,因为最终我们将在返回的 HTML 中使用 Javascript。

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

更新 - 对多诺万的回应:

使用 this 的最简单的情况是:

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上的错误。

【问题讨论】:

  • 没有一个“答案”解决了错误只发生在 IE 中的事实。我们在 Ext 3.3.0 中仍然遇到同样的事情。
  • 嗨 Julian,如果您查看 FireBug,服务器返回了什么? Ext 调用服务器,之后它在 IE 中死掉,如果请求和响应被发布(包括标题)会很有帮助
  • 我建议使用 Charles Proxy 来获取 Rob 所追求的信息,因为 IE 调试工具很糟糕
  • 朱利安本人已经回答了这个问题。也许有人应该从这个问题中删除赏金

标签: javascript internet-explorer extjs autoload


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您要自动加载到面板或元素中,那么 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 update 和 UpdateManager 中仍然看不到任何可以调用您所看到的 Ext.util.JSON.decode(...) 的内容。

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-01
            • 1970-01-01
            • 2011-12-10
            • 1970-01-01
            • 1970-01-01
            • 2010-11-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多