родительский обработчик события для отправки формы target = _parent совместимость браузера - PullRequest
0 голосов
/ 18 ноября 2010

У меня возникают проблемы при захвате события при отправке формы.

Я имею дело с сторонним iframe, над которым у меня нет контроля, и когда пользователь нажимает там кнопку отправки, он вызывает javascriptфункция, которая выполняет form.submit () в javascript с помощью:

target="_parent". 

Этот сторонний iframe также находится во вложенном iframe.

Так как этот html-код включал javascript и другие документы, я попытался представить его как можно лучше:

pseudocode:

[page mydomain.com/main]
    [iframe mydomain.com/inner-frame]
        <script type="text/javascript">
            window.onbeforeunload = function(){
                alert('trying to submit');
            }
        </script>

        [iframe third-party-iframe.com]
            <form action="mydomain.com/form-action" target="_parent" method="POST">
                <input type="submit" />
            </form>
        [/ third party iframe]
    [/iframe]
[page]

Проблема в том, что кажется, что событие отправки формы не фиксируется последовательнов родительском документе.

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

В Firefox срабатывает событие onbeforeunload, но в Chrome это не происходит, и, похоже, происходит ошибка с«Небезопасная попытка JavaScript получить доступ к фрейму» до того, как произойдет какое-либо событие.

Также странным является тот факт, что отправка формы не отправляется родительскому элементу iframe, она просто открывает новую вкладку с этим URL (form-action.php в моем примере).

Может кто-нибудь пролить свет на то, что такое поведение?Я даже не уверен, является ли это поведение (без событий, новая вкладка браузера) функцией javascript, iframes или браузера.

Кроме того, что является правильным событием для прослушивания, когда у вас есть _parent submit?А где послушать?Я предполагаю, что _parent ссылается на прямого родителя фрейма.

==================================

ОБНОВЛЕНИЕ:

Я неправильно сформулировал проблему, но выяснил, почему она не работает:

ВНа самом деле код выглядит примерно так:

pseudocode:
[page third-party-site.com]
  [page mydomain.com/main]
     [iframe mydomain.com/inner-frame]
        <script type="text/javascript">
            window.onbeforeunload = function(){
                alert('trying to submit');
            }
        </script>

        [iframe third-party-site.com/iframe]
            <form action="mydomain.com/form-action" target="_parent" method="POST">
                <input type="submit" />
            </form>
        [/ third party iframe]
      [/iframe]
  [page]
[/page]

Я искал страницу за пределами первого iframe по причинам отладки, поэтому я предполагаю, что форма на сайте third-part-site.com пыталась перенаправитьчто-то внутри mydomain.com, и браузер блокировал этот дочерний сторонний iframe от перенаправления родителя.

Когда я помещаю mydomain.com обратно в свой собственный iframe, где он будет находиться в производственном коде, браузер больше не блокирует это перенаправление - кажется, что это вызвало мою междоменную проблему, потому что код нене работает, когда я пытаюсь установить локальный iframe, содержащий mydomain.com.Браузер выглядит так, как будто он хочет, чтобы верхний родительский домен был таким же, как и внутренний-внутренний-внутренний домен iframe.

Это может означать, что атрибут формы _parent не относится к контекстному родительскому элементу, он относится к верхнему родительскому элементу?(хотя захват события происходит в непосредственном родителе этого iframe ...) может быть, он всегда будет пузыриться до конца?

Кстати, если кто-то хочет знать, это приложение для Facebook, этоСтраница холста, содержащая iframe, в котором есть селектор запросов для нескольких друзей.

1 Ответ

1 голос
/ 05 марта 2011

Я исследую подобную проблему и наткнулся на следующую статью о Clickjacking , в которой содержался этот интересный мелочи:

Однако, если злоумышленник заключает жертву водин фрейм внутри другого (двойной фрейм), затем доступ к parent.location становится нарушением безопасности во всех популярных браузерах из-за политики навигации в нисходящем фрейме .Это нарушение безопасности отключает навигацию противодействия.

« Политика навигации по потомкам », по-видимому, накладывает некоторые ограничения на то, что потомки могут делать с родительскими.

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

...