From 332a3d98292429556710bc68d1baef238e5dd59b Mon Sep 17 00:00:00 2001 From: anekos Date: Tue, 19 Aug 2008 11:57:36 +0000 Subject: initial release: スクロール可能な div 要素をスクロールしたいプラグイン。動作不良バージョン。 git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@17905 d0d07461-0603-4401-acd4-de1884942a52 --- scroll_div.js | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 scroll_div.js (limited to 'scroll_div.js') diff --git a/scroll_div.js b/scroll_div.js new file mode 100644 index 0000000..dd7bbdf --- /dev/null +++ b/scroll_div.js @@ -0,0 +1,94 @@ +(function () { + + let re = /auto|scroll/i; + + // FIXME!!!!!!!! Firebug では overflow になってるのに false になったりする。 + function isScrollable (e, doc) { + let s = doc.defaultView.getComputedStyle(e, null); + for each (let n in ['overflow', 'overflow-x', 'overflow-y']) { + //if (s[n] && s[n].match(/.+/)) liberator.log(n + ':' + s[n]); + if (s[n] && s[n].match(re)) + return true; + } + } + + // FIXME + function flashElement (e, doc) { + var indicator = doc.createElement("div"); + indicator.id = "liberator-frame-indicator"; + // NOTE: need to set a high z-index - it's a crapshoot! + var style = "background-color: red; opacity: 0.5; z-index: 999;" + + "position: fixed; top: 0; bottom: 0; left: 0; right: 0;"; + indicator.setAttribute("style", style); + e.appendChild(indicator); + + // remove the frame indicator + setTimeout(function () { e.removeChild(indicator); }, 500); + } + + // スクロール可能な要素のリストを返す + function scrollableElements () { + let result = []; + let doc = content.document; + + // var r = doc.evaluate("//div[contains(@style, 'overflow')]", doc, null, 7, null) + // for (var i = 0; i < r.snapshotLength; i++) { + // r.snapshotItem(i).scrollTop += dy; + // } + + var r = doc.evaluate("//div", doc, null, 7, null) + for (var i = 0; i < r.snapshotLength; i++) { + let e = r.snapshotItem(i); + if (isScrollable(e, doc)) + result.push(e); + } + + liberator.log(result.length); + return result; + } + + // スクロール対象を変更 + function shiftScrollElement () { + let idx = content.document.__div_scroller_index || 0; + let es = scrollableElements(); + idx++; + if (idx >= es.length) + idx = 0; + content.document.__div_scroller_index = idx; + } + + // 現在のスクロール対象を返す + function currentElement () { + let es = scrollableElements(); + let idx = content.document.__div_scroller_index || 0; + liberator.log("idx: " + idx); + return es[idx]; + } + + // スクロールする + function scroll (dy) { + let elem = currentElement(); + if (elem) + elem.scrollTop += dy; + //for each (let elem in scrollableElements()) + // elem.scrollTop += dy; + } + + liberator.mappings.addUserMap( + [liberator.modes.NORMAL], + ['j'], + 'Scroll down', + function () scroll(30) + ); + + liberator.mappings.addUserMap( + [liberator.modes.NORMAL], + [']d'], + 'Shift Scroll Element', + function () shiftScrollElement() + ); + + + + +})(); -- cgit v1.2.3