views:

752

answers:

2

I have a script being run in a document that may or may not be nested in an iframe. I have sorted out the issue of detecting the nested, but I can't figure out how to detect the ready state of the DOM when it is an iframe.

Here is what I have already:

if (window.self !== window.top) {
    // is nested
    // DOM ready test here
        // execute code here
} else {
    // is not nested
    $(document).ready(function() {
        // execute code here
    });
}

I have already read this post, but I don't see the answer to my specific question. I may be misunderstanding the solutions there, so feel free to correct me.


EDIT: This seems to be a Fancybox issue. This code:

alert(document.getElementById('username').className);
document.getElementById('username').focus();

I see an alert with the correct value, but the form element does not receive the focus. This tells me that it's not an issue with detecting the DOM's ready state. The original script I was trying to use was this:

$(document).ready(function() {
    $('input.focus:last').focus();
});

EDIT 2/SOLUTION: I had to resort to a Fancybox specific solution because it appears to be a Fancybox specific issue. I added this line to the configuration for these Fancybox iframed forms:

'onComplete':function(){$('input.focus:last').focus();}
A: 

Looks like this thread should answer your question: http://stackoverflow.com/questions/205087/jquery-ready-in-a-dynamically-inserted-iframe

Keith Rousseau
I just edited my post to address that thread.
Sonny
+1  A: 

You can place a SCRIPT tag at the end of the iframe BODY tag.
Then add your code there, it will be executed when the iframe body is loaded.

You can either run a local JS code of the iframe, or call an object in the parent like:

<body>
  ...
  <script>
    parent.myObj.iframeLoaded(document.body);
  </script>
</body>

To my experience, the onload event in IE is not reliable.
i.e: it won't wait to the JS inside the iframe to be loaded before firing.

Mic
My script is in a file that is referenced right before the closing body tag. I think I'm either missing an understanding of the DOM in an iframe, or the Fancybox code is short-circuiting something.
Sonny
In the script tag above you just put the command to start something. If you place just an alert('something'); what happens?The Fancybox (I don't know it) is probably doing her things too, but the alert should pop up.You JS file should be in the head of the file you load in the iframe.
Mic
Your suggestions led me to the answer, so I'm marking yours as the solution.
Sonny