检测 iframe 内的点击事件

IT技术 javascript jquery html iframe tinymce
2021-02-28 07:19:43

我正在为 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      
}); 

我见过的其他帖子通常在不同的域中都有问题(这没有)。但是,仍然没有检测到该事件。

可以做这样的事情吗?

6个回答

我通过这样做解决了它:

$('#filecontainer').load(function(){

        var iframe = $('#filecontainer').contents();

        iframe.find("#choose_pics").click(function(){
               alert("test");
        });
});
.load() 在这里真的起着关键作用
2021-04-17 07:19:43
jQuery 3: $('#filecontainer').on('load', function(){
2021-05-08 07:19:43
我收到 SecurityError: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin... 看起来这是一个安全问题并被 Chrome 阻止。
2021-05-10 07:19:43
如果有人对接受的答案的“完全可重现”版本感兴趣,请参阅我最后的帖子,... - 为其他人节省几分钟;) 也可以通过编辑集成到此答案中,我只是想可能会帮助别人。
2021-05-14 07:19:43

我不确定,但你可以使用

$("#filecontainer #choose_pic").click(function() {
    // do something here
});

或者你可以<script>在 iframe 中添加一个标签(如果你可以访问里面的代码),然后window.parent.DoSomething()在框架中使用代码

function DoSomething() {
    // do something here
}

在父级。如果这些都不起作用,请尝试window.postMessage. 这是有关的一些信息

第二个也适用于我的情况。投票赞成,因为所有其他解决方案都没有帮助。
2021-04-30 07:19:43
我有,但我希望父级在单击时从 iframe 中捕获一些数据
2021-05-06 07:19:43
谢谢,我使用了window.parent在我的情况下非常有效解决方案!
2021-05-09 07:19:43

我知道这是旧的,但代码中的 ID 不匹配,一个是choose_pic一个是choose_pics

<input type=button id=choose_pics value='Choose'>

$("#filecontainer").contents().find("#choose_pic").click(function(){
    //do something      
}); 
$("#iframe-id").load( function() {
    $("#iframe-id").contents().on("click", ".child-node", function() {
        //do something
    });
});
简单干净的解决方案
2021-05-01 07:19:43

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);
      });
   }
});