艾宾浩斯收藏夹

多终端同步收藏夹,支持艾宾浩斯提醒功能,防止在收藏夹中吃灰。

  1. // ==UserScript==
  2. // @name 艾宾浩斯收藏夹
  3. // @namespace http://www.51gongjuxiang.com/
  4. // @version 0.1
  5. // @description 多终端同步收藏夹,支持艾宾浩斯提醒功能,防止在收藏夹中吃灰。
  6. // @author smoking
  7. // @license MIT
  8. // @match *://*/*
  9. // @grant GM_setValue
  10. // @grant GM_getValue
  11. // @grant GM_xmlhttpRequest
  12. // @grant GM.xmlHttpRequest
  13. // @connect www.51gongjuxiang.com
  14. // @connect www.layuicdn.com
  15. // @connect npm.elemecdn.com
  16. // ==/UserScript==
  17.  
  18. var mainMenuDataOk = false;
  19. var baseUrl = "http://www.51gongjuxiang.com/aib/";
  20. var aibEditWindowId = '';
  21. var currentCurr = 1;
  22. var aibEditPrevData = {};
  23. var mainPannelInit = false;
  24.  
  25.  
  26. function updateAibTable(articles) {
  27. function genTable(articles) {
  28. var fuid = getFuid();
  29. var alertIcon = '<svg class="bell" version="1.1" width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><g class="bell__body" fill="none" fill-rule="evenodd"><g transform="translate(-135 -1900)"><g transform="translate(113 532)"><g transform="translate(22 1368)" fill="currentColor" fill-rule="nonzero"><path class="bell__hull" d="m19.192 13.581c-1.0751 0-1.9497-0.8615-1.9497-1.9204v-4.527c0-3.9334-3.2489-7.1335-7.2424-7.1335-3.9935 0-7.2424 3.2001-7.2424 7.1335v4.527c0 1.059-0.87465 1.9204-1.9497 1.9204-0.44617 0-0.80789 0.35628-0.80789 0.79579s0.36172 0.79575 0.80789 0.79575h18.384c0.44621 0 0.80789-0.35624 0.80789-0.79575s-0.36168-0.79579-0.80789-0.79579zm-15.4 0c0.36758-0.55224 0.58156-1.2122 0.58156-1.9204v-4.527c0-3.0559 2.5241-5.542 5.6266-5.542s5.6266 2.4861 5.6266 5.542v4.527c0 0.70822 0.21398 1.3682 0.58152 1.9204h-12.416z"/><path class="bell__clapper" d="m12.009 17.36c-0.38848-0.24401-0.88605-0.10076-1.1114 0.31983-0.28696 0.5357-0.92289 0.71866-1.4176 0.4079-0.15596-0.097953-0.28626-0.23903-0.37672-0.4079-0.22532-0.42063-0.72293-0.56375-1.1114-0.31983-0.38844 0.24397-0.52066 0.78277-0.29534 1.2034 0.23235 0.4337 0.56689 0.79593 0.96744 1.0475 0.41954 0.26355 0.87866 0.38875 1.332 0.38875 0.91932 0 1.8148-0.51505 2.3084-1.4363 0.22532-0.42055 0.093138-0.95935-0.29534-1.2033z"/></g></g></g></g></svg>';
  30. var ret = '<table class="layui-table" lay-even lay-skin="line"><thead><tr><th>日期</th><th>标题</th><th>提醒</th><th>操作</th></tr></thead><tbody>';
  31. for (var i = 0; i < articles.length; i++) {
  32. var article = articles[i];
  33. var url = getArticleUrl() + '?fuid=' + fuid + "&id=" + article.id;
  34. ret += '<tr aibid="' + article.id + '"><td style="width: 180px;min-width:180px;">' + createTime(article.createdate) + '</td>';
  35. ret += '<td style="white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:300px;max-width:300px"><span name="aibOpen" class="aibTitle"><a target="_blank" href="' + url + '">' + htmlEncode(article.title) + '</a></span></td>';
  36. if (article.isaib) {
  37. if (article.aibdate > 2145887000) {
  38. ret += '<td style="text-align:center"><div class="aibAlertWrapper" data="提醒已完成">' + alertIcon + '</div></td>';
  39. } else {
  40. if (article.alert) {
  41. ret += '<td style="text-align:center"><div class="aibAlertWrapper aibAlertActive aibAlertShake" data="提醒日期:' + createDate(article.aibdate) + '">' + alertIcon + '</div></td>';
  42. } else {
  43. ret += '<td style="text-align:center"><div class="aibAlertWrapper aibAlertActive" data="提醒日期:' + createDate(article.aibdate) + '">' + alertIcon + '</div></td>';
  44. }
  45. }
  46. } else {
  47. ret += '<td style="text-align:center"><div class="aibAlertStrikethrough aibAlertWrapper" + data="无提醒">' + alertIcon + '</div></td>';
  48. }
  49. ret += '<td><button name="aibEdit" type="button" class="layui-btn layui-btn-sm">编辑</button><button name="aibDelete" type="button" class="layui-btn layui-btn-sm layui-btn-danger">删除</button></td></tr>';
  50. }
  51. ret += "</tbody></table>";
  52. return ret;
  53. }
  54. var tableStr = genTable(articles);
  55. document.getElementById('aibtable').innerHTML = tableStr;
  56. function getAibId(event) {
  57. return layui.$(event.target).parents("tr").attr("aibid") * 1;
  58. }
  59. addTips("span[name='aibOpen'] a", function(event) {return event.target.innerHTML;});
  60. addTips("div.aibAlertWrapper", function(event) {return layui.$(event.target).closest('div').attr('data');});
  61. layui.$("span[name='aibOpen']").click(function(event) {onAibListOpen(getAibId(event));});
  62. layui.$("button[name='aibEdit']").click(function(event){onAibListEdit(getAibId(event));});
  63. layui.$("button[name='aibDelete']").click(function(event){onAibListDelete(getAibId(event));});
  64. }
  65.  
  66. function onAibCircleClick() {
  67. initLayui(function(){
  68. var windowId = layui.layer.tips('<span name="menuWrapper"><ul><li><button name="menuAdd" style="width:100%;" class="layui-btn layui-btn-sm layui-btn-normal">新增收藏</button></li><li><button name="menuMain" style="width:100%;margin-top: 5px;" class="layui-btn layui-btn-sm layui-btn-normal">收藏列表</button></li><li><button name="menuStopAlert" style="width:100%;margin-top: 5px;" class="layui-btn layui-btn-sm layui-btn-normal">今日勿扰</button></li></ul></span>', '#circleWrapper', {
  69. tips: [4, '#fff'],
  70. time: 5000
  71. });
  72. setTimeout(function(){
  73. layui.$('span[name="menuWrapper"]').mouseleave(function(){closeMenu();});
  74. layui.$('button[name="menuAdd"]').click(function(){closeMenu();onAibMenuAdd();});
  75. layui.$('button[name="menuMain"]').click(function(){closeMenu();onAibMenuMain();})
  76. layui.$('button[name="menuStopAlert"]').click(function(){closeMenu();onAibMenuStopAlert();});
  77. }, 100);
  78. function closeMenu() {
  79. layui.layer.close(windowId);
  80. }
  81. });
  82. }
  83.  
  84. function onAibMenuAdd() {
  85. initAibEdit();
  86. aibEditPrevData = {};
  87. layui.form.val('aibEdit', {aibId: "", aibType: "0", aibTitle: document.title, aibIsAib: "on", aibContent: document.location.href});
  88. layui.$('#aibIsAibWrapper').show();
  89. aibEditWindowId = layui.layer.open({type: 1,title: '新增',content: layui.$('#aibEdit')});
  90. }
  91.  
  92. function onAibMenuMain() {
  93. if (!mainPannelInit) {
  94. mainPannelInit = true;
  95. layui.$('#aibid').click(function(){
  96. initAibSyncTable();
  97. var fuid = getFuid();
  98. layui.$("input[name='syncId']").val(fuid);
  99. layui.layer.open({
  100. type: 1,
  101. title: '同步',
  102. content: layui.$('#aibSyncWrapper')
  103. });
  104. });
  105. // 绑定搜索事件
  106. layui.$('input[name="aibSearch"]').keypress(function(e){
  107. if (e.which == 13) {
  108. currentCurr = 1;
  109. renderPage();
  110. }
  111. });
  112. layui.$('#aibSearchButton').click(function(){
  113. currentCurr = 1;
  114. renderPage();
  115. });
  116. }
  117.  
  118. mainMenuDataOk = false;
  119. layui.$('input[name="aibSearch"]').val('');
  120. currentCurr = 1;
  121. renderPage();
  122. waitAndDo(function() {return mainMenuDataOk}, function() {
  123. layui.layer.open({
  124. type: 1,
  125. title: '全能收藏夹',
  126. content: layui.$('#aibcontainer')
  127. });
  128. });
  129. // 其他终端添加的条目,在这里异步更新。
  130. var oldTotal = GM_getValue('prefetchData').total;
  131. forcePrefetch(function() {
  132. var newTotal = GM_getValue('prefetchData').total;
  133. if (oldTotal != newTotal) {
  134. renderPage();
  135. }
  136. })
  137. }
  138.  
  139. function onAibMenuStopAlert() {
  140. GM_setValue('notAlert', (new Date()).toDateString());
  141. document.getElementsByClassName("bigcircle2")[0].style.display="none";
  142. }
  143.  
  144. function onAibListOpen(id) {
  145. forcePrefetch();
  146. }
  147.  
  148. function onAibListEdit(id) {
  149. var fuid = getFuid();
  150. var postData = {fuid: fuid, id: id, method: 'GET'};
  151. post(getArticleUrl(), postData, function(res) {
  152. if (res && res.errMsg) {
  153. layui.layer.msg(res.errMsg, {icon: 5});
  154. } else {
  155. initAibEdit();
  156. layui.form.val('aibEdit', {aibId: res.id + "", aibType: res.type + "", aibTitle: res.title, aibContent: res.content});
  157. layui.$('#aibIsAibWrapper').hide();
  158. aibEditWindowId = layui.layer.open({type: 1,title: '编辑',content: layui.$('#aibEdit')});
  159. }
  160. });
  161. }
  162.  
  163. function onAibListDelete(id) {
  164. var fuid = getFuid();
  165. var postData = {fuid: fuid, id: id, method: 'DELETE'};
  166. post(getArticleUrl(), postData, function(res) {
  167. if (res && res.errMsg) {
  168. layui.layer.msg(res.errMsg, {icon: 5});
  169. } else {
  170. forcePrefetch(function() {
  171. renderPage();
  172. layui.layer.msg('删除成功');
  173. });
  174. }
  175. });
  176. }
  177.  
  178.  
  179. (function() {
  180. if (self != top) { // 只在顶层窗口生效
  181. return;
  182. }
  183. // 添加style
  184. var style = document.createElement("style");
  185. style.type = "text/css";
  186. var styleStr = ".smallcircle2{width: 30px; height: 30px;background-color: #0062d4;border-radius: 50%;position: absolute;}";
  187. styleStr += ".bigcircle2{display:none;width: 30px;height: 30px;background-color: #0062d4;opacity: 0.4;border-radius: 50%;position: absolute;animation: scales 1s infinite cubic-bezier(0,0,0.49,1.02);}";
  188. styleStr += "@keyframes scales {0%{transform: scale(1);}50%,75%{transform: scale(3);}68%,100%{opacity: 0;}}";
  189. styleStr += ".aibTitle a{color: #333} .aibTitle a:visited{color: #333}";
  190. styleStr += ".aibAlertShake .bell__body { animation: bell 1s infinite ease-in-out; transform-origin: 50% 30%; } .aibAlertShake .bell__clapper { animation: clapper 1s infinite ease-in-out; transform-origin: center center; } @keyframes bell { 0% { transform: rotate(0); } 20% { transform: rotate(12.5deg); } 40% { transform: rotate(-12.5deg); } 60% { transform: rotate(12.5deg); } 80% { transform: rotate(2deg); } 85% { transform: rotate(0); } 100% { transform: rotate(0); } } @keyframes clapper { 0% { transform: translateX(0); } 25% { transform: translateX(-3px); } 50% { transform: translateX(4px); } 75% { transform: translateX(-2px); } 100% { transform: translateX(0); } }";
  191. styleStr += ".aibAlertActive {color: #16baaa}";
  192. styleStr += ".aibAlertWrapper {width: 20px;height:20px}";
  193. styleStr += ".aibAlertStrikethrough {position: relative;}.aibAlertStrikethrough:before {display: block;width: 22px;position: absolute;content:'';left: 0;top: 50%;right: 0;border-top: 2px solid;border-color: inherit;transform:rotate(-45deg);}";
  194. styleStr += ".layui-form-label{box-sizing: content-box;}";
  195. styleStr += ".layui-layer-page{text-align:left;}";
  196. style.innerHTML = styleStr;
  197. document.getElementsByTagName("HEAD").item(0).appendChild(style);
  198. // 添加入口小圆圈
  199. var circleWrapper = document.createElement("div");
  200. circleWrapper.id = "circleWrapper";
  201. circleWrapper.style.position = "fixed";
  202. circleWrapper.style.right = "60px";
  203. circleWrapper.style.bottom = "120px";
  204. circleWrapper.style["z-index"]=999999999;
  205. circleWrapper.oncontextmenu = function(){return false;};
  206. circleWrapper.innerHTML = '<div class="bigcircle2"></div><div class="smallcircle2"></div>';
  207. document.body.appendChild(circleWrapper);
  208. // 小圆圈可拖动
  209. var circle = document.getElementById("circleWrapper");
  210. dragable(circle);
  211. // 主框
  212. var mainPannel = document.createElement("div");
  213. mainPannel.id = "aibcontainer";
  214. mainPannel.style.display = "none";
  215. mainPannel.style['min-width'] = "700px";
  216. mainPannel.innerHTML = '<div id="aibheader" style="box-sizing: content-box;height:25px;padding: 10px"><span style="float:left"><div class="layui-input-group"><input type="text" name="aibSearch" placeholder="搜索关键字" class="layui-input"><div id="aibSearchButton" class="layui-input-split layui-input-suffix" style="cursor: pointer;">搜索</div></div></span><span style="float:right;margin-top:10px">用户ID: <span id="aibid" style="cursor:pointer;text-decoration:underline"></span></span></div><div id="aibtable"></div><div id="aibfooter"></div>';
  217. document.body.appendChild(mainPannel);
  218.  
  219. prefetch();
  220. })();
  221.  
  222.  
  223. function renderPage() {
  224. function jmp(obj) {
  225. var fuid = getFuid();
  226. currentCurr = obj.curr;
  227. var keyword = layui.$('input[name="aibSearch"]').val();
  228. post(baseUrl + "articles.php", {fuid: fuid, page: obj.curr - 1, size: obj.limit, keyword: keyword}, function(data) {
  229. updateAibTable(data['articles']);
  230. mainMenuDataOk = true;
  231. });
  232. }
  233. var keyword = layui.$('input[name="aibSearch"]').val();
  234. if (keyword !== "") {
  235. var fuid = getFuid();
  236. post(baseUrl + "articles.php", {fuid: fuid, keyword: keyword, countOnly: true}, function(data) {
  237. var cnt = data['count'];
  238. layui.laypage.render({
  239. elem: 'aibfooter',
  240. count: cnt,
  241. curr: currentCurr,
  242. jump: function(obj) {
  243. jmp(obj);
  244. }
  245. });
  246. });
  247. } else {
  248. var prefetchData = GM_getValue('prefetchData');
  249. layui.laypage.render({
  250. elem: 'aibfooter',
  251. count: prefetchData.total,
  252. curr: currentCurr,
  253. jump: function(obj) {
  254. jmp(obj);
  255. }
  256. });
  257. }
  258. }
  259.  
  260. var layuiInited = false;
  261. function initLayui(callback) { // 延迟加载,只在打开列表的时候才加载layui
  262. if (layuiInited) {
  263. callback();
  264. return;
  265. }
  266. //CSP策略下初始化layui
  267. function initLayuiWithCSP(callback) {
  268. get("https://www.layuicdn.com/layui/css/layui.css", function(res) {
  269. var element = document.createElement('style');
  270. element.setAttribute('type', 'text/css');
  271. element.innerText = res;
  272. document.getElementsByTagName("HEAD").item(0).appendChild(element);
  273. });
  274. get("https://www.layuicdn.com/layui/layui.js", function(res) {
  275. eval(res);
  276. if (callback) {
  277. callback();
  278. }
  279. });
  280. }
  281. layuiInited = true;
  282. var element = document.createElement('script');
  283. element.setAttribute('type', 'text/javascript');
  284. element.src = "https://www.layuicdn.com/layui/layui.js";
  285. document.documentElement.appendChild(element);
  286. element = document.createElement('link');
  287. element.id = 'layuicss';
  288. element.setAttribute('rel', 'stylesheet');
  289. element.setAttribute('type', 'text/css');
  290. element.href = "https://www.layuicdn.com/layui/css/layui.css";
  291. document.documentElement.appendChild(element);
  292. waitAndDo(function() {
  293. try {
  294. layui.use(['layer', 'laypage', 'form'], callback);
  295. return true;
  296. } catch (e) {
  297. return false;
  298. }
  299. }, function(){}, 100, function(){
  300. // 如果0.1秒还没有加载layui的话,则认为被csp策略限制了。这时要使用另外的方式加载layui
  301. initLayuiWithCSP(function() {
  302. waitAndDo(function() {
  303. try {
  304. layui.use(['layer', 'laypage', 'form'], callback);
  305. return true;
  306. } catch (e) {
  307. return false;
  308. }
  309. }, function(){});
  310. });
  311. });
  312. }
  313.  
  314. var aibSyncTableInited = false;
  315. function initAibSyncTable() {
  316. if (aibSyncTableInited) {
  317. return;
  318. }
  319. aibSyncTableInited = true;
  320. var syncStr = '<div style="display:none" id="aibSyncWrapper" class="aibSyncWrapper"><DIV style="text-align:center;color:red">输入其他电脑的同步ID,可实现内容的合并与同步。</DIV><div class="layui-form-item">';
  321. syncStr += '<div class="layui-inline"><label class="layui-form-label">同步ID: </label><div style="width:300px" class="layui-input-inline layui-input-wrap"><input type="text" name="syncId" class="layui-input"></div>';
  322. syncStr += '<div class="layui-form-mid" style="padding: 0!important;"> <button id="aibSyncBtn" type="button" class="layui-btn layui-btn-normal" >确认</button></div></div></div></div>';
  323. var doc = document.createElement('div');
  324. doc.innerHTML = syncStr;
  325. document.body.appendChild(doc);
  326. layui.form.render();
  327. layui.$("#aibSyncBtn").click(function(){
  328. var fuid = getFuid();
  329. var syncId = layui.$("input[name='syncId']").val();
  330. if (fuid == syncId) {
  331. layui.layer.msg('同步ID没有改动,无需同步');
  332. } else {
  333. post(baseUrl + "sync.php", {fuid: fuid, action: 'sync', syncId: syncId}, function(res) {
  334. if (res && res.errMsg) {
  335. layui.layer.msg(res.errMsg, {icon: 5});
  336. } else {
  337. GM_setValue('fuid', res.data);
  338. forcePrefetch(function(){
  339. renderPage();
  340. });
  341. layui.layer.msg('同步完成');
  342. }
  343. });
  344. }
  345. });
  346. }
  347.  
  348.  
  349. var aibEditInited = false;
  350. function initAibEdit() {
  351. if (aibEditInited) {
  352. return;
  353. }
  354. aibEditInited = true;
  355. var aibEditStr = '<div style="display:none" id="aibEdit"><form class="layui-form" style="width:800px;padding:20px;display:inline-block" lay-filter="aibEdit">';
  356. aibEditStr += '<div style="display:none;"><input name="aibId" type="text"></input></div>';
  357. aibEditStr += '<div class="layui-form-item"><label class="layui-form-label">类型</label><div class="layui-input-block"><input type="radio" name="aibType" value="0" title="网址" checked="" lay-filter="aibTypeChange"></input><input type="radio" name="aibType" value="1" title="文本" lay-filter="aibTypeChange"></input></div></div>';
  358. aibEditStr += '<div class="layui-form-item"><label class="layui-form-label">标题</label><div class="layui-input-block"><input type="text" name="aibTitle" autocomplete="off" placeholder="请输入标题" class="layui-input"></input></div></div>';
  359. aibEditStr += '<div class="layui-form-item" id="aibIsAibWrapper"><label class="layui-form-label">艾宾浩斯</label><div class="layui-input-block"><input type="checkbox" checked="" name="aibIsAib" lay-skin="switch" lay-text="开启|关闭"></input></div></div>';
  360. aibEditStr += '<div class="layui-form-item"><label class="layui-form-label">内容</label><div class="layui-input-block"><textarea name="aibContent" placeholder="请输入内容" class="layui-textarea"></textarea></div></div>';
  361. aibEditStr += '<div class="layui-form-item"><label class="layui-form-label"></label><div class="layui-input-block"><button id="aibSave" type="button" class="layui-btn">保存</button></div></div></form></div>';
  362. var doc = document.createElement('div');
  363. doc.innerHTML = aibEditStr;
  364. document.body.appendChild(doc);
  365. layui.form.render();
  366. layui.form.on('radio(aibTypeChange)', function(e){
  367. var formVal = layui.form.val('aibEdit');
  368. if (formVal.aibId == "") {
  369. var tmp = {aibTitle: formVal.aibTitle, aibContent: formVal.aibContent};
  370. layui.form.val('aibEdit', {aibTitle: aibEditPrevData.aibTitle, aibContent: aibEditPrevData.aibContent});
  371. aibEditPrevData = tmp;
  372. }
  373. });
  374. layui.$("#aibSave").click(function(){
  375. var formVal = layui.form.val('aibEdit');
  376. var fuid = getFuid();
  377. var postData = {fuid: fuid, title: formVal.aibTitle, content: formVal.aibContent, type: formVal.aibType * 1};
  378. if (formVal.aibId) {
  379. postData['method'] = 'UPDATE';
  380. postData['id'] = formVal.aibId * 1;
  381. post(getArticleUrl(), postData, function(res) {
  382. if (res && res.errMsg) {
  383. layui.layer.msg(res.errMsg, {icon: 5});
  384. } else {
  385. layui.layer.close(aibEditWindowId);
  386. forcePrefetch(function() {
  387. renderPage();
  388. layui.layer.msg('修改成功');
  389. });
  390. }
  391. });
  392. } else {
  393. postData['method'] = 'POST';
  394. postData['isaib'] = (formVal.aibIsAib == 'on' ? 1 : 0);
  395. post(getArticleUrl(), postData, function(res) {
  396. if (res && res.errMsg) {
  397. layui.layer.msg(res.errMsg, {icon: 5});
  398. } else {
  399. layui.layer.close(aibEditWindowId);
  400. forcePrefetch();
  401. layui.layer.msg('添加成功');
  402. }
  403. });
  404. }
  405. });
  406. }
  407.  
  408. function forcePrefetch(callback) {
  409. GM_setValue('aibTTL', null);
  410. prefetch(callback);
  411. }
  412.  
  413. function prefetch(callback) {
  414. function handleFetchData(fetchResult) {
  415. document.getElementById("aibid").innerHTML = fetchResult.id;
  416. if (fetchResult.alert > 0 && GM_getValue('notAlert') !== (new Date()).toDateString()) {
  417. document.getElementsByClassName("bigcircle2")[0].style.display="block";
  418. } else {
  419. document.getElementsByClassName("bigcircle2")[0].style.display="none";
  420. }
  421. }
  422. var ttl = GM_getValue('aibTTL');
  423. if (ttl && ttl > (new Date()).getTime()) {
  424. handleFetchData(GM_getValue('prefetchData'));
  425. if (callback) {
  426. callback();
  427. }
  428. return;
  429. }
  430. var fuid = getFuid();
  431. if (!fuid) {
  432. fuid = 'none';
  433. }
  434.  
  435. var timer = -1;
  436. function timerFunc() {
  437. post(baseUrl + "prefetch.php", {fuid: fuid}, function(data){
  438. if (data.fuid != 'none') {
  439. if (timer != -1) {
  440. clearInterval(timer);
  441. }
  442. GM_setValue('aibTTL', (new Date()).getTime() + data.ttl * 60000);
  443. GM_setValue('fuid', data.fuid);
  444. GM_setValue('prefetchData', data);
  445. handleFetchData(data);
  446. if (callback) {
  447. callback();
  448. }
  449. } else {
  450. fuid = data.fuid;
  451. }
  452. });
  453. }
  454. timer = setInterval(timerFunc, 6000);
  455. timerFunc();
  456. }
  457.  
  458. function dragable(obj) {
  459. function getScrollbarWidth() {
  460. var w1, w2, outer,inner;
  461. outer = document.createElement('div');
  462. inner = document.createElement('div');
  463. outer.appendChild(inner);
  464. outer.style.display = 'block';
  465. outer.style.position = 'absolute';
  466. outer.style.width = '50px';
  467. outer.style.height = '50px';
  468. outer.style.overflow = 'hidden';
  469. inner.style.height = '100px';
  470. inner.style.width = 'auto';
  471. document.body.appendChild(outer);
  472. w1 = inner.offsetWidth;
  473. outer.style.overflow = 'scroll';
  474. w2 = inner.offsetWidth;
  475. if (w1 === w2) {
  476. w2 = outer.clientWidth;
  477. }
  478. document.body.removeChild(outer);
  479. return w1 - w2;
  480. }
  481. function getScrollbarVisiable(){
  482. return document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight);
  483. }
  484. var scrollbarWidth = getScrollbarWidth();
  485. var scrollbarVisiable = getScrollbarVisiable();
  486. var downX, downY;
  487. obj.onmousedown = function(event) {
  488. downX = event.clientX;
  489. downY = event.clientY;
  490. event = event || window.event;
  491. var ol = event.clientX - obj.offsetLeft;
  492. var ot = event.clientY - obj.offsetTop;
  493. document.onmousemove = function(event){
  494. event = event || window.event;
  495. var left = event.clientX - ol;
  496. var top = event.clientY - ot;
  497. if (scrollbarVisiable) {
  498. obj.style.right = (window.innerWidth - scrollbarWidth - left)+"px";
  499. } else {
  500. obj.style.right = (window.innerWidth - left)+"px";
  501. }
  502. obj.style.bottom = (window.innerHeight - top)+"px";
  503. };
  504. document.onmouseup = function(eventInner){
  505. document.onmousemove = null;
  506. document.onmouseup = null;
  507. if (eventInner.clientX == downX && eventInner.clientY == downY) {
  508. onAibCircleClick();
  509. }
  510. };
  511. return false;
  512. };
  513. }
  514.  
  515. function waitAndDo(condition, callback, timeoutInMs, timeoutCallback) {
  516. var deadLine = 0;
  517. if (timeoutInMs) {
  518. deadLine = (new Date()).getTime() + timeoutInMs;
  519. }
  520. var timer = setInterval(function() {
  521. var now = (new Date()).getTime();
  522. if (deadLine != 0 && now > deadLine) {
  523. clearInterval(timer);
  524. timeoutCallback();
  525. return;
  526. }
  527. if (condition()) {
  528. clearInterval(timer);
  529. callback();
  530. }
  531. }, 20);
  532. }
  533.  
  534. function post(url, data, callback) {
  535. GM.xmlHttpRequest({
  536. method: "POST",
  537. url: url,
  538. data: JSON.stringify(data),
  539. onload: function(res) {
  540. try {
  541. if (res.response) {
  542. callback(JSON.parse(res.response));
  543. } else {
  544. callback();
  545. }
  546. } catch (e) {
  547. console.log(res);
  548. console.log(res.response);
  549. layui.layer.msg("请稍后重试", {icon: 5});
  550. }
  551. }
  552. });
  553. }
  554.  
  555. function get(url, callback) {
  556. GM.xmlHttpRequest({
  557. method: "GET",
  558. url: url,
  559. onload: function(res) {
  560. callback(res.response);
  561. }
  562. });
  563. }
  564.  
  565. function createTime(v){
  566. var now = new Date(v * 1000);
  567. var yy = now.getFullYear();
  568. var mm = now.getMonth() + 1;
  569. var dd = now.getDate();
  570. var hh = now.getHours();
  571. var ii = now.getMinutes();
  572. var ss = now.getSeconds();
  573. var clock = yy + "-";
  574. if(mm < 10) clock += "0";
  575. clock += mm + "-";
  576. if(dd < 10) clock += "0";
  577. clock += dd + " ";
  578. if(hh < 10) clock += "0";
  579. clock += hh + ":";
  580. if (ii < 10) clock += '0';
  581. clock += ii + ":";
  582. if (ss < 10) clock += '0';
  583. clock += ss;
  584. return clock;
  585. }
  586.  
  587. function createDate(v) {
  588. var now = new Date(v * 1000);
  589. var yy = now.getFullYear();
  590. var mm = now.getMonth() + 1;
  591. var dd = now.getDate();
  592. var clock = yy + "-";
  593. if(mm < 10) clock += "0";
  594. clock += mm + "-";
  595. if(dd < 10) clock += "0";
  596. clock += dd;
  597. return clock;
  598. }
  599.  
  600. function htmlEncode(rawStr) {
  601. return rawStr.replace(/[\u00A0-\u9999<>\&]/g, function(i) {
  602. return '&#'+i.charCodeAt(0)+';';
  603. });
  604. }
  605.  
  606. function getFuid() {
  607. return GM_getValue('fuid');
  608. }
  609.  
  610. function getArticleUrl() {
  611. return baseUrl + 'article.php';
  612. }
  613.  
  614. function addTips(elementSelector, msgSupplier) {
  615. var tmpWindowId;
  616. var tmpWindowTimer;
  617. layui.$(elementSelector).mouseenter(function(event){
  618. tmpWindowTimer = setTimeout(function() {
  619. tmpWindowTimer = 0;
  620. tmpWindowId = layui.layer.tips(msgSupplier(event), event.target, {
  621. tips: [1, ''],
  622. time: 5000
  623. });
  624. }, 500);
  625. });
  626. layui.$(elementSelector).mouseleave(function(event){
  627. if (tmpWindowTimer) {
  628. clearTimeout(tmpWindowTimer);
  629. } else {
  630. layui.layer.close(tmpWindowId);
  631. }
  632. });
  633. }

QingJ © 2025

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