百度贴吧图片缩放增强脚本

增强百度贴吧图片缩放,看大图无需开新标签页。

目前为 2014-06-01 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @id tieba.baidu.com-709c0fe7-e313-44bd-9dbd-752bbd80259d@patwonder@163.com
  3. // @name 百度贴吧图片缩放增强脚本
  4. // @version 0.62
  5. // @namespace patwonder@163.com
  6. // @author patwonder
  7. // @description 增强百度贴吧图片缩放,看大图无需开新标签页。
  8. // @include http://tieba.baidu.com/club/*/p/*
  9. // @include http://tieba.baidu.com/f?kz=*
  10. // @include http://tieba.baidu.com/p/*
  11. // @include http://tieba.baidu.com/f?*ct=*z=*
  12. // @include http://tieba.baidu.com.cn/f?kz=*
  13. // @include http://tieba.baidu.com.cn/p/*
  14. // @include http://tieba.baidu.com.cn/f?*ct=*z=*
  15. // @include http://post.baidu.com/f?kz=*
  16. // @include http://post.baidu.com/p/*
  17. // @include http://post.baidu.com/f?*ct=*z=*
  18. // @include http://post.baidu.com.cn/f?kz=*
  19. // @include http://post.baidu.com.cn/p/*
  20. // @include http://post.baidu.com.cn/f?*ct=*z=*
  21. // @run-at document-end
  22. // @grant none
  23. // ==/UserScript==
  24.  
  25. (function(d, w) {
  26. var B_WIDESCREEN_ENABLED = /*typeof(GM_getValue) === 'function' ? GM_getValue('btise.wideScreenEnabled', true) :*/ undefined;
  27. var B_FLOORNUM_ENABLED = /*typeof(GM_getValue) === 'function' ? GM_getValue('btise.floorNumEnabled', true) :*/ undefined;
  28. if (B_WIDESCREEN_ENABLED !== true && B_WIDESCREEN_ENABLED !== false) {
  29. B_WIDESCREEN_ENABLED = true;
  30. B_FLOORNUM_ENABLED = true;
  31. }
  32. var B_SWITCH_ENABLED = true;
  33.  
  34. var btise = { wideScreenEnabled : true, floorNumEnabled : true };
  35. var localStorage = w.localStorage;
  36. if (localStorage) {
  37. localStorage = localStorage.wrappedJSObject || localStorage;
  38. if (typeof(localStorage.btise) == 'string') {
  39. try {
  40. btise = JSON.parse(localStorage.btise);
  41. } catch (ex) { }
  42. }
  43.  
  44. // Assign default configs
  45. if (typeof(btise.wideScreenEnabled) == 'undefined' && typeof(btise.floorNumEnabled) == 'undefined') {
  46. btise.wideScreenEnabled = B_WIDESCREEN_ENABLED;
  47. btise.floorNumEnabled = B_FLOORNUM_ENABLED;
  48. }
  49. if (typeof(localStorage.btise) != 'string')
  50. localStorage.btise = JSON.stringify(btise);
  51. } else {
  52. B_SWITCH_ENABLED = false;
  53. }
  54.  
  55. B_WIDESCREEN_ENABLED = !!btise.wideScreenEnabled;
  56. B_FLOORNUM_ENABLED = !!btise.floorNumEnabled;
  57. var STR_SCRIPT_NAME = '百度贴吧图片缩放增强脚本';
  58.  
  59. var common = {
  60. matchesSelector: function(element, selector) {
  61. if (element.mozMatchesSelector) {
  62. return element.mozMatchesSelector(selector);
  63. } else if (element.webkitMatchesSelector) {
  64. return element.webkitMatchesSelector(selector);
  65. } else if (element.matchesSelector) {
  66. return element.matchesSelector(selector);
  67. } else {
  68. try {
  69. var elems = element.parentElement ? element.parentElement.querySelectorAll(selector) : [];
  70. for (var i = 0, l = elems.length; i < l; i++) {
  71. if (elems[i] === element) return true;
  72. }
  73. } catch (ex) { }
  74. return false;
  75. }
  76. },
  77. // re-entrance guard for image wrapping, avoid re-entering the DOM mutation event handlers
  78. wrapping: false
  79. };
  80.  
  81. (function() {
  82. var IMG_RETRIEVING_SIZE = '正在获取原始大小……';
  83. var IMG_ORG_SIZE_DESC = '原图:';
  84. var IMG_CUR_PERCENT = "比例:";
  85. var IMG_MAG_DESC = '点击放大,按住Shift全部放大';
  86. var IMG_MIN_DESC = '点击缩小,按住Shift全部缩小';
  87. var SIGN_SELECTOR = 'div.d_sign_split + img';
  88. var IMG_INSIDE_EDITOR_SELECTOR = '#editor img, #tb_rich_poster img';
  89. var IMG_SELECTOR = 'img.BDE_Image, div.p_content img.BDE_Smiley, img.d_content_img, ' + SIGN_SELECTOR;
  90. var REG_SIGN = /w%3D580.*\/sign=.*?(?=\/)/;
  91. var images = [];
  92. var matchesSelector = common.matchesSelector;
  93. var prefilterImages = function() {
  94. var imageNodes = d.querySelectorAll(IMG_SELECTOR);
  95. for (var i = 0; i < imageNodes.length; i++) {
  96. var image = imageNodes[i];
  97. if (shouldAdd(image))
  98. prefilterImage(image);
  99. }
  100. }
  101. var prefilterImage = function(image) {
  102. // Check whether we should reload with original src
  103. if (REG_SIGN.test(image.src)) {
  104. var newimg = d.createElement('img');
  105. newimg.src = image.src.replace(REG_SIGN, "pic/item");
  106. newimg.className = image.className;
  107. if (image.parentElement) {
  108. common.wrapping = true;
  109. image.parentElement.insertBefore(newimg, image);
  110. image.parentElement.removeChild(image);
  111. common.wrapping = false;
  112. return newimg;
  113. }
  114. }
  115. // Check for passively loaded images
  116. if (image.hasAttribute("data-passive")) {
  117. var passiveSrc = image.getAttribute("data-passive");
  118. image.setAttribute("data-passive", passiveSrc.replace(REG_SIGN, "pic/item"));
  119. } else if (image.hasAttribute("data-tb-lazyload")) {
  120. var passiveSrc = image.getAttribute("data-tb-lazyload");
  121. image.setAttribute("data-tb-lazyload", passiveSrc.replace(REG_SIGN, "pic/item"));
  122. }
  123. return image;
  124. }
  125. var obtainImages = function() {
  126. var imageNodes = d.querySelectorAll(IMG_SELECTOR);
  127. for (var i = 0; i < imageNodes.length; i++) {
  128. var image = imageNodes[i];
  129. if (shouldAdd(image))
  130. images.push(image);
  131. }
  132. };
  133. var shouldAdd = function(image) {
  134. // don't process images inside the editor
  135. if (matchesSelector(image, IMG_INSIDE_EDITOR_SELECTOR))
  136. return false;
  137. return true;
  138. };
  139. var addImages = function(new_images) {
  140. for (var i = 0; i < new_images.length; i++) {
  141. var image = new_images[i];
  142. if (!shouldAdd(image)) continue;
  143. image = prefilterImage(image);
  144. images.push(image);
  145. initImage(image);
  146. adjustScaling(image);
  147. }
  148. };
  149. var removeImages = function(del_images) {
  150. for (var i = 0; i < del_images.length; i++) {
  151. var image = del_images[i];
  152. for (var j = 0; j < images.length; j++) {
  153. if (images[j] == image) {
  154. images.splice(j, 1);
  155. break;
  156. }
  157. }
  158. }
  159. };
  160. w.addEventListener('DOMNodeInserted', function(event) {
  161. if (common.wrapping) return;
  162. if (matchesSelector(event.target, IMG_SELECTOR)) {
  163. addImages([event.target]);
  164. } else if (event.target.querySelectorAll) {
  165. var new_images = event.target.querySelectorAll(IMG_SELECTOR);
  166. if (new_images.length != 0) {
  167. addImages(new_images);
  168. }
  169. }
  170. }, false);
  171. w.addEventListener('DOMNodeRemoved', function(event) {
  172. if (common.wrapping) return;
  173. if (matchesSelector(event.target, IMG_SELECTOR)) {
  174. removeImages([event.target]);
  175. } else if (event.target.querySelectorAll) {
  176. var del_images = event.target.querySelectorAll(IMG_SELECTOR);
  177. if (del_images.length != 0) {
  178. removeImages(del_images);
  179. }
  180. }
  181. }, false);
  182. // Stops everything from bubbling up and doing anything else
  183. var stopListener = function(e) {
  184. if (e.stopImmediatePropagation) e.stopImmediatePropagation();
  185. else if (e.stopPropagation) e.stopPropagation();
  186. if (e.preventDefault) e.preventDefault();
  187. return false;
  188. };
  189. // Image click handler that handles image size switching
  190. var listener = function(e) {
  191. // Only handle left clicks
  192. if (e.button != 0) return;
  193. var image = (e && e.target) || (w.event && w.event.srcElement);
  194. // We are expecting clicks on detected images
  195. if (!image || image.localName != 'img' || image.getAttribute('data-detected') != 'true' || !shouldAdd(image))
  196. return;
  197. if (image && image.getAttribute('data-disabled') != 'true') {
  198. if (image.getAttribute('data-fullsized') == 'true') {
  199. image.setAttribute('data-fullsized', 'false');
  200. setTitle(image);
  201. if (e.shiftKey) {
  202. var isSign = matchesSelector(image, SIGN_SELECTOR);
  203. for (var i = 0; i < images.length; i++) {
  204. var img = images[i];
  205. // separate scale all images for sign and non-sign images
  206. if (isSign != matchesSelector(img, SIGN_SELECTOR))
  207. continue;
  208. if (img.getAttribute('data-fullsized') == 'true') {
  209. img.setAttribute('data-fullsized', 'false');
  210. setTitle(img);
  211. }
  212. }
  213. }
  214. } else {
  215. image.setAttribute('data-fullsized', 'true');
  216. setTitle(image);
  217. if (e.shiftKey) {
  218. var isSign = matchesSelector(image, SIGN_SELECTOR);
  219. for (var i = 0; i < images.length; i++) {
  220. var img = images[i];
  221. // separate scale all images for sign and non-sign images
  222. if (isSign != matchesSelector(img, SIGN_SELECTOR))
  223. continue;
  224. if (img.getAttribute('data-fullsized') != 'true') {
  225. img.setAttribute('data-fullsized', 'true');
  226. setTitle(img);
  227. }
  228. }
  229. }
  230. }
  231. if (e.shiftKey) image.scrollIntoView();
  232. }
  233. return stopListener(e);
  234. };
  235. var isDisplayingFullsize = function(image, callback) {
  236. if (image.hasAttribute('data-owidth')) {
  237. var owidth = image.getAttribute('data-owidth');
  238. callback(image.parentElement.offsetWidth >= owidth);
  239. return;
  240. }
  241. var newImg = new Image();
  242.  
  243. newImg.onload = function() {
  244. var owidth = newImg.width;
  245. image.setAttribute('data-owidth', owidth);
  246. image.setAttribute('data-oheight', newImg.height);
  247. // image may have detached from the document, thus visiting "parentElement" may fail
  248. if (image.parentElement && image.parentElement.offsetWidth)
  249. callback(image.parentElement.offsetWidth >= owidth);
  250. };
  251. var passiveSrc = image.getAttribute('data-passive') || image.getAttribute('data-tb-lazyload');
  252. newImg.src = (passiveSrc != "loaded" && passiveSrc) || image.src;
  253. };
  254.  
  255. var adjustScaling = function(image) {
  256. isDisplayingFullsize(image, function(isFullsize) {
  257. if (isFullsize) {
  258. if (image.getAttribute('data-disabled') != 'true') {
  259. image.setAttribute('data-disabled', 'true');
  260. }
  261. } else {
  262. if (image.getAttribute('data-disabled') == 'true') {
  263. image.removeAttribute('data-disabled');
  264. }
  265. }
  266. setTitle(image);
  267. });
  268. };
  269.  
  270. var initImage = function(image) {
  271. image.removeAttribute('width');
  272. image.removeAttribute('height');
  273. image.setAttribute('data-detected', 'true');
  274. setTitle(image);
  275. image.onclick = undefined;
  276. image.addEventListener("load", function() {
  277. var passiveSrc = image.getAttribute('data-passive') || image.getAttribute('data-tb-lazyload');
  278. if (passiveSrc && passiveSrc != "loaded")
  279. return;
  280. var width = image.naturalWidth;
  281. var height = image.naturalHeight;
  282. image.setAttribute('data-owidth', width);
  283. image.setAttribute('data-oheight', height);
  284. adjustScaling(image);
  285. }, false);
  286. if (matchesSelector(image, SIGN_SELECTOR)) {
  287. // wrap sign images into a fixed size container
  288. common.wrapping = true;
  289. try {
  290. var divWrapper = d.createElement('div');
  291. divWrapper.className = 'd_sign_wrapper';
  292. image.parentElement.insertBefore(divWrapper, image.previousSibling);
  293. divWrapper.appendChild(image.previousSibling);
  294. divWrapper.appendChild(image);
  295. } finally {
  296. common.wrapping = false;
  297. }
  298. }
  299. };
  300.  
  301. var setTitle = function(image) {
  302. var title_a = [];
  303. if (image.getAttribute('data-disabled') != 'true') {
  304. var isFullsized = image.getAttribute('data-fullsized') == 'true';
  305. if (image.hasAttribute('data-owidth')) {
  306. var owidth = image.getAttribute('data-owidth')
  307. title_a = [IMG_ORG_SIZE_DESC, owidth, '*', image.getAttribute('data-oheight'), ' ',
  308. IMG_CUR_PERCENT, isFullsized ? 100 : Math.floor(100 * image.parentElement.offsetWidth / owidth), '%\n'];
  309. } else {
  310. title_a = [IMG_RETRIEVING_SIZE, '\n'];
  311. }
  312. title_a.push(isFullsized ? IMG_MIN_DESC : IMG_MAG_DESC);
  313. }
  314. image.setAttribute('title', title_a.join(''));
  315. };
  316.  
  317. var doImageOpAll = function(op) {
  318. for (var i = 0; i < images.length; i++) {
  319. op(images[i]);
  320. }
  321. };
  322. var adjustScalingAll = function() { doImageOpAll(adjustScaling); };
  323. var initImageAll = function() { doImageOpAll(initImage); };
  324.  
  325. prefilterImages();
  326. obtainImages();
  327. initImageAll();
  328. w.addEventListener('resize', adjustScalingAll, false);
  329.  
  330. var loadListener = function() {
  331. for (var i = 0; i < images.length; i++) {
  332. var image = images[i];
  333. adjustScaling(image);
  334. image.onclick = undefined;
  335. }
  336. };
  337. w.addEventListener('DOMContentLoaded', loadListener, false);
  338. w.addEventListener('load', loadListener, false);
  339. w.addEventListener('click', listener, true);
  340. var rightPanelWidth = (function(rightSection) {
  341. return rightSection ? rightSection.offsetWidth : 0;
  342. })(d.querySelector('div.right_section'));
  343. var style = d.createElement('style');
  344. style.setAttribute('type','text/css');
  345. var aInnerHTML = ['img[data-detected=true] { max-width: 100% !important; margin-top: 0 !important; width: auto !important; height: auto !important; cursor: url("data:image/gif;base64,R0lGODlhIAAgAKEAAP///wAAAP///////yH5BAEAAAIALAAAAAAgACAAAAJMlBUZx+2PApggwesk3Qt7XYGdB4EhR5aToqzpo7GJ+zbmTI31IYp7tkH9bDfFMGOM6I4wC/OSfDaXUl71is1qt9yu9wsOi8fkstlQAAA7") 6 6, pointer !important; }\n',
  346. 'img[data-detected=true][data-fullsized=true]:not([data-disabled=true]) { max-width: none !important; cursor: url("data:image/gif;base64,R0lGODlhIAAgAKEAAP///wAAAP///////yH5BAEAAAIALAAAAAAgACAAAAJLlBUZx+2PApggwesk3Qt7vU2dB4GhSJaikqBptrLuy5jnSB82hefGPvPpTCxhRvGzGDHI5aXpfECjjR71is1qt9yu9wsOi8fk8rgAADs=") 6 6, pointer !important; z-index: 9999999; position: relative; }\n',
  347. 'img[data-detected=true][data-disabled=true] { cursor: default !important; }\n',
  348. 'div.replace_div { width: auto !important; height: auto !important; overflow: visible !important; position: static !important; border: none !important; }\n',
  349. 'div.replace_tip { display: none !important; }\n',
  350. 'div.d_sign_wrapper { max-width: 568px; margin: 0 5px; }\n',
  351. 'div.d_sign_split, div.d_sign_split + img { margin-left: 0 !important; margin-right: 0 !important; }\n',
  352. '#pic_to_album_tip { display: none !important; }\n',
  353. 'div.d_post_content_main, div.d_post_content { overflow: visible !important; }\n',
  354. 'div.j_lzl_container img.BDE_Smiley { max-width: 30px !important; max-height: 30px !important; }\n',
  355. 'ul.nav_right a { height: 36px; float: right; color: #5C6573; margin: 5px 5px; padding: 10px 5px; }\n',
  356. 'div.p_content.p_content_nameplate > img[width="1"][height="1"] { display: none !important; }'];
  357. if (B_WIDESCREEN_ENABLED) {
  358. aInnerHTML = aInnerHTML.concat(['\n',
  359. '#container, div.content, #tb_nav, div.p_thread, #pb_content, div.left_section, #j_core_title_wrap, div.l_post, div.d_post_content_main, div.core_reply_wrapper, div.pb_footer, div.d_sign_split, blockquote.d_quote, blockquote.d_quote fieldset, .d_quote .quote_content, div.core { width: auto !important; }\n',
  360. 'div.pb_content { background: none !important; }\n',
  361. 'div.d_post_content_main { padding: 15px 10px 5px !important; }\n',
  362. 'div.p_content { padding: 0 !important; }\n',
  363. 'div.left_section {\n',
  364. ' -moz-box-sizing: border-box;\n',
  365. ' -webkit-box-sizing: border-box;\n',
  366. ' box-sizing: border-box;\n',
  367. ' width: -moz-calc(100% - ', rightPanelWidth, 'px) !important;\n',
  368. ' width: -webkit-calc(100% - ', rightPanelWidth, 'px) !important;\n',
  369. ' width: calc(100% - ', rightPanelWidth, 'px) !important;\n',
  370. ' border-right: 1px solid #E5E5E5;\n',
  371. '}\n',
  372. 'div.l_post {\n',
  373. ' background-color: white;\n',
  374. ' background-image: -moz-linear-gradient(left, #F7F7F7, #F7F7F7 130px, white 130px, white);\n',
  375. ' background-image: -webkit-linear-gradient(left, #F7F7F7, #F7F7F7 130px, white 130px, white);\n',
  376. ' background-image: -ms-linear-gradient(left, #F7F7F7, #F7F7F7 130px, white 130px, white);\n',
  377. ' background-image: -o-linear-gradient(left, #F7F7F7, #F7F7F7 130px, white 130px, white);\n',
  378. ' background-image: linear-gradient(to right, #F7F7F7, #F7F7F7 130px, white 130px, white);\n',
  379. '}\n',
  380. 'div.core_reply_tail, div.core_reply_wrapper { margin-right: 0px !important; }\n',
  381. 'div.core_reply, div.d_content { margin-left: 0px !important; max-width: 568px; margin-right: auto !important; }\n',
  382. '#tb_rich_poster { margin-left: 0px !important; }\n',
  383. '#tb_rich_poster_container { margin-left: 10px !important; }\n',
  384. 'div.d_main_section, div.d_post_content_main, div.d_content, div.core_reply, h1.core_title_txt { float: none !important; }\n',
  385. 'div.d_post_content_main { margin-left: 130px !important; }\n',
  386. 'div.right_section { margin-left: 0 !important; }\n',
  387. 'h1.core_title_txt { display: inline; }\n',
  388. '.card_top_theme2 { margin-right: 0 !important; }'
  389. ])
  390. }
  391. style.innerHTML = aInnerHTML.join('');
  392. d.querySelector('head').appendChild(style);
  393.  
  394. adjustScalingAll();
  395. w.setTimeout(adjustScalingAll, 1000);
  396. })();
  397.  
  398. (function() {
  399. if (!B_FLOORNUM_ENABLED) return;
  400. var POST_SELECTOR = 'div.l_post';
  401. var LZL_POST_SELECTOR = 'span.lzl_time';
  402. var pint = function(str) {
  403. var num = parseInt(str, 10);
  404. return (isNaN(num) || !isFinite(num)) ? 0 : num;
  405. };
  406. var getPostTimeSummary = function(postTimeString) {
  407. // calculate diff between post time and now
  408. var postTimeMillis = 0;
  409. if (postTimeString) {
  410. var match = /^\s*([0-9]{2,4})[\/-]([0-9]{1,2})[\/-]([0-9]{1,2})[ tT\,]*([0-9]{1,2})\:([0-9]{1,2})(?:\:([0-9]{1,2}))?\s*$/.exec(postTimeString);
  411. if (match) {
  412. postTimeMillis = new Date(pint(match[1]), pint(match[2]) - 1, pint(match[3]), pint(match[4]), pint(match[5]), pint(match[6])).getTime();
  413. }
  414. }
  415. var postTimeSummary = '';
  416. if (postTimeMillis) {
  417. //alert(postTimeMillis + " ~ " + Date.now());
  418. var mins = Math.floor((Date.now() - postTimeMillis) / 60000);
  419. if (mins < 1)
  420. postTimeSummary = '刚刚';
  421. else if (mins < 60)
  422. postTimeSummary = mins + '分钟前';
  423. else {
  424. var hours = Math.floor(mins / 60);
  425. if (hours < 24)
  426. postTimeSummary = hours + '小时前';
  427. else {
  428. var days = Math.floor(hours / 24);
  429. if (days < 31)
  430. postTimeSummary = days + '天前';
  431. else {
  432. var months = Math.floor(days / 30.436875);
  433. if (months < 12)
  434. postTimeSummary = months + '个月前';
  435. else {
  436. var years = Math.floor(months / 12);
  437. months -= years * 12;
  438. postTimeSummary = years + '年' + ((months > 0 && years < 3) ? months + '个月' : '') + '前';
  439. }
  440. }
  441. }
  442. }
  443. postTimeSummary += ' ';
  444. }
  445. return postTimeSummary;
  446. };
  447.  
  448. var style = d.createElement('style');
  449. style.setAttribute('type','text/css');
  450. style.innerHTML = ['div.d_floor { font-family: sans-serif; font-size: 16px; float: right; margin: 5px; color: #261CDC; }\n',
  451. 'span.s_lzl_time_summary { color: rgb(153, 153, 153); }\n',
  452. 'div.louzhubiaoshi { right: auto !important; left: 0px; top: 0px !important; transform: rotate(-90deg); -moz-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); }\n',
  453. 'div.louzhubiaoshi_wrap { position: static !important; }\n',
  454. 'div.l_post { position: relative; }'
  455. ].join('');
  456. d.querySelector('head').appendChild(style);
  457. var updatePost = function(post) {
  458. var field = JSON.parse(post.getAttribute('data-field'));
  459. var floorNum = field && (field.content && (field.content.floor || field.content.post_no));
  460. if (floorNum && !isNaN(parseFloat(floorNum)) && isFinite(floorNum)) {
  461. var div = post.querySelector('div.d_floor') || d.createElement('div');
  462. div.className = 'd_floor';
  463. div.innerHTML = getPostTimeSummary(field.content.date) + '#' + floorNum;
  464. common.wrapping = true;
  465. post.insertBefore(div, post.querySelector('*'));
  466. common.wrapping = false;
  467. }
  468. };
  469. var updateLzlPost = function(lzlpost) {
  470. var postTimeSummary = getPostTimeSummary(lzlpost.innerHTML);
  471. var span = lzlpost.parentElement.querySelector('span.s_lzl_time_summary') || d.createElement('span');
  472. span.className = 's_lzl_time_summary';
  473. span.innerHTML = postTimeSummary;
  474. common.wrapping = true;
  475. lzlpost.parentElement.insertBefore(span, lzlpost);
  476. common.wrapping = false;
  477. };
  478. var updateFloorNumField = function() {
  479. var posts = d.querySelectorAll(POST_SELECTOR);
  480. for (var i = 0; i < posts.length; i++)
  481. updatePost(posts[i]);
  482. var lzlposts = d.querySelectorAll(LZL_POST_SELECTOR);
  483. for (var i = 0; i < lzlposts.length; i++)
  484. updateLzlPost(lzlposts[i]);
  485. };
  486. updateFloorNumField();
  487. setInterval(updateFloorNumField, 30000);
  488. // update time summary when elements are dynamically inserted
  489. var matchesSelector = common.matchesSelector;
  490. w.addEventListener('DOMNodeInserted', function(event) {
  491. if (common.wrapping) return;
  492. if (matchesSelector(event.target, LZL_POST_SELECTOR)) {
  493. updateLzlPost(event.target);
  494. } else {
  495. if (matchesSelector(event.target, POST_SELECTOR)) {
  496. updatePost(event.target);
  497. }
  498. if (event.target.querySelectorAll) {
  499. var posts = event.target.querySelectorAll(POST_SELECTOR);
  500. for (var i = 0; i < posts.length; i++)
  501. updatePost(posts[i]);
  502. var lzlposts = event.target.querySelectorAll(LZL_POST_SELECTOR);
  503. for (var i = 0; i < lzlposts.length; i++)
  504. updateLzlPost(lzlposts[i]);
  505. }
  506. }
  507. }, false);
  508. })();
  509.  
  510. (function() {
  511. if (!B_SWITCH_ENABLED) return;
  512. var prefs = [
  513. { name: '宽屏样式', id: 'wsenable', prefName: 'wideScreenEnabled', value: B_WIDESCREEN_ENABLED },
  514. { name: '楼层计数', id: 'fnenable', prefName: 'floorNumEnabled', value: B_FLOORNUM_ENABLED }
  515. ];
  516. var elemNavRight = d.querySelector('ul.nav_right');
  517. if (!elemNavRight) {
  518. var navbar = document.querySelector("#tb_nav");
  519. if (navbar) {
  520. elemNavRight = d.createElement("ul");
  521. elemNavRight.className = "nav_right";
  522. navbar.appendChild(elemNavRight);
  523. }
  524. }
  525. if (elemNavRight) {
  526. prefs.forEach(function(pref) {
  527. var strEnableDisable = pref.value ? '禁用' : '启用';
  528. var strText = strEnableDisable + pref.name;
  529. var liPrefItem = d.createElement('li');
  530. var aPrefItem = d.createElement('a');
  531. aPrefItem.setAttribute('id', pref.id);
  532. aPrefItem.setAttribute('title', strText + '\n(' + STR_SCRIPT_NAME + ')');
  533. aPrefItem.setAttribute('href', '#');
  534. aPrefItem.innerHTML = strText;
  535. aPrefItem.addEventListener('click', function() {
  536. btise[pref.prefName] = !pref.value;
  537. localStorage.btise = JSON.stringify(btise);
  538. w.location.reload();
  539. return false;
  540. });
  541. liPrefItem.appendChild(aPrefItem);
  542. elemNavRight.appendChild(liPrefItem);
  543. });
  544. }
  545. })();
  546.  
  547. })(document, typeof(unsafeWindow) !== "undefined" ? unsafeWindow : window);