ドキュメントの最大スクロール値を得る

window.scrollTo(x, y)JavaScriptからスクロールできるわけだが、x,yの最大値を得る方法を探った。

Mozilla

一番簡単。

window.scrollMaxX;
window.scrollMaxY;

というプロパティがある。これを利用すればOK

GoogleChrome

ChromeにはscrollMaxX,scrollMaxYの様なものは無い。
「現在のドキュメント全体の幅/高さ - 現在のwindowの幅/高さ」で計算する。

document.width - window.innerWidth;
document.height - window.innerHeight;

と思ったが、innerWidth,innerHeightの方が大きくなることがあるみたい(スクロールバー分?)

document.documentElement.getBoundingClientRect().width - window.innerWIdth;
document.documentElement.getBoundingClientRect().height - window.innerHeight;

の方が正確に出そうな感じ。

Opera

Mozillaの様なwindow.scrollMaxX/scrollMaxYみたいのも、Chromeの様なdocument.width/heightも無い。

document.documentElement.getBoundingClientRect().width - window.innerWIdth;
document.documentElement.getBoundingClientRect().height - window.innerHeight;

Chromeと同様だけど↑でOK

結論

共通して使えそうなのが以下。

document.documentElement.getBoundingClientRect().width - window.innerWIdth;
document.documentElement.getBoundingClientRect().height - window.innerHeight;

んで、Opera 11.51はまだECMAScript5thのObject.definePropertyが無さそう。その代わり、obj.__defineGetter__はあるので、

if (!("scrollMaxX" in window)) {
  window.__defineGetter__("scrollMaxX", function() {
    return document.documentElement.getBindingClientRect().width - this.innerWidth;
  });
  window.__defineGetter__("scrollMaxY", function() {
    return document.documentElement.getBindingClientRect().height - this.innerHeight;
  });
}

で共通して使えるようになりそう。