将点击事件添加到 iframe

IT技术 javascript jquery iframe
2021-01-20 03:02:20

我想将一个点击事件添加到iframe. 我使用了这个例子并得到了这个:

$(document).ready(function () {
   $('#left').bind('click', function(event) { alert('test'); });
});

<iframe src="left.html" id="left">
</iframe>

但不幸的是什么也没有发生。
当我用另一个元素(例如按钮)测试它时,它可以工作:

<input type="button" id="left" value="test">
5个回答

您可以将点击附加到 iframe 内容:

$('iframe').load(function(){
  $(this).contents().find("body").on('click', function(event) { alert('test'); });
});

注意:这仅在两个页面位于同一域中时才有效。

现场演示:http : //jsfiddle.net/4HQc4/

当您单击 iframe 正文中的任意位置时,它会起作用。这是另一个单击附加到窗口的示例:jsfiddle.net/4HQc4/1
2021-03-25 03:02:20
也可以在此 iframe 中的特定 DIV 上添加点击事件?我的 iframe 分为 2 个 div,只有其中一个应该是可点击的。
2021-03-28 03:02:20
当然:-) $(this).contents().find("#idOfTheClickableDiv")。contents() 是 iframe 文档,从那里您可以在 iframe 中访问任何您想要的内容……前提是您不违反同源策略。
2021-03-31 03:02:20
原来如此。它只在我点击文本时有效,而不是页面上的其他地方。
2021-04-09 03:02:20
你的 Life 演示中的代码对我有用: $($("iframe")[0].contentWindow).on('contextmenu', function(e) { alert('test'); });
2021-04-13 03:02:20

两种解决方案:

  1. 使用:after一对.iframeWrapper元素
  2. 使用pointer-events:none;一个 iframe

1. 使用 :after

很直接。iframe 包装器有一个:after具有更高 z-index(透明)伪元素- 这将有助于包装器注册点击:

jQuery(function ($) { // DOM ready
  
   $('.iframeWrapper').on('click', function(e) {
     e.preventDefault();
     alert('test');
   });
  
});
.iframeWrapper{
  display:inline-block;
  position:relative;
}
.iframeWrapper:after{ /* I have higher Z-index so I can catch the click! Yey */
  content:"";
  position:absolute;
  z-index:1;
  width:100%;
  height:100%;
  left:0;
  top:0;
}

.iframeWrapper iframe{
  vertical-align:top;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="iframeWrapper">
  <iframe src="http://www.reuters.tv/" frameBorder="0"></iframe>
</div>

2. 使用 pointer-events:none;

无法从外部资源的 iframe外部处理点击(如果 iframe 不在您的域中)。
您只能在“调用到 iframe”页面中创建该函数,而不能从iframe 托管页面中创建。

怎么做

  • 您可以您的内容包装iframe成一个 div
  • 让点击“通过”你iframe使用的 CSSpointer-events:none;
  • 目标点击jQuery您的包装DIViframe父元素)

jQuery(function ($) { // DOM ready
  
   $('.iframeWrapper').on('click', function(e) {
     e.preventDefault();
     alert('test');
   });
  
});
.iframeWrapper{
  display:inline-block;
  position:relative;
}

.iframeWrapper iframe{
  vertical-align:top;
  pointer-events: none; /* let any clicks go trough me */
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="iframeWrapper">
  <iframe src="http://www.reuters.tv/" frameBorder="0"></iframe>
</div>

诺塔贝内:

  • iframe 元素不会注册任何点击,因此一个用例是:如果通过单击 iframe 想要将其放大全屏......等等......
  • 另外(@Christophe 亲切地建议)IE8 对以下内容视而不见pointer-events:\
你怎么能“释放”点击回到 iframe ?
2021-03-16 03:02:20
@RickyLevi 我认为没有办法这样做。如果有,那就是安全/隐私问题。
2021-03-22 03:02:20
@Christophe doh,忘了提到 IE 甚至无法position正确处理... :)(我们应该注意这一点);)开玩笑,谢谢
2021-04-11 03:02:20

我让它工作,但只有在将它上传到主机之后。我想 localhost 也能正常工作。

<html>
   <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
    <script>
        $(document).ready(function() {
            var myFrame = document.getElementById("myFrame");
            $(myFrame.contentWindow.document).find("div").on("click", function () { alert("clicked"); });
        });
    </script>
    <body>
        <iframe id="myFrame" src="inner.htm"></iframe>
    </body>
</html>

<html>
    <head>
        <style>
            div {
                padding:2px;
                border:1px solid black;
                display:inline-block;
            }
        </style>
    </head>
    <body>
        <div>Click Me</div>
    </body>
</html>
将在 CORS 上被阻止
2021-04-12 03:02:20
$(document).ready(function () {
 $('#left').click(function(event) { alert('test'); });
});

<iframe src="left.html" id="left">Your Browser Does Not Support iframes</iframe>

该脚本必须完全从 iframe 运行。我会推荐一种不同的调用内容的方法,例如 php。

iframe 真的不值得麻烦。

实际问题是,click事件没有绑定到iframe的DOM,bind()被弃用,用于.on()绑定事件。尝试使用以下代码,您会发现 iframe 的边框可点击以获取该警报。

$('#left').on('click', function(event) { alert('test'); });

该问题的演示

那么如何完成呢?

你应该怎么做,在 iframe 页面上创建一个函数,然后从该 iframe 页面调用该函数。

明白了,谢谢 我只是想知道,为什么它在上面提到的示例中似乎有效(stackoverflow.com/questions/1609741/...)。
2021-03-15 03:02:20
@RickyLevi,你有 JsFiddle 的例子要展示吗?
2021-03-17 03:02:20
我只是在评论中加载链接,然后根据该代码单击 IFRAME - 应该弹出警报(或者我可能误解了演示)......警报永远不会弹出。
2021-03-25 03:02:20