Detect click event inside iframe

前端 未结 9 2142
刺人心
刺人心 2020-11-28 05:40

I\'m writing a plugin for TinyMCE and have a problem with detecting click events inside an iframe.

From my search I\'ve come up with this:

Loading iframe:

相关标签:
9条回答
  • 2020-11-28 05:51

    In my case there were two jQuery's, for the inner and outer HTML. I had four steps before I could attach inner events:

    1. wait for outer jQuery to be ready
    2. wait for iframe to load
    3. grab inner jQuery
    4. wait for inner jQuery to be ready

    $(function() {   // 1. wait for the outer jQuery to be ready, aka $(document).ready
        $('iframe#filecontainer').on('load', function() {   // 2. wait for the iframe to load
            var $inner$ = $(this)[0].contentWindow.$;   // 3. get hold of the inner jQuery
            $inner$(function() {   // 4. wait for the inner jQuery to be ready
                $inner$.on('click', function () {   // Now I can intercept inner events.
                    // do something
                });
            });
        });
    });
    

    The trick is to use the inner jQuery to attach events. Notice how I'm getting the inner jQuery:

            var $inner$ = $(this)[0].contentWindow.$;
    

    I had to bust out of jQuery into the object model for it. The $('iframe').contents() approach in the other answers didn't work in my case because that stays with the outer jQuery. (And by the way returns contentDocument.)

    0 讨论(0)
  • 2020-11-28 05:52

    Just posting in case it helps someone. For me, the following code worked perfect:

    $(document).ready(function(){
         $("#payment_status_div").hide();
         var iframe = $('#FileFrame').contents();
         iframe.find("#take_payment").click(function(){
             $("#payment_status_div").show("slow");
         });
    });
    

    Where 'FileFrame' is the iframe id and 'take_payment' is the button inside iframe. Since my form inside the iframe is posted to a different domain, when used load, I got an error message saying:

    Blocked a frame with origin "https://www.example.com" from accessing a frame with origin "https://secure-test.worldpay.com". Protocols, domains, and ports must match.

    0 讨论(0)
  • 2020-11-28 05:54

    I know this is old but the ID's don't match in your code one is choose_pic and one is choose_pics:

    <input type=button id=choose_pics value='Choose'>
    
    $("#filecontainer").contents().find("#choose_pic").click(function(){
        //do something      
    }); 
    
    0 讨论(0)
  • 2020-11-28 05:57

    If anyone is interested in a "quick reproducible" version of the accepted answer, see below. Credits to a friend who is not on SO. This answer can also be integrated in the accepted answer with an edit,... (It has to run on a (local) server).

    <html>
    <head>
    <title>SO</title>
    <meta charset="utf-8"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
    
    <style type="text/css">
    html,
    body,
    #filecontainer {
    width: 100%;
    height: 100%;
    }
    </style>
    </head>
    <body>
    <iframe src="http://localhost/tmp/fileWithLink.html" id="filecontainer"></iframe>
    
    <script type="text/javascript">
    $('#filecontainer').load(function(){
    
      var iframe = $('#filecontainer').contents();
    
      iframe.find("a").click(function(){
        var test = $(this);
        alert(test.html());
      });
    });
    </script>
    </body>
    </html>
    

    fileWithLink.html

    <html>
    <body>
    <a href="https://stackoverflow.com/">SOreadytohelp</a>
    </body>
    </html>
    
    0 讨论(0)
  • 2020-11-28 06:14

    I solved it by doing like this:

    $('#filecontainer').load(function(){
    
            var iframe = $('#filecontainer').contents();
    
            iframe.find("#choose_pics").click(function(){
                   alert("test");
            });
    });
    
    0 讨论(0)
  • 2020-11-28 06:14

    The tinymce API takes care of many events in the editors iframe. I strongly suggest to use them. Here is an example for the click handler

    // Adds an observer to the onclick event using tinyMCE.init
    tinyMCE.init({
       ...
       setup : function(ed) {
          ed.onClick.add(function(ed, e) {
               console.debug('Iframe clicked:' + e.target);
          });
       }
    });
    
    0 讨论(0)
提交回复
热议问题