【问题标题】:parent event handler for form submit target = _parent browser compatibility表单提交目标的父事件处理程序 = _parent 浏览器兼容性
【发布时间】:2011-05-11 19:21:26
【问题描述】:

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

我正在处理我无法控制的第三方 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 时。浏览器看起来希望顶级父域与inner-inner-inner iframe 域相同。

这表明 _parent 表单属性不是指上下文父级,而是指顶级父级? (尽管事件捕获发生在该 iframe 的直接父级中......)也许它总是会一直冒泡?

顺便说一句,如果有人想知道,这是一个 facebook 应用程序,它是一个画布页面,其中包含一个 iframe,里面有一个多朋友请求选择器。

【问题讨论】:

  • 我没有意识到您已经回答了自己的问题 - 将您的解决方案发布为答案,然后选择它

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


【解决方案1】:

我正在研究一个类似的问题,并在Clickjacking 上看到以下文章,其中包含一些有趣的琐事:

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

descendant frame navigation policy”似乎对后代框架对父框架的作用设置了一些限制。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 2020-03-01
    相关资源
    最近更新 更多