我正在处理的困境是,在jquery-bbq代码,因为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() );
}
创建一个空白iframe, src为javascript:0
。document.open
方法被调用,并且它似乎捕获父窗口的location.href
作为使用.open
打开的页面的默认值。
我基本上必须修改代码,使它不会打开相同的url两次,所以我正在寻找覆盖默认值并指定一个参数,如?iframe=true。
的例子:http://example.com/views/step-2?one=two
在IE中,上面的页面被加载,然后在iframe中再次加载。服务器端代码执行两次,但我不希望发生这种情况。
我想将&iframe=1
附加到URI中,这样如果指定了iframe
参数,我就可以防止服务器端代码运行。
最明显的两件事是:
- 设置iframe的src,但这可能会产生负面影响,我很确定它的存在是有原因的。
- 不使用
document.open.close
,使用iframe.location.href
并手动设置为href。
如果有人有iframe黑客的经验,我将非常感谢一些提示。
EDIT:我想到的另一个解决方案是通过iframe/ajax加载一个页面,该页面在iframe做document.open
之前设置一个会话变量,它创建一个会话变量' iframloading ',等于1,并在iframeload上设置一个加载事件处理程序,将其设置为0,并调整我的服务器端代码,如果会话变量设置为1,则不执行。比如:
$('<iframe src="/iframe-loading.php"/>').hide().appendTo('body');
document.open().close()
$( document.defaultView ).load(function() {
$('<iframe src="iframe-doneloading.php/>').hide().appendTo('body');
});
About "有没有标准的方法来定义在文档中打开的href ?打开电话吗?"