AutoPagerize_Console

AutoPagerizeをサポートするボタン

当前为 2015-02-22 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name AutoPagerize_Console
  3. // @namespace phodra
  4. // @description AutoPagerizeをサポートするボタン
  5. // @include http://*
  6. // @include https://*
  7. // @version 2.1
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. (function (){
  12. var ap;
  13. var $pagenow, $pagemax;
  14. var $pagelist, $pageitem;
  15. var scTop, timer;
  16.  
  17. // 初期化
  18. var AP_Init = function()
  19. {
  20. ap = {
  21. 'page': 0,
  22. 'seam': [0]
  23. };
  24. scTop = document.documentElement.scrollTop;
  25. var $header = document.createElement("div");
  26. $header.id = "ap_header";
  27. with( $header.style )
  28. {
  29. position = 'fixed';
  30. top = '50px';
  31. right = '0px';
  32. opacity = '0.8';
  33. fontSize = '14px';
  34. zIndex = '999';
  35. userSelect = 'none';
  36. MozUserSelect = 'none';
  37. WebkitUserSelect = 'none';
  38. }
  39. document.body.appendChild($header);
  40.  
  41. var $page = document.createElement("div");
  42. $pagenow = document.createElement("span");
  43. $pagemax = document.createElement("span");
  44. $pagenow.innerHTML = $pagemax.innerHTML = "1";
  45. $page.appendChild($pagenow);
  46. $page.appendChild( document.createTextNode(" / "));
  47. $page.appendChild($pagemax);
  48.  
  49. with( $page.style )
  50. {
  51. cursor = 'pointer';
  52. textAlign = 'right';
  53. backgroundColor = 'white';
  54. padding = '0px 2px';
  55. marginBottom = '5px';
  56. }
  57. $page.addEventListener(
  58. 'mouseover' , function()
  59. {
  60. $pagelist.style.display = '';
  61. }
  62. );
  63. $page.addEventListener(
  64. 'mouseout' , function()
  65. {
  66. $pagelist.style.display = 'none';
  67. }
  68. );
  69. $header.appendChild($page);
  70.  
  71. $pagelist = document.createElement("ol");
  72. with( $pagelist.style )
  73. {
  74. backgroundColor = 'white';
  75. listStyleType = 'none';
  76. position = 'absolute';
  77. zIndex = '2';
  78. top = '0px';
  79. right = '0px';
  80. display = 'none';
  81. }
  82. $page.appendChild($pagelist);
  83.  
  84. $pageitem = document.createElement("li");
  85. $pageitem.className = "ap_pageitem";
  86. $pageitem.innerHTML = "1";
  87. with( $pageitem.style )
  88. {
  89. const MGN = 2;
  90. backgroundColor = 'white';
  91. cursor = 'pointer';
  92. textAlign = 'center';
  93. boxSizing = 'border-box';
  94. border = 'outset 1px white';
  95. margin = MGN +'px';
  96. padding = '0px 5px';
  97. minWidth = $page.offsetWidth-MGN*2 + 'px';
  98. }
  99. PageItem_AddEvent($pageitem);
  100. $pagelist.appendChild($pageitem);
  101.  
  102.  
  103.  
  104. const AP_BTN = 'ap_button';
  105. // 移動ボタンのスタイル
  106. var $mb_style = document.createElement("style");
  107. $mb_style.setAttribute( 'type', "text/css");
  108. $mb_style.innerHTML =
  109. "." + AP_BTN +"{ \
  110. cursor: pointer; \
  111. background-color: white; \
  112. text-align: center; \
  113. position: relative; \
  114. width: 20px; \
  115. margin: 2px 0px 2px auto; \
  116. padding: 2px; \
  117. box-sizing: border-box; \
  118. border: solid 1px white; \
  119. }" +
  120. "." + AP_BTN + ":hover{ \
  121. border: outset 1px gray; \
  122. } " +
  123. "." + AP_BTN + ":active{ \
  124. border: inset 1px gray; \
  125. }";
  126. document.head.appendChild($mb_style);
  127. // 最上部へ移動
  128. var $ptop = document.createElement("div");
  129. $ptop.className = AP_BTN;
  130. $ptop.innerHTML = "↑";
  131. $ptop.setAttribute('alt', "Scroll Top");
  132. $ptop.addEventListener(
  133. 'click', function()
  134. {
  135. PageScroll(0);
  136. }
  137. );
  138. // 最下部へ移動
  139. var $pbtm = document.createElement("div");
  140. $pbtm.className = AP_BTN;
  141. $pbtm.innerHTML = "↓";
  142. $pbtm.setAttribute('alt', "Scroll Bottom");
  143. $pbtm.addEventListener(
  144. 'click', function()
  145. {
  146. PageScroll( document.body.clientHeight-window.innerHeight );
  147. }
  148. );
  149. // AutoPagerizeのページ移動
  150. // 前のページ
  151. var $ap_prev = document.createElement("div");
  152. $ap_prev.className = AP_BTN;
  153. $ap_prev.innerHTML = "△";
  154. $ap_prev.setAttribute( 'alt', "Scroll Prev Page");
  155. $ap_prev.addEventListener(
  156. 'click', function()
  157. {
  158. PageScroll( scTop==ap.seam[ap.page]?
  159. ap.seam[ap.page-1]: ap.seam[ap.page]
  160. );
  161. }
  162. );
  163.  
  164. // 次のページ
  165. var $ap_next = document.createElement("div");
  166. $ap_next.className = AP_BTN;
  167. $ap_next.innerHTML = "▽";
  168. $ap_next.setAttribute( 'alt', "Scroll Next Page");
  169. $ap_next.addEventListener(
  170. 'click', function()
  171. {
  172. PageScroll( ap.page+1<ap.seam.length?
  173. ap.seam[ap.page+1]:
  174. document.body.clientHeight-window.innerHeight
  175. );
  176. }
  177. );
  178.  
  179. $header.appendChild($ptop);
  180. $header.appendChild($ap_prev);
  181. $header.appendChild($ap_next);
  182. $header.appendChild($pbtm);
  183.  
  184. // ウィンドウのスクロールが発生した時
  185. window.addEventListener(
  186. 'scroll', function()
  187. {
  188. scTop = document.documentElement.scrollTop;
  189. for( var i=ap.seam.length-1; i>=0; i-- )
  190. {
  191. if( scTop >= ap.seam[i]-1 )
  192. {
  193. if( ap.page != i )
  194. {
  195. ap.page = i;
  196. $pagenow.innerHTML = i+1;
  197. }
  198. break;
  199. }
  200. }
  201. }
  202. );
  203. };
  204. var PageScroll = function(target, bearing)
  205. {
  206. clearTimeout(timer);
  207. if( target==scTop ) return;
  208. if( bearing==null ) bearing = target-scTop;
  209. var y = (target-scTop)/5;
  210. window.scrollBy( 0,
  211. bearing>0? Math.ceil(y):
  212. bearing<0? Math.floor(y): 0
  213. );
  214. timer = setTimeout(
  215. function()
  216. {
  217. PageScroll( target, bearing);
  218. }, 10
  219. );
  220.  
  221. if( (bearing<0 && target>=scTop) ||
  222. (bearing>0 && target<=scTop) )
  223. {
  224. window.scrollTo( 0, target);
  225. clearTimeout(timer);
  226. }
  227.  
  228. };
  229. var PageItem_AddEvent = function($elm)
  230. {
  231. $elm.addEventListener(
  232. 'click', function()
  233. {
  234. var num = this.innerHTML-1;
  235. PageScroll(
  236. num>=0 && num<ap.seam.length?
  237. ap.seam[num]: 0
  238. );
  239. }
  240. );
  241. $elm.addEventListener(
  242. 'dblclick', function()
  243. {
  244. var num = this.innerHTML-2;
  245. window.location = num>=0?
  246. document.getElementsByClassName("autopagerize_link")[num].href:
  247. window.location;
  248. }
  249. );
  250. };
  251.  
  252. // ページを継ぎ足した時、継ぎ目の位置を記録する
  253. var AP_SeamLine = function()
  254. {
  255. var $ap_sep = document.getElementsByClassName("autopagerize_page_separator");
  256. var len = $ap_sep.length;
  257. var offsety = 0, elm = $ap_sep[len-1];
  258. do
  259. {
  260. offsety += elm.offsetTop || 0;
  261. elm = elm.offsetParent;
  262. }while(elm);
  263. ap.seam[len] = offsety;
  264.  
  265. $pagemax.innerHTML = len+1;
  266. var $new_pageitem = $pageitem.cloneNode(true);
  267. $new_pageitem.innerHTML = len+1;
  268. PageItem_AddEvent($new_pageitem);
  269. $pagelist.appendChild($new_pageitem);
  270. };
  271. if( window.AutoPagerize )
  272. {
  273. console.log( 'window.AutoPagerize' );
  274. // 初期化
  275. AP_Init();
  276. // 継ぎ足した時
  277. AutoPagerize.addFilter(AP_SeamLine);
  278. }else
  279. {
  280. // document.addEventListener(
  281. // 'GM_AutoPagerizeLoaded',
  282. // function()
  283. // {
  284. // AP_Init();
  285. // }
  286. // );
  287. document.addEventListener(
  288. 'GM_AutoPagerizeNextPageLoaded',
  289. function()
  290. {
  291. if( ap==null ) AP_Init();
  292. AP_SeamLine();
  293. }
  294. );
  295. }
  296.  
  297. })();