Detect Click into Iframe using JavaScript

前端 未结 21 2289
轻奢々
轻奢々 2020-11-22 03:06

I understand that it is not possible to tell what the user is doing inside an iframe if it is cross domain. What I would like to do is track if the user clicke

相关标签:
21条回答
  • 2020-11-22 03:29

    This definitely works if the iframe is from the same domain as your parent site. I have not tested it for cross-domain sites.

    $(window.frames['YouriFrameId']).click(function(event){  /* do something here  */ });
    $(window.frames['YouriFrameId']).mousedown(function(event){ /* do something here */ });
    $(window.frames['YouriFrameId']).mouseup(function(event){ /* do something here */ });
    

    Without jQuery you could try something like this, but again I have not tried this.

    window.frames['YouriFrameId'].onmousedown = function() { do something here }
    

    You can even filter your results:

    $(window.frames['YouriFrameId']).mousedown(function(event){   
      var eventId = $(event.target).attr('id');      
      if (eventId == 'the-id-you-want') {
       //  do something
      }
    });
    
    0 讨论(0)
  • 2020-11-22 03:31

    The following code will show you if the user click/hover or move out of the iframe:-

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Detect IFrame Clicks</title>
    <script type="text/javascript">
        $(document).ready(function() {
            var isOverIFrame = false;
    
            function processMouseOut() {
                log("IFrame mouse >> OUT << detected.");
                isOverIFrame = false;
                top.focus();
            }
    
            function processMouseOver() {
                log("IFrame mouse >> OVER << detected.");
                isOverIFrame = true;
            }
    
            function processIFrameClick() {
                if(isOverIFrame) {
                    // replace with your function
                    log("IFrame >> CLICK << detected. ");
                }
            }
    
            function log(message) {
                var console = document.getElementById("console");
                var text = console.value;
                text = text + message + "\n";
                console.value = text;
            }
    
            function attachOnloadEvent(func, obj) {
                if(typeof window.addEventListener != 'undefined') {
                    window.addEventListener('load', func, false);
                } else if (typeof document.addEventListener != 'undefined') {
                    document.addEventListener('load', func, false);
                } else if (typeof window.attachEvent != 'undefined') {
                    window.attachEvent('onload', func);
                } else {
                    if (typeof window.onload == 'function') {
                        var oldonload = onload;
                        window.onload = function() {
                            oldonload();
                            func();
                        };
                    } else {
                        window.onload = func;
                    }
                }
            }
    
            function init() {
                var element = document.getElementsByTagName("iframe");
                for (var i=0; i<element.length; i++) {
                    element[i].onmouseover = processMouseOver;
                    element[i].onmouseout = processMouseOut;
                }
                if (typeof window.attachEvent != 'undefined') {
                    top.attachEvent('onblur', processIFrameClick);
                }
                else if (typeof window.addEventListener != 'undefined') {
                    top.addEventListener('blur', processIFrameClick, false);
                }
            }
    
            attachOnloadEvent(init);
        });
    </script>
    </head>
    <body>
    <iframe src="www.google.com" width="100%" height="1300px"></iframe>
    <br></br>
    <br></br>
    <form name="form" id="form" action=""><textarea name="console"
    id="console" style="width: 100%; height: 300px;" cols="" rows=""></textarea>
    <button name="clear" id="clear" type="reset">Clear</button>
    </form>
    </body>
    </html>
    

    You need to replace the src in the iframe with your own link. Hope this'll help. Regards, Mo.

    0 讨论(0)
  • 2020-11-22 03:31

    I ran into a situation where I had to track clicks on a social media button pulled in through an iframe. A new window would be opened when the button was clicked. Here was my solution:

    var iframeClick = function () {
        var isOverIframe = false,
        windowLostBlur = function () {
            if (isOverIframe === true) {
                // DO STUFF
                isOverIframe = false;
            }
        };
        jQuery(window).focus();
        jQuery('#iframe').mouseenter(function(){
            isOverIframe = true;
            console.log(isOverIframe);
        });
        jQuery('#iframe').mouseleave(function(){
            isOverIframe = false;
            console.log(isOverIframe);
        });
        jQuery(window).blur(function () {
            windowLostBlur();
        });
    };
    iframeClick();
    
    0 讨论(0)
  • 2020-11-22 03:32

    see http://jsfiddle.net/Lcy797h2/ for my long winded solution that doesn't work reliably in IE

            $(window).on('blur',function(e) {    
                if($(this).data('mouseIn') != 'yes')return;
                $('iframe').filter(function(){
                    return $(this).data('mouseIn') == 'yes';
                }).trigger('iframeclick');    
            });
    
            $(window).mouseenter(function(){
                $(this).data('mouseIn', 'yes');
            }).mouseleave(function(){
                $(this).data('mouseIn', 'no');
            });
    
            $('iframe').mouseenter(function(){
                $(this).data('mouseIn', 'yes');
                $(window).data('mouseIn', 'yes');
            }).mouseleave(function(){
                $(this).data('mouseIn', null);
            });
    
            $('iframe').on('iframeclick', function(){
                console.log('Clicked inside iframe');
                $('#result').text('Clicked inside iframe'); 
            });
            $(window).on('click', function(){
                console.log('Clicked inside window');
                $('#result').text('Clicked inside window'); 
            }).blur(function(){
                console.log('window blur');
            });
    
            $('<input type="text" style="position:absolute;opacity:0;height:0px;width:0px;"/>').appendTo(document.body).blur(function(){
                    $(window).trigger('blur');
                }).focus();
    
    0 讨论(0)
  • 2020-11-22 03:35

    This is certainly possible. This works in Chrome, Firefox, and IE 11 (and probably others).

    focus();
    var listener = window.addEventListener('blur', function() {
        if (document.activeElement === document.getElementById('iframe')) {
            // clicked
        }
        window.removeEventListener('blur', listener);
    });
    

    JSFiddle


    Caveat: This only detects the first click. As I understand, that is all you want.

    0 讨论(0)
  • 2020-11-22 03:35

    This works for me on all browsers (included Firefox)

    https://gist.github.com/jaydson/1780598

    https://jsfiddle.net/sidanmor/v6m9exsw/

    var myConfObj = {
      iframeMouseOver : false
    }
    window.addEventListener('blur',function(){
      if(myConfObj.iframeMouseOver){
        console.log('Wow! Iframe Click!');
      }
    });
    
    document.getElementById('idanmorblog').addEventListener('mouseover',function(){
       myConfObj.iframeMouseOver = true;
    });
    document.getElementById('idanmorblog').addEventListener('mouseout',function(){
        myConfObj.iframeMouseOver = false;
    });
    <iframe id="idanmorblog" src="https://sidanmor.com/" style="width:400px;height:600px" ></iframe>

    <iframe id="idanmorblog" src="https://sidanmor.com/" style="width:400px;height:600px" ></iframe>

    0 讨论(0)
提交回复
热议问题