Tuesday, January 27, 2015

Disable iframe edit


I want to disable all links inside an IFRAME, when people click on those link, alert would popup.
Here is what I have so far, but the jQuery does nothing. Not sure what I did wrong.
<iframe id='templateframe' name='templateframe' src="templates/template<?php echo $templateID; ?>/login.html"></iframe>

$(document).ready(function(){       
        $('#templateframe').contents().find('a').click(function(event) {
            alert("demo only");

            event.preventDefault();

        }); 
});
Thanks in advance.
shareimprove this question

    
Well, this shouldn't be restricted by browser security. –  Anonymous Jan 24 '11 at 0:55

8 Answers

up vote 1 down vote accepted
or else you could put the script inside the iframe itself and thus shortening the code to this way. lighter performance i believe.
$(document).ready(function(){       
        $('a').click(function(event) {
            alert("demo only");
            event.preventDefault();

        }); 
});
shareimprove this answer

I would expect that $(document).ready executes before the content of the iframe has loaded. Try using the onload attribute for the iframe instead.
shareimprove this answer

    
Thank you for the quick answer! It works now. –  Shadow_boi Jan 24 '11 at 1:02
    
You're welcome :) –  Mads Mogenshøj Jan 24 '11 at 1:03
This is the generic solution of your problem. Hope this will work well.
$(window).load(function(){
    $('#templateframe').contents().find('a').click(function(event) {
        alert("demo only");
        event.preventDefault();
    }); 
});
shareimprove this answer

A legend over at
http://www.webdeveloper.com/forum/showthread.php?182260-Can-we-disable-links-inside-iframes
revived a technique from the good old days, back when we didn't have calls like -webkit-gradient() and men were men.
Just put a transparent div over it!
shareimprove this answer

    
and what if i want to scroll the inner content of iframe? –  Karolis Šarapnickis Oct 29 '14 at 15:04
    
nope, we used this from more of a "the designers want this" point of view which needed a "window to another website" which couldn't be interacted with. Scrolling isn't possible - soz about that one! –  lol Oct 30 '14 at 2:17
    
ahh, we're facing the same issue, except designers also want scrolling –  Karolis Šarapnickis Oct 30 '14 at 7:33
The solution mentioned by "lol" actually works quite well. I stumbled on this accidentally after working on this for a couple of hours...
Put your iframe inside a div element, then make the div transparent and push the z-index of the iframe behind the div. See this example:
<div class="container">
  <iframe class="lockframe" src="www.google.com"></iframe>
</div>
Then set up your css like this:
div.container { background: transparent; }
div.lockframe { z-index: -2; }
Load up your page and the div is what will accept the click events, not the iframe.
shareimprove this answer

As an alternative to preventing default you can change anchors to spans so it is more visible that link is not link anymore.
$('#templateframe').contents().find('a').each(function() {
    $(this).replaceWith($('<span>' + this.innerHTML + '</span>'));
});
shareimprove this answer

None of the above answers will work unless maybe you are loading the content locally because by the time the window.load event fires the iframe hasn't typically loaded yet. You can add a listener to the iframe to find all a's inside the iframe and disable them.
$("iframe").load(function() {
    $("iframe").contents().find("a").each(function(index) {
        $(this).on("click", function(event) {
            event.preventDefault();
            event.stopPropagation();
        });
    });
});
shareimprove this answer

    
does this work for content loaded from a different domain? is browser security an issue here? –  lol Dec 13 '13 at 23:00
I was looking to disable iframe links too and couldn't find a solution. Thanks to HTML5, you can easily disable links by simply adding the sandbox attribute.
<iframe src="externalsite.com" sandbox></iframe>
view demo
I hope this helps someone searching the net, especially since this questions pops up first on Google.
shareimprove this answer

No comments:

Post a Comment