NGA Pins

NGA Pins 可将顶部菜单、导航栏、页码栏固定在窗口顶部,亦可通过设置取消其中某项;主帖内容较长时将作者信息固定在主帖左侧(不包含回复)

当前为 2018-02-15 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name NGA Pins
  3. // @namespace https://greasyfork.org/zh-CN/scripts/36246-nga-pins
  4. // @version 0.0.9.20180215
  5. // @icon http://bbs.nga.cn/favicon.ico
  6. // @description NGA Pins 可将顶部菜单、导航栏、页码栏固定在窗口顶部,亦可通过设置取消其中某项;主帖内容较长时将作者信息固定在主帖左侧(不包含回复)
  7. // @author AgLandy
  8. // @include /^https?:\/\/(bbs\.ngacn\.cc|nga\.178\.com|bbs\.nga\.cn)/
  9. // @grant none
  10. // @license MIT License
  11. // ==/UserScript==
  12.  
  13. //发布地址:http://bbs.ngacn.cc/read.php?tid=13033636
  14.  
  15. if(typeof jQuery == 'undefined'){
  16. let s = document.createElement('script');
  17. s.type = 'text/javascript';
  18. s.src = 'https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js';
  19. s.onload = s.onreadystatechange = function(){
  20. if(!this.readyState || 'loaded' === this.readyState || 'complete' === this.readyState){
  21. main(jQuery.noConflict());
  22. this.onload = this.onreadystatechange = null;
  23. }
  24. };
  25. document.head.appendChild(s);
  26. }
  27. else
  28. main(jQuery);
  29.  
  30. function main($Q){
  31.  
  32. if(!window.commonui)
  33. return;
  34.  
  35. var pins = commonui.pins = {};
  36.  
  37. function testStorage(s){
  38. if(!!s){
  39. try{
  40. s.testkey = 'testvalue';
  41. s.removeItem('testkey');
  42. return true;
  43. }
  44. catch(e){
  45. return false;
  46. }
  47. }
  48. else
  49. return false;
  50. }
  51.  
  52. function init(){
  53. let args = {};
  54. if(localStorage.pins)
  55. args = JSON.parse(localStorage.pins);
  56. else{
  57. args = {a: 56, b: 42, c: 43};
  58. localStorage.pins = JSON.stringify(args);
  59. }
  60. __SETTING.pins = function(){
  61. this.o = commonui.createCommmonWindow();
  62. this.o._.addContent(null);
  63. var $ = window._$;
  64. this.o._.addTitle('Pins 设置');
  65. let update = function(t){
  66. if(t.checked)
  67. pins.args[t.name] = parseInt(t.value);
  68. else
  69. pins.args[t.name] = 0;
  70. localStorage.pins = JSON.stringify(pins.args);
  71. pins.update();
  72. },
  73. z = [['a', '56', '顶部菜单'], ['b','42', '导航栏'], ['c','43', '页码栏']];
  74. for(let i = 0; i < z.length; i++){
  75. let k = $('/input').$0('type','checkbox','checked',0,'name',z[i][0],'value',z[i][1])._.on('click', function(e){update(e.target);});
  76. this.o._.addContent(
  77. k,
  78. z[i][2],
  79. $('/br')
  80. );
  81. if(pins.args[z[i][0]])
  82. k._.attr('checked', 1);
  83. }
  84. this.o._.show();
  85. };
  86. commonui.mainMenu.data[401] = {innerHTML: 'Pins 设置', on: {event: 'click', func: function(){__SETTING.pins();}}, parent: 18};
  87. commonui.mainMenu.data[18].subKeys.push(401);
  88. return args;
  89. }
  90.  
  91. $Q('<style type="text/css" />').html(' #m_pbtntop tbody {pointer-events:auto;} ').appendTo('head');
  92.  
  93. pins.update = function(){
  94.  
  95. let args = pins.args,
  96. hA = args.a + 8,
  97. hB = args.b && args.b + 8,
  98. hC = args.c && args.c + 8,
  99. a = $Q('#mainmenu'),
  100. b = $Q('#m_nav'),
  101. c = $Q('#m_pbtntop'),
  102. t = $Q('#posterinfo0').closest('td'),
  103. h = c.length && c.offset().top - hA - hB || b.offset().top - hA,
  104. z = [[a, 'pinsTopBar'], [b, 'pinsNavBar'], [c, 'pinsPageBar'], [t, 'pinsAuthorInfo']],
  105. newDiv = function(i){
  106. return $Q('<div id="' + z[i][1] + '" />').append(z[i][0].children()).appendTo(z[i][0]);
  107. };
  108.  
  109. //还原默认
  110. for(let i = 0; i < z.length; i++){
  111. if($Q('#' + z[i][1]).length)
  112. $Q('#' + z[i][1]).contents().unwrap();
  113. }
  114. $Q(window).unbind('.pins');
  115.  
  116. //顶部菜单
  117. if(args.a){
  118. let d = newDiv(0);
  119. d.css({'height':a.css('height'), 'width':'100%', 'overflow':'hidden', 'position':'fixed', 'top':'0px', 'z-index':'3', 'opacity':'0.95'});
  120. $Q(window).bind('scroll.pins', function(){
  121. if($Q(window).scrollTop() > $Q('#custombg').height())
  122. d.css({'border-bottom':'1px solid #' + __COLOR.shadow1.replace(/;.+;/,'').replace(/^.+#/,'')});
  123. else
  124. d.css({'border-bottom':''});
  125. });
  126. }
  127.  
  128. //导航栏
  129. if(args.b){
  130. let d = newDiv(1);
  131. b.css({'height':b.css('height')});
  132. b.find('.bbsinfo').prependTo(b);
  133. $Q(window).bind('scroll.pins', function(){
  134. if($Q(window).scrollTop() > h)
  135. d.css({'position':'fixed', 'top':hA + 'px', 'z-index':'3', 'opacity':'0.95'});
  136. else
  137. d.css({'position':'', 'top':'', 'z-index':'', 'opacity':''});
  138. });
  139. }
  140.  
  141. //页码栏
  142. if(args.c){
  143. let d = newDiv(2);
  144. c.css({'height':c.css('height')});
  145. $Q(window).bind('scroll.pins', function(){
  146. if($Q(window).scrollTop() > h)
  147. d.css({'width':'calc(100% - 20px)', 'position':'fixed', 'top':(hA + hB) + 'px', 'z-index':'2', 'opacity':'0.95', 'pointer-events':'none'});
  148. else
  149. d.css({'width':'', 'position':'', 'top':'', 'z-index':'', 'opacity':''});
  150. });
  151. }
  152.  
  153. //作者信息
  154. if($Q('#posterinfo0').length && $Q('#posterinfo0').closest('td').outerHeight() > 600){
  155. t.css({'min-width':'197px'});
  156. let d = newDiv(3),
  157. h1 = hA + hB + hC + 6,
  158. h2 = d.offset().top - h1,
  159. w = function(){
  160. d.css('width', t.css('width'));
  161. };
  162. if(/firefox/.test(navigator.userAgent.toLowerCase())){
  163. $Q('.postcontent').bind('click.pins', function(){setTimeout(w,5);});
  164. $Q(window).bind('transitionend.pins', function(){setTimeout(w,5);});
  165. }
  166. else{
  167. let mo = new MutationObserver(w);
  168. mo.observe($Q('#posterinfo0').closest('table')[0], {
  169. childList: true,
  170. subtree: true,
  171. attributes: true
  172. });
  173. }
  174. $Q(window).bind('resize.pins', w);
  175. $Q(window).bind('scroll.pins', function(){
  176. if($Q(window).scrollTop() > h2 && $Q(window).scrollTop() < t.height() - d.height() + h2)
  177. d.css({'width':t.css('width'), 'position':'fixed', 'top':h1 + 'px'});
  178. else if($Q(window).scrollTop() >= t.height() - d.height() + h2)
  179. d.css({'width':t.css('width'), 'position':'fixed', 'top':(h1 - $Q(window).scrollTop() + t.height() - d.height() + h2) + 'px'});
  180. else
  181. d.css({'width':'', 'position':'', 'top':''});
  182. });
  183. }
  184.  
  185. $Q(window).triggerHandler('scroll.pins');
  186.  
  187. };
  188.  
  189. pins.args = !testStorage(window.localStorage) ? {a: 56, b: 42, c: 43} : init();
  190.  
  191. pins.update();
  192.  
  193. }
  194.  
  195.  
  196.  
  197.  
  198.  
  199.