8

我正在处理的困境是,在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() );
  }

创建了一个带有 src 的空白 iframe javascript:0。该document.open方法被调用,似乎它抓住了location.href父窗口的默认值作为打开的页面的默认值.open

我基本上必须修改代码,使其不会两次打开相同的 url,所以我希望覆盖默认值并指定一个参数,例如 ?iframe=true。

例子:

http://example.com/views/step-2?one=two

在 IE 中,上面的页面被加载,然后在 iframe 中再次加载。服务器端代码执行两次,但我不希望这种情况发生。

我想附加到 URI,以便在指定参数的情况&iframe=1下阻止我的服务器端代码运行。iframe

最明显的两件事是:

  1. 设置 iframe 的 src,但这可能会产生负面影响,我很确定它的存在是有原因的。
  2. 而不是 use document.open.close,而是iframe.location.href手动使用并将其设置为 href 。

如果有人有过 iframe 黑客攻击的经验,我将不胜感激一些提示。

编辑:我想到的另一个解决方法是通过 iframe/ajax 加载页面,该页面在 iframe 执行之前设置document.open会话变量,这会创建一个等于 1 的“iframeloading”会话变量,并在 iframe 上设置一个加载事件处理程序load 将其设置回 0,并调整我的服务器端代码以在会话 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');
});
4

1 回答 1

1

关于“是否有定义在 document.open 调用中打开的 href 的标准方法?”

不,那里没有。

于 2011-09-21T11:28:04.233 回答