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