From 88f3c74d0ac07acc06d628331ac12eb4bf05503d Mon Sep 17 00:00:00 2001 From: Kait Todesk Date: Thu, 2 Oct 2014 19:58:51 +0300 Subject: [PATCH 1/5] Iframe element's scrollTop and scrollLeft --- src/bonzo.js | 21 +++++++++++++++------ tests/layout-test.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/bonzo.js b/src/bonzo.js index 914e717..a0f621d 100644 --- a/src/bonzo.js +++ b/src/bonzo.js @@ -293,10 +293,11 @@ var el = this[0] if (!el) return this if (x == null && y == null) { - return (isBody(el) ? getWindowScroll() : { x: el.scrollLeft, y: el.scrollTop })[type] + return (isBody(el) ? getWindowScroll(el) : { x: el.scrollLeft, y: el.scrollTop })[type] } if (isBody(el)) { - win.scrollTo(x, y) + var elWin = getElementWindow(el) + elWin.scrollTo(x, y) } else { x != null && (el.scrollLeft = x) y != null && (el.scrollTop = y) @@ -785,7 +786,7 @@ var el = this[0] , de = el.ownerDocument.documentElement , bcr = el.getBoundingClientRect() - , scroll = getWindowScroll() + , scroll = getWindowScroll(el) , width = el.offsetWidth , height = el.offsetHeight , top = bcr.top + scroll.y - Math.max(0, de && de.clientTop, doc.body.clientTop) @@ -989,11 +990,19 @@ } function isBody(element) { - return element === win || (/^(?:body|html)$/i).test(element.tagName) + return element === win || (/^(?:body|html|iframe)$/i).test(element.tagName) } - function getWindowScroll() { - return { x: win.pageXOffset || html.scrollLeft, y: win.pageYOffset || html.scrollTop } + function getWindowScroll(el) { + var elWin = getElementWindow(el) + , elHtml = elWin.document.documentElement || html + return { x: elWin.pageXOffset || elHtml.scrollLeft, y: elWin.pageYOffset || elHtml.scrollTop } + } + + function getElementWindow(el) { + if (el.contentWindow) return el.contentWindow + if (elDoc = el.ownerDocument) return elDoc.defaultView || elDoc.parentWindow + return win } function createScriptFromHtml(html) { diff --git a/tests/layout-test.js b/tests/layout-test.js index 2d4a48f..ff06510 100644 --- a/tests/layout-test.js +++ b/tests/layout-test.js @@ -105,6 +105,35 @@ sink('Layout', function (test, ok) { ok($('#overflowed').scrollLeft() == 150, 'condition2') }) + test('iframe scrollTop && scrollLeft', 4, function() { + // indeed, there has to be a better way to test this + var $iframe = $(dom.create('