iframe如何更改其父级的URL片段(不会导致刷新)?

时间:2009-06-26 13:59:16

标签: javascript html gwt iframe fragment-identifier

我正在尝试使用子JavaScript应用程序来更新它的父文档。

从本质上讲,这是一个非常简单的问题:

  • JavaScript程序会打开一个iframe 在它自己的文件中。
  • 加载了另一个JavaScript程序 进入iframe。
  • 第二个程序需要改变 原始中的片段(锚) 页。
  • 第一个程序,然后“转到” 新片段(文件位置 已更新,但文档不是 刷新)。

在无数的网页中,有使用如下技巧的说明:

window.parent.location.hash = "#" + string

但是当我在IE中这样做时,父母似乎在刷新自己。我认为该页面正在重新加载。

只是为了让这有点棘手:

  • 我需要所有浏览器(或至少IE和Firefox)的解决方案。
  • 这两个JavaScript程序实际上都是GWT Web应用程序(因此我可以将特定代码绑定到不同的浏览器版本)。
  • 如果有必要,我可以做一些奇怪的事情来解决安全问题,父母和孩子将永远彼此了解。孩子总是被父母打电话。

我已尝试在各种网页上列出一些其他技巧,但到目前为止,似乎没有任何东西看起来稳定且简单,无法实际部署。

2 个答案:

答案 0 :(得分:1)

根据您的浏览器使用element.scrollIntoViewscrollTo

答案 1 :(得分:0)

我在我的应用中找到了以下JavaScript(由GWT生成):

function $initUrlCheckTimer(this$static){
  var historyImplRef = this$static;
  var urlChecker = function(){
    $wnd.setTimeout(urlChecker, 250);
    var hash = getLocationHash();
    if (hash.length > 0) {
      var token = '';
      try {
        token = historyImplRef.decodeFragment(hash.substring(1));
      }
       catch (e) {
        $wnd.location.reload();
      }
      var historyToken = ($clinit_75() , $wnd.__gwt_historyToken || '');
      if (historyToken && token != historyToken) {
        $wnd.location.reload();
      }
    }
  }
  ;
  urlChecker();
}

我注意到GWT中的顶级文档调用了一个应用程序(生成的代码首先将父级分配给$ wnd,其中$ wnd.location是我的实际URL)。

我在想什么(我可能错了)是GWT历史记录涉及观看__gwt_historyToken,直到它发生变化,然后更新应用程序。如果父位置发生变化,“其他东西”似乎也会强制重新加载。我不能只是改变文档位置,不能以某种方式将它与这个GWT代码集成。