【发布时间】: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