表单的父事件处理程序提交target = _parent浏览器兼容性

时间:2010-11-18 02:48:50

标签: javascript forms iframe cross-domain cross-browser

我无法在表单提交时捕获事件。

我正在处理我无法控制的第三方iframe,当用户点击那里的提交按钮时,它调用javascript函数在javascript中执行form.submit():

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,iframe或浏览器的函数。

此外,当您提交_parent时,正确的事件是什么?在哪里听?我假设_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中的内容,并且浏览器阻止了这个孩子的第三个-party iframe重新指导父母。

当我将mydomain.com放回到它自己的iframe中时,它将在生产代码中,浏览器不再阻止此重定向 - 看来这是导致我的跨域问题,因为代码不起作用当我尝试设置包含mydomain.com的localhost iframe时。浏览器看起来希望顶级父域与内部内部内部iframe域相同。

这表明_parent表单属性不引用上下文父项,它是指顶级父项? (虽然事件捕获发生在那个iframe的直接父母......)也许它总会一直冒泡?

btw,如果有人想知道,这是一个Facebook应用程序,它是一个画布页面,其中包含一个内部有多个朋友请求选择器的iframe。

1 个答案:

答案 0 :(得分:1)

我正在研究类似的问题,并且在Clickjacking上发现了以下关于这个有趣的琐事的文章:

  

然而,如果攻击者附上了   在另一个框架内的受害者(a   双帧),然后访问   parent.location成为安全性   由于违反了所有流行的浏览器   到 后代框架导航   政策。此安全违规   禁用反作用   导航

descendant frame navigation policy”似乎对后代帧可以对父帧做什么设置了一些限制。

我知道这不能回答这个问题,但也许它会解释这个问题。但也许不是。只是想分享。