我正在处理的困境是在jquery-bbq code中,因为IE6和IE7不支持hashchange
,所以它们会加载两次页面以便具有历史状态。
这会产生负面影响,因为代码在服务器端和客户端都运行两次。用于创建iframe的方法是:
if ( is_old_ie ) {
// Create hidden IFRAME at the end of the body.
iframe = $('<iframe src="javascript:0"/>').hide().appendTo( 'body' )[0].contentWindow;
// Get history by looking at the hidden IFRAME's location.hash.
get_history = function() {
return get_fragment( iframe.document.location.href );
};
// Set a new history item by opening and then closing the IFRAME
// document, *then* setting its location.hash.
set_history = function( hash, history_hash ) {
if ( hash !== history_hash ) {
var doc = iframe.document;
doc.open().close();
doc.location.hash = '#' + hash;
}
};
// Set initial history.
set_history( get_fragment() );
}
创建了一个src为javascript:0
的空白iframe。调用document.open
方法,它似乎抓取父窗口的location.href
作为以.open
打开的页面的默认值。
我基本上必须修改代码,以便它不会打开相同的网址两次,所以我希望覆盖默认值并指定一个参数,例如?iframe = true。
示例:
http://example.com/views/step-2?one=two
在IE中,上面的页面被加载,然后再次加载到iframe中。服务器端代码执行两次,但我不希望这种情况发生。
我想将&iframe=1
附加到URI,以便在指定iframe
参数时阻止我的服务器端代码运行。
最明显的两件事是:
document.open.close
而不是使用iframe.location.href
,而是手动将其设置为href。如果有人有iframe黑客的经验,我会非常感谢一些提示。
编辑:我想到的另一种解决方法是通过iframe / ajax加载一个页面,该页面在iframe执行document.open
之前设置会话变量,这会创建一个'iframeloading的会话变量'等于1,并在iframe加载上设置一个加载事件处理程序将其设置为0,如果session var设置为1,则调整我的服务器端代码不执行。例如:
$('<iframe src="/iframe-loading.php"/>').hide().appendTo('body');
document.open().close()
$( document.defaultView ).load(function() {
$('<iframe src="iframe-doneloading.php/>').hide().appendTo('body');
});
答案 0 :(得分:1)
关于“是否有标准的方法来定义在document.open调用中打开的href?”
不,没有。