我在页面上有一个iframe来自第三方(广告)。我想在点击iframe时发出点击事件(记录一些内部统计数据)。类似的东西:
$('#iframe_id').click(function() {
//run function that records clicks
});
..基于HTML:
<iframe id="iframe_id" src="http://something.com"></iframe>
我似乎无法对此进行任何变化。想法?
答案 0 :(得分:36)
iframe没有“onclick”事件,但您可以尝试在iframe中捕获文档的click事件:
document.getElementById("iframe_id").contentWindow.document.body.onclick =
function() {
alert("iframe clicked");
}
修改强> 虽然这不能解决您的跨站点问题,但FYI jQuery已经更新,可以很好地与iFrames配合使用:
$('#iframe_id').on('click', function(event) { });
2015年第1期更新 iframe解释的链接已被删除,因为它已不再可用。
注意强> 如果iframe来自与主页不同的域,则上述代码将不起作用。您仍然可以尝试使用评论中提到的黑客。
答案 1 :(得分:15)
尝试使用:iframeTracker jQuery Plugin,就像那样:
jQuery(document).ready(function($){
$('.iframe_wrap iframe').iframeTracker({
blurCallback: function(){
// Do something when iframe is clicked (like firing an XHR request)
}
});
});
答案 2 :(得分:12)
我试图找到一个更独立的更好的答案,所以我开始思考JQuery如何做事件和自定义事件。由于click(来自JQuery)只是任何事件,我认为所有我必须做的就是触发事件,因为已经点击了iframe的内容。因此,这是我的解决方案
$(document).ready(function () {
$("iframe").each(function () {
//Using closures to capture each one
var iframe = $(this);
iframe.on("load", function () { //Make sure it is fully loaded
iframe.contents().click(function (event) {
iframe.trigger("click");
});
});
iframe.click(function () {
//Handle what you need it to do
});
});
});
答案 3 :(得分:7)
仅当框架包含来自同一域的页面时才有效 不违反同源政策)
见:
var iframe = $('#your_iframe').contents();
iframe.find('your_clicable_item').click(function(event){
console.log('work fine');
});
答案 4 :(得分:4)
您可以通过具有以下内容来模拟焦点/点击事件。 (改编自$(window).blur event affecting Iframe)
$(window).blur(function () {
// check focus
if ($('iframe').is(':focus')) {
console.log("iframe focused");
$(document.activeElement).trigger("focus");// Could trigger click event instead
}
else {
console.log("iframe unfocused");
}
});
//Test
$('#iframe_id').on('focus', function(e){
console.log(e);
console.log("hello im focused");
})
&#13;
答案 5 :(得分:1)
所有建议的答案都不适合我。我通过以下方式解决了类似案例:
<a href="http://my-target-url.com" id="iframe-wrapper"></a>
<iframe id="iframe_id" src="http://something.com" allowtrancparency="yes" frameborder="o"></iframe>
css (当然,确切定位应根据应用要求进行更改):
#iframe-wrapper, iframe#iframe_id {
width: 162px;
border: none;
height: 21px;
position: absolute;
top: 3px;
left: 398px;
}
#alerts-wrapper {
z-index: 1000;
}
当然,现在你可以在iframe-wrapper上捕获任何事件。
答案 6 :(得分:1)
您可以使用此代码绑定点击iframe中的元素。
jQuery('.class_in_iframe',jQuery('[id="id_of_iframe"]')[0].contentWindow.document.body).on('click',function(){
console.log("triggered !!")
});
&#13;
答案 7 :(得分:0)
可能有点旧,但这可能对尝试处理相同域策略的人有用。
let isOverIframe = null;
$('iframe').hover(function() {
isOverIframe = true;
}, function() {
isOverIframe = false;
});
$(window).on('blur', function() {
if(!isOverIframe)
return;
// ...
});
答案 8 :(得分:-1)
对于使用Primefaces(使用CKEditor)的人来说,这可能很有趣:
document.getElementById('form:somecontainer:editor')
.getElementsByTagName('iframe')[0].contentWindow
.document.onclick = function(){//do something}
我基本上只是从Travel Tech Guy那里得到答案并稍微改变了选择..;)
答案 9 :(得分:-1)
适合我的解决方案:
var editorInstance = CKEDITOR.instances[this.editorId];
editorInstance.on('focus', function(e) {
console.log("tadaaa");
});
答案 10 :(得分:-1)
您可以很轻松地解决它,只需将iframe包裹在包装器中,并跟踪对其的点击。
赞:
<div id="iframe_id_wrapper">
<iframe id="iframe_id" src="http://something.com"></iframe>
</div>
并在iframe本身上禁用指针事件。
#iframe_id { pointer-events: none; }
更改后,您的代码将按预期工作。
$('#iframe_id_wrapper').click(function() {
//run function that records clicks
});