17

我想将点击事件添加到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">
4

5 回答 5

31

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

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

注意:这只有在两个页面都在同一个域中时才有效。

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

于 2013-02-26T03:02:01.460 回答
21

两种解决方案:

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

1.使用:after

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

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 元素不会注册任何点击,因此一个用例是 ie:如果通过单击 iframe 您想将其放大全屏......等等......
  • 另外(@Christophe 建议)IE8 对pointer-events:\
于 2013-02-26T02:19:17.750 回答
1

我让它工作,但只有在将它上传到主机之后。我想 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>
于 2013-02-26T02:58:42.373 回答
0
$(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 真的不值得麻烦。

于 2013-02-26T02:32:17.017 回答
0

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

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

该问题的演示

那么如何完成呢?

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

于 2013-02-26T02:35:39.083 回答