Как iframe может изменить фрагмент URL своего родителя (не вызывая обновления)? - PullRequest
0 голосов
/ 26 июня 2009

Я пытаюсь заставить дочернее приложение JavaScript обновить свой родительский документ.

По сути, это очень простая проблема:

  • JavaScript-программа открывает iframe в своем собственном документе.
  • загружена другая программа JavaScript в iframe.
  • вторая программа должна быть изменена фрагмент (якорь) в оригинале стр.
  • первая программа, затем "идет" к новый фрагмент (позиция документа обновляется, но документ не обновилась).

В бесконечном количестве веб-страниц есть описания того, как это сделать, используя такие приемы, как:

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

Но когда я делаю это в IE, родитель, кажется, обновляется сам. Я думаю, что страница перезагружается.

Просто чтобы сделать это немного сложнее:

  • Мне нужны решения для всех браузеров (или, по крайней мере, IE и Firefox).
  • Обе программы JavaScript на самом деле являются веб-приложениями GWT (поэтому я могу привязать определенный код к различным версиям браузера).
  • При необходимости я могу сделать странные вещи, чтобы обойти безопасность, родитель и ребенок всегда будут известны друг другу. Ребенок всегда вызывается родителем.

Я пробовал кучу других приемов, перечисленных на разных веб-страницах, но пока что ничего не кажется стабильным и достаточно простым для развертывания.

Ответы [ 2 ]

1 голос
/ 26 июня 2009

Используйте element.scrollIntoView или scrollTo в зависимости от вашего браузера.

0 голосов
/ 26 июня 2009

В моем приложении обнаружен следующий 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.

...