Weibo Bookmark

You can place a marker on the last newsfeed you have read, so it can be found easily next time. Ctrl-Click on an item to mark it, again to remove the mark.

  1. // ==UserScript==
  2. // @name Weibo Bookmark
  3. // @namespace https://github.com/henix/userjs/weibo_marker
  4. // @description You can place a marker on the last newsfeed you have read, so it can be found easily next time. Ctrl-Click on an item to mark it, again to remove the mark.
  5. // @author henix
  6. // @version 20200701.1
  7. // @include http://weibo.com/*
  8. // @include https://weibo.com/*
  9. // @include http://www.weibo.com/*
  10. // @include https://www.weibo.com/*
  11. // @license MIT License
  12. // ==/UserScript==
  13.  
  14. /**
  15. * ChangeLog:
  16. *
  17. * 2013-3-30 henix
  18. * 解决在分组可见微博上添加书签不可见的问题
  19. *
  20. * 分组可见微博有 type_group 这个 class 从而使原始 css 的优先级更高
  21. *
  22. * Version 1.0.1
  23. *
  24. * 2012-10-26 henix
  25. * Updated to new version weibo.
  26. *
  27. * Version 1.0
  28. *
  29. * 2012-7-11 henix
  30. * Fix the bug that can't add marker just upon "XX分钟前,你看到这里".
  31. *
  32. * Weibo will add a style dl.W_no_border which has a higher priority than ".feedmarker",
  33. * so my style on border will be never applied.
  34. * Change ".feedmarker" to "dl.feedmarker" can fix this bug.
  35. *
  36. * 2012-6-14 henix
  37. * Add www.weibo.com
  38. *
  39. * 2012-5-30 henix
  40. * Fix the bug that you can not add marker on Chrome sometimes.
  41. *
  42. * If the script executed before DOM loaded completely, the click handler will not be registered.
  43. *
  44. * 2012-2-27 henix
  45. * don't listen on load event
  46. *
  47. * 2012-2-27 henix
  48. * Version 0.1
  49. */
  50.  
  51. function insertSheet(ruleString, atstart) {
  52. var head = document.getElementsByTagName("head")[0];
  53. var style = document.createElement("style");
  54. var rules = document.createTextNode(ruleString);
  55. style.type = "text/css";
  56. if(style.styleSheet) {
  57. style.styleSheet.cssText = rules.nodeValue;
  58. } else {
  59. style.appendChild(rules);
  60. }
  61. if (atstart) {
  62. head.insertBefore(style, head.children[0]);
  63. } else {
  64. head.appendChild(style);
  65. }
  66. }
  67.  
  68. var curMark;
  69.  
  70. function markItem(e) {
  71. if (curMark) {
  72. demarkItem();
  73. }
  74. e.classList.add('feedmarker');
  75. curMark = e;
  76. }
  77.  
  78. function demarkItem() {
  79. curMark.classList.remove('feedmarker');
  80. curMark = null;
  81. }
  82.  
  83. function clickHandler(e) {
  84. if (!e) e = window.event;
  85. if (!e.ctrlKey) {
  86. return;
  87. }
  88. var tg = window.event ? e.srcElement : e.target;
  89. if (tg.nodeName === 'A') {
  90. return;
  91. }
  92. var p = tg.parentNode;
  93. while (p != this) {
  94. tg = p;
  95. p = tg.parentNode;
  96. }
  97. if (curMark !== tg) {
  98. markItem(tg);
  99. localStorage.setItem('feedmarkid', tg.getAttribute('mid'));
  100. } else {
  101. demarkItem();
  102. localStorage.removeItem('feedmarkid');
  103. }
  104. }
  105.  
  106. var CSS = (
  107. 'div.WB_feed div.WB_feed_type.feedmarker, ' +
  108. 'div.WB_feed div.WB_feed_type.feedmarker-old, ' +
  109. 'div.WB_feed div.WB_feed_type.type_group.feedmarker, ' +
  110. 'div.WB_feed div.WB_feed_type.type_group.feedmarker-old {' +
  111. 'border-top-width: 20px;' +
  112. 'border-right-width: 1px;' +
  113. 'border-bottom-width: 1px;' +
  114. 'border-left-width: 1px;' +
  115. 'border-top-style: solid;' +
  116. 'border-right-style: dashed;' +
  117. 'border-bottom-style: dashed;' +
  118. 'border-left-style: dashed;' +
  119. 'border-right-color: black;' +
  120. 'border-bottom-color: black;' +
  121. 'border-left-color: black;' +
  122. '}' +
  123. 'div.WB_feed div.WB_feed_type.feedmarker-old, ' +
  124. 'div.WB_feed div.WB_feed_type.type_group.feedmarker-old {' +
  125. 'border-top-color: #ff6;' +
  126. '}' +
  127. 'div.WB_feed div.WB_feed_type.feedmarker, ' +
  128. 'div.WB_feed div.WB_feed_type.type_group.feedmarker {' +
  129. 'border-top-color: #ccc;' +
  130. '}'
  131. );
  132.  
  133. function whenExists(query, f) {
  134. var x = query();
  135. if (x) {
  136. f(x);
  137. } else {
  138. setTimeout(function() { whenExists(query, f); }, 500);
  139. }
  140. }
  141.  
  142. if (document.querySelector("div.WB_miniblog")) {
  143. insertSheet(CSS);
  144. whenExists(function() { return document.querySelector("div.WB_feed"); }, function(feedlist) {
  145. feedlist.addEventListener('click', clickHandler);
  146. var oldId = localStorage.getItem('feedmarkid');
  147. if (oldId) {
  148. var markOld = function() {
  149. var item = Array.prototype.slice.call(feedlist.querySelectorAll("div.WB_feed_type")).find(function(e) { return e.getAttribute("mid") == oldId; });
  150. if (item) {
  151. item.classList.add("feedmarker-old");
  152. } else {
  153. setTimeout(markOld, 1000 * 2); // retry after 2s
  154. }
  155. };
  156. markOld();
  157. }
  158. });
  159. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址