我正在为TinyMCE编写插件,并且在检测iframe中的点击事件时遇到问题。
从我的搜索中我得出了这个:
正在加载iframe:
<iframe src='resource/file.php?mode=tinymce' id='filecontainer'></iframe>
iframe中的HTML:
<input type=button id=choose_pics value='Choose'>
jQuery的:
//Detect click
$("#filecontainer").contents().find("#choose_pic").click(function(){
//do something
});
我见过的其他帖子通常有不同域名的问题(这没有)。但是,仍然没有发现事件。
可以这样做吗?
答案 0 :(得分:57)
我通过这样做解决了它:
$('#filecontainer').load(function(){
var iframe = $('#filecontainer').contents();
iframe.find("#choose_pics").click(function(){
alert("test");
});
});
答案 1 :(得分:5)
我不确定,但您可以使用
$("#filecontainer #choose_pic").click(function() {
// do something here
});
或者你可以在iframe中添加<script>
标记(如果你有权访问里面的代码),然后在框架中使用window.parent.DoSomething()
,代码为
function DoSomething() {
// do something here
}
父母中的。
如果这些都不起作用,请尝试window.postMessage
。 Here is some info on that
答案 2 :(得分:3)
我知道这已经过时但代码中的ID与 choose_pic 不匹配,其中一个是 choose_pics :
<input type=button id=choose_pics value='Choose'>
$("#filecontainer").contents().find("#choose_pic").click(function(){
//do something
});
答案 3 :(得分:2)
tinymce API处理编辑器iframe中的许多事件。我强烈建议使用它们。以下是单击处理程序
的示例// Adds an observer to the onclick event using tinyMCE.init
tinyMCE.init({
...
setup : function(ed) {
ed.onClick.add(function(ed, e) {
console.debug('Iframe clicked:' + e.target);
});
}
});
答案 4 :(得分:1)
只是发布以防万一。对我来说,以下代码完美无缺:
$(document).ready(function(){
$("#payment_status_div").hide();
var iframe = $('#FileFrame').contents();
iframe.find("#take_payment").click(function(){
$("#payment_status_div").show("slow");
});
});
其中'FileFrame'是iframe ID,'take_payment'是iframe中的按钮。由于我在iframe中的表单被发布到不同的域,因此在使用load时,我收到一条错误消息:
阻止原始“https://www.example.com”的框架访问原点为“https://secure-test.worldpay.com”的框架。协议,域和端口必须匹配。
答案 5 :(得分:1)
$("#iframe-id").load( function() {
$("#iframe-id").contents().on("click", ".child-node", function() {
//do something
});
});
答案 6 :(得分:1)
就我而言,内部和外部HTML都有两个jQuery的。在我附上内部事件之前,我有四个步骤:
$(function() { // 1. wait for the outer jQuery to be ready, aka $(document).ready
$('iframe#filecontainer').on('load', function() { // 2. wait for the iframe to load
var $inner$ = $(this)[0].contentWindow.$; // 3. get hold of the inner jQuery
$inner$(function() { // 4. wait for the inner jQuery to be ready
$inner$.on('click', function () { // Now I can intercept inner events.
// do something
});
});
});
});
诀窍是使用内部jQuery来附加事件。请注意我是如何获得内部jQuery的:
var $inner$ = $(this)[0].contentWindow.$;
我不得不将jQuery淘汰到对象模型中。其他答案中的$('iframe').contents()
方法在我的情况下不起作用,因为它与外部jQuery保持一致。 (然后返回contentDocument
。)
答案 7 :(得分:1)
如果有人对&#34;快速可重复的&#34;感兴趣? 接受的答案的版本,见下文。积分给不在SO的朋友。这个答案也可以通过编辑集成在接受的答案中,...... (它必须在(本地)服务器上运行。)
<html>
<head>
<title>SO</title>
<meta charset="utf-8"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<style type="text/css">
html,
body,
#filecontainer {
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<iframe src="http://localhost/tmp/fileWithLink.html" id="filecontainer"></iframe>
<script type="text/javascript">
$('#filecontainer').load(function(){
var iframe = $('#filecontainer').contents();
iframe.find("a").click(function(){
var test = $(this);
alert(test.html());
});
});
</script>
</body>
</html>
fileWithLink.html
<html>
<body>
<a href="https://stackoverflow.com/">SOreadytohelp</a>
</body>
</html>
答案 8 :(得分:1)
试试
$('#yourIframeid').on("load", function () {
$(this).contents().on("contextmenu, keydown, mousedown, mouseup, click", function (e) {
//do your thing
});
});
如果 $('#yourIframeid').on("load")
不起作用,请使用 $('#yourIframeid').onload(
。
答案 9 :(得分:0)
就我而言,我试图从父文档中触发一个自定义事件,并在子iframe中接收它,所以我必须执行以下操作:
var event = new CustomEvent('marker-metrics', {
detail: // extra payload data here
});
var iframe = document.getElementsByTagName('iframe');
iframe[0].contentDocument.dispatchEvent(event)
以及在iframe文档中:
document.addEventListener('marker-metrics', (e) => {
console.log('@@@@@', e.detail);
});