Есть ли стандартный способ определения href, который открывается в вызове document.open? - PullRequest
8 голосов
/ 29 августа 2011

Дилемма, с которой я сталкиваюсь, заключается в том, что в коде 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 с источником javascript:0. Вызывается метод document.open, и кажется, что он захватывает location.href родительского окна в качестве значения по умолчанию для страницы, которая открывается с .open.

Мне в основном нужно изменить код, чтобы он не открывал один и тот же URL дважды, поэтому я стараюсь переопределить значение по умолчанию и указать параметр, например? Iframe = true.

Пример:

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

В IE вышеуказанная страница загружается, а затем снова загружается в iframe. Код на стороне сервера выполняется дважды , но я не хочу, чтобы это произошло.

Я хочу добавить &iframe=1 к URI, чтобы я мог запретить выполнение моего серверного кода, если указан параметр iframe.

Две наиболее очевидные вещи:

  1. Установите src для iframe, но это может иметь отрицательный эффект, и я уверен, что оно есть по какой-то причине.
  2. Вместо использования document.open.close, используйте iframe.location.href и установите его в href вручную.

Если у кого-то был опыт взлома iframe, я был бы очень признателен за некоторые советы.

EDIT : Еще один обходной путь, о котором я подумал, - это загрузка страницы через iframe / ajax, который устанавливает сеансовую переменную до того, как iframe выполняет document.open, который создает переменную сеанса iframeloading, которая равным 1, и установите обработчик события загрузки на загрузку iframe, чтобы установить его обратно в 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');
});

1 Ответ

1 голос
/ 21 сентября 2011

О "Есть ли стандартный способ определения href, который открывается в вызове document.open?"

Нет, нет.

...