iframe的点击事件

2019-10-10  本文已影响0人  蜗牛Coming

内容摘抄自: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。

如果activeElement一直是iframe,则回调函数则不再执行,这也就是为什么一直点击iframe,只执行一次的原因。
上一篇 下一篇

猜你喜欢

热点阅读