内容摘抄自:https://www.cnblogs.com/limeiky/p/6632796.html
需求:
点击一个按钮,显示出一个下拉框的效果,点击页面的其他部位,让下拉框隐藏。
如果没有iframe,则可以通过判断点击元素的类名的方式,通过排除方法来实现。
如果iframe在本地,不存在跨域问题,还可以通过在父页面绑定方法来隐藏。
document.getElementById('iframeID').contentWindow.addEventListener('click',clickevent,false);
//tips:
//解绑事件:removeEventListener('click',clickevent,false);
//如果要移除事件句柄,addEventListener() 的执行函数必须使用外部函数,如上面的clickevent
//如果是匿名函数,类似 "document.removeEventListener("event", function(){ myScript });" 该事件是无法移除的。
如果是跨域的,获取不到iframe的document,则还可以通过document.activeElement来实现。
var IframeOnClick = {
resolution: 200,
iframes: [],
interval: null,
Iframe: function() {
this.element = arguments[0];
this.cb = arguments[1];
this.hasTracked = false;
},
track: function(element, cb) {
this.iframes.push(new this.Iframe(element, cb));
if (!this.interval) {
var _this = this;
this.interval = setInterval(function() { _this.checkClick(); }, this.resolution);
}
},
checkClick: function() {
if (document.activeElement) {
var activeElement = document.activeElement;
for (var i in this.iframes) {
if (activeElement === this.iframes[i].element) {
if (this.iframes[i].hasTracked == false) {
this.iframes[i].cb.apply(window, []);
this.iframes[i].hasTracked = true;
}
} else {
this.iframes[i].hasTracked = false;
}
}
}
}
};
调用的时候:
IframeOnClick.track(document.getElementById("iFrame"), function() { console.log('123') });
tips:
其实这种写法是做了个类似轮循,每隔200ms,就去判断当前页面的activeElement,如果是传入的iframe,并且hasTracked是false,就执行传入的回调函数,并把hasTracked的值置为true;
如果当前的activeElement不是iframe,就把iframe的hasTracked 置为false。