【问题标题】:ExtJS decode method fails to decode "&quot" After File Upload文件上传后ExtJS解码方法无法解码“&quot”
【发布时间】:2012-01-24 15:42:56
【问题描述】:

我有一个 JSON 格式的结果发送回持有 $quot 符号的客户端。由于某些未知原因,代码中断了。

这是 ext-all-debug 的代码:

doDecode = function(json){
   return eval("(" + json + ")");    FAILS HERE
},

这是我离开服务器时的 JSON(据我所知,我希望服务器不要在空闲时间花时间解码这个&quot。):

{
success: true,
total: 1,
results: [{
    "ID": -1,
    "Value": "POChangeRequestlblCustomerCatalogNumber",
    "Description": "",
    "Labels": {
        "1": {
            "ID": -1,
            "LanguageID": 1,
            "Value": "Catalog Number",
            "ToolTip": "",
            "LanguageName": "English",
            "KeyID": -1,
            "KeyValue": "POChangeRequestlblCustomerCatalogNumber",
            "KeyDescription": ""
        },
        "2": {
            "ID": -1,
            "LanguageID": 2,
            "Value": "&quot;", <<< THIS IS THE BAD PART!!!
            "ToolTip": "",
            "LanguageName": "Hebrew",
            "KeyID": -1,
            "KeyValue": "POChangeRequestlblCustomerCatalogNumber",
            "KeyDescription": ""
        }
    },
    "ServerComments": "1"
}]
}

此 JSON 以 text/html 内容类型发送,因为它是文件上传操作的结果。这可能是问题的一部分吗?

好的,我继续追查问题,发现ExtJS对隐藏iframe的返回值做了这个函数:

doFormUpload : function(o, ps, url){
        ...

            try{
                doc = frame.contentWindow.document || frame.contentDocument || WINDOW.frames[id].document;
                if(doc){
                    if(doc.body){
                        if(/textarea/i.test((firstChild = doc.body.firstChild || {}).tagName)){ 
                            r.responseText = firstChild.value;
                        }else{
                            r.responseText = doc.body.innerHTML;  << THIS IS WHERE MY &quot; get decoded back to " (sign)
                        }
                    }

                    r.responseXML = doc.XMLDocument || doc;
                }
            }
            catch(e) {}

            ...
    }

这个问题有没有好的解决方法。好像浏览器会自动解码值???任何人????这是个大问题!!

【问题讨论】:

  • 您的 JSON 有效。我会把这个贴在 Sencha.com 网站的 EXT 论坛上。这听起来像一个错误。
  • 你能用 Firebug 之类的方式查看响应,以确保从服务器正确返回 JSON 字符串吗?
  • FWIW:JSON 无效。所有键都需要引用。使用eval()时并不重要...
  • 此 JSON 以 text/html 内容类型发送,因为它是文件上传操作的结果。这可能是问题的一部分吗?
  • 我无法在 Firebug 中查看响应,因为它在提交文件时由于某种原因没有显示。

标签: javascript extjs extjs3


【解决方案1】:

这是我的解决方法。

问题是所有浏览器都会自动解码 & quot;迹象。

所以我已将 Ext doFormUpload 函数修复为如下所示:

  doFormUpload : function(o, ps, url){
    ...

        try{
            doc = frame.contentWindow.document || frame.contentDocument || WINDOW.frames[id].document;
            if(doc){
                if(doc.body){
                    if(doc.body.innerText){
                            r.responseText = doc.body.innerText;
                        }else{
                            r.responseText = doc.body.innerHTML.replace(/<pre>/ig,'').replace(/<\/pre>/ig,'');
                        }
                }

                r.responseXML = doc.XMLDocument || doc;
            }
        }
        catch(e) {}

        ...
}

此外,从现在开始,服务器返回的内容类型是“text/plain” 这可以防止浏览器解码数据。 我还从不支持 innerText 属性的 FF 中添加了一个小解决方法,但添加了包装响应的标签。

这是对 ExJS 框架的丑陋破解,但它对我有用。

希望有人会注意到这个问题,并对如何解决它有更好的想法。

【讨论】:

    【解决方案2】:

    看起来编码的引号不会导致您的问题 - 看看这个 jsfiddle 以了解 Ext.decode 函数在解码包含 &amp;quot; 的 JSON 字符串时工作得非常好:

    http://jsfiddle.net/MXVvR/

    您确定服务器返回的是 JSON 字符串而不是 JSON 对象吗?使用 Firebug、Fiddler 或 Chrome 开发人员工具检查服务器响应,以准确了解服务器返回的内容。

    【讨论】:

    • 所以,这意味着服务器据称返回的不是我认为它返回的。这意味着“在到达客户端之前以某种方式被解码。
    • 服务器已经完美响应,问题是浏览器从带有 innerHTML 属性的隐藏 ifra 主体中获得了响应(Extjs 的人是这样实现的)和 quot;在那里解码。看看我的工作......
    猜你喜欢
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 2017-10-20
    • 2016-10-03
    • 1970-01-01
    相关资源
    最近更新 更多