views:

948

answers:

3

jQuery's scrollTop returns null when window is an iframe. Has anyone been able to figure out how to get scrollTop of an iframe?

more info:

my script is running in the iframe itself, the parent window is on another domain, so i cant access the ID of the iframe or anything like that

A: 

Use :

$('#frameId', top.document).scrollTop();

In order for this to work, jquery must be loaded in the file which is viewed through the iframe.

eyazici
problem is that my script is running inside of the iframe, i cant get access to the parent document, it is on another domain
mkoryak
Use top.document as a second parameter.
eyazici
+1  A: 

You can set scrollTop by using this setup:

$("html,body").scrollTop(25);

So you could try getting it like this:

$("html,body").scrollTop();

Because different browsers set the scrollTop on different elements (body or html).

From the scrollTo plugin:

But that will probably still fail in certain browsers. Here is the relevant section from the source code of Ariel Flesher's scrollTo plugin for jQuery:

// Hack, hack, hack :)
// Returns the real elements to scroll (supports window/iframes, documents and regular nodes)
$.fn._scrollable = function(){
return this.map(function(){
 var elem = this,
  isWin = !elem.nodeName || $.inArray( elem.nodeName.toLowerCase(), ['iframe','#document','html','body'] ) != -1;

  if( !isWin )
   return elem;

 var doc = (elem.contentWindow || elem).document || elem.ownerDocument || elem;

 return $.browser.safari || doc.compatMode == 'BackCompat' ?
  doc.body : 
  doc.documentElement;
});
};
Doug Neiner
Thanks man. that works like a charm
mkoryak
A: 

I found this question while trying to SET scrollTop inside an iframe... not exactly your question (you wanted to GET) but here's a solution inside iframes for people that also end up here trying to SET.

If you want to scroll to the top of the page this will NOT work inside an iframe:

$("html,body").scrollTop(0);

However this will:

document.getElementById("wrapper").scrollIntoView();

For this markup (contained inside an iframe):

<html>
  <body>
    <div id="wrapper">
      <!-- lots of content -->
    </div>
  </body>
</html>
Chris Jacob