IE10不能显示JSON文件内容

IE7,8,9下Ajax返回后,再执行跳转,会弹出阻止提示框。

所以我采用WebForm 提交思想:

    //导出
    jv.postOpen = jv.PostOpen =  jv.Export = function (url, postJson, op) {
        
        var entity = op.entity ;
        var target = op.target || entity;

        var _createIframe = function (id) {
            var iframe = jv.toElement('<iframe src="javascript:false;" name="' + id + '" />');
            iframe.setAttribute('id', id);
            iframe.style.display = 'none';
            document.body.appendChild(iframe);
            return iframe;
        },
        _createForm = function (target) {
            var form = jv.toElement('<form method="POST"></form>');
            form.setAttribute('action', url);
            form.setAttribute('target', target);
            form.style.display = 'none';

            var isSimple = function (type) {
                return ["string", "number", "date"].indexOf(type) >= 0;
            };


            var json = {};
            var rec = function (obj, prefix) {
                if (jv.IsNull(obj)) return;

                if (prefix) prefix += ".";

                for (var k in obj) {
                    var v = obj[k];
                    var t = jv.getType(v);
                    if (isSimple(t)) {
                        json[prefix + k] = v;
                        continue;
                    }
                    rec(v, prefix + k);
                }
            };


            rec(postJson, "");

            if (json) {
                for (var k in json) {
                    form.appendChild(jv.toElement('<input type="hidden" name="' + k + '" value="' + json[k] + '" />'));
                }
            }

            document.body.appendChild(form);
            return form;
        };


        if (op.self) {
            var iframe = _createIframe(target);

            var fn = function () {
                if (!iframe.parentNode) {
                    return;
                }


                var response;
                var doc = iframe.contentDocument ? iframe.contentDocument : iframe.contentWindow.document;

                try {
                    var innerHTML ; 
                    var $html = $(doc.body.innerHTML) ;
                    var $pre =  $html.find("pre");
                    if ($pre.length == 0 ) innerHTML = $html.text() ;
                    else innerHTML = $pre.text() ;
                     
                    //ie 返回的pre内容里,有 font ,还额外赠送一个 ^ 号。
                    if( innerHTML.slice(-1) == '^') innerHTML = innerHTML.slice(0,-1) ;

//                    if (innerHTML.length > 10 && innerHTML.slice(0, 4).toLowerCase() == '<pre' && innerHTML.slice(-6).toLowerCase() == '</pre>') {
//                        innerHTML = doc.body.firstChild.firstChild.nodeValue;
//                    }

                    if (innerHTML.length > 1 && innerHTML.slice(0, 1) != "<") {
                        if ( innerHTML.slice(0, 1) == "{" && innerHTML.slice(-1) == "}"){
                            response = $.parseJSON( innerHTML) ;
                        }
                        else {
                            response = jv.execJs( innerHTML );
                        }
                    }
                } catch (err) {
                    response = { success: false };
                }

                if (response && response.extraJs)  jv.execJs(response.extraJs);

                if (op.callback) op.callback(response,doc);
            };

            //优先使用 attachEvent , 解决IE9下的BUG。
            if (iframe.attachEvent) {
                iframe.attachEvent('onload', fn);
            }
            else if (iframe.addEventListener) {
                iframe.addEventListener('load', fn, false);
            }  
        }
        else {
            var p = { entity: entity };
            var whConfig = jv.PopListConfig(p.area, p.entity, p.detail);

            if (!p.width) {
                p.width = whConfig[0];
            }

            if (!p.height) {
                p.height = whConfig[1];
            }

            p.openMode = whConfig[2] || target;

            //多次打印多个窗口

            p.entity = entity;
            p.autoFocus = false;

            jv.Pop("", p);
        }


        var form = _createForm(target);
        form.submit();
    };

 

但 IE10 下由于无法直接解析 JSON, 在使用该机制时,会弹出下载提示,并且阻止客户端的解析。

解决方案:http://blog.csdn.net/wang_shaner/article/details/6668359

 

Windows Registry Editor Version 5.00
 
[HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"Encoding"=dword:00080000


[HKEY_CLASSES_ROOT\MIME\Database\Content Type\text/json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"encoding"=dword:00080000

 

经测试,是可行的。但让用户这样干,恐怕不好实行。

另一种方法: 把返回的 Json 标志改为 text/html , 但这也太狗血了。

等着 IE10 SP1 吧。狗血的IE

 

 

posted @ 2013-06-27 11:02  NewSea  阅读(4911)  评论(0编辑  收藏  举报