CSDN Blog 极致简化

页面排版调整,仅保留评论区、文章主体、文章目录,免登录增加复制及鼠标框选代码功能,免登录加载评论

  1. // ==UserScript==
  2. // @name CSDN Blog 极致简化
  3. // @name:en CSDN Blog Super Simplification
  4. // @namespace csdn_blog_super_simplification
  5. // @version 5.1.5
  6. // @description 页面排版调整,仅保留评论区、文章主体、文章目录,免登录增加复制及鼠标框选代码功能,免登录加载评论
  7. // @description:en Page layout modification. Only comment area, article body, directory are shown. No login requirement to copy or select code area. No login requirement to load comments.
  8. // @author Xavier Wong
  9. // @run-at document-start
  10. // @match https://*blog.csdn.net/*
  11. // @match https://*.blog.csdn.net/*
  12. // @match https://*csdnnews.blog.csdn.net/*
  13. // @grant GM_getValue
  14. // @grant GM_setValue
  15. // @grant GM_addStyle
  16. // @license Xavier Wong
  17. // ==/UserScript==
  18.  
  19. GM_addStyle(
  20. 'html.eyecomfort-on {-webkit-filter: brightness(60%) !important}' +
  21. 'html.eyecomfort-off {-webkit-filter: brightness(100%) !important}' +
  22. '#commentSideBoxshadow.comment-show {display: block !important}' +
  23. '#commentSideBoxshadow.comment-hide {display: none !important}' +
  24. 'main.comment-show {width: 70% !important}' +
  25. 'main.comment-hide {width: 100% !important}' +
  26. '#rightAside.directory-show {display: block !important}' +
  27. '#rightAside.directory-hide {display: none !important}' +
  28. '#mainBox.directory-show {width: calc(100vw - 300px) !important; margin-right: 300px !important}' +
  29. '#mainBox.directory-hide {width: calc(100vw) !important; margin-right: 0px !important}'
  30. );
  31.  
  32. function generateSideToolBarElement(dataType, style, imgUrl, text1, text2){
  33. const tmpDiv = document.createElement('div');
  34. tmpDiv.innerHTML = '<a class="option-box" style="' + style + '" data-type="' + dataType + '">' +
  35. (imgUrl == null ? '' : '<img src="' + imgUrl + '" alt="" srcset="">') +
  36. '<span ' + (imgUrl == null ? 'style="display:flex;opacity:100;font-size:10px"' : '') + '>' + text1 + '<br>' + text2 + '</span>' +
  37. '</a>';
  38. return tmpDiv.firstElementChild;
  39. }
  40.  
  41. /**
  42. * 修改指定DOM
  43. * @param domSelector DOM选择器
  44. * @param style 样式
  45. */
  46. function modifyDOM(domSelector, style){
  47. GM_addStyle(
  48. domSelector + '{' + style + '}'
  49. );
  50. }
  51.  
  52. /**
  53. * 隐藏指定DOM
  54. * @param domSelector DOM选择器
  55. */
  56. function hideDOM(domSelector){
  57. GM_addStyle(
  58. domSelector + '{display: none !important;}'
  59. );
  60. }
  61.  
  62. /**
  63. * 添加DOM类
  64. * @param domSelector DOM选择器
  65. * @param className 类名
  66. */
  67. function addDOMClass(domSelector, className){
  68. getDOM(domSelector).classList.add(className);
  69. }
  70.  
  71. /**
  72. * 删除DOM类
  73. * @param domSelector DOM选择器
  74. * @param className 类名
  75. */
  76. function removeDOMClass(domSelector, className){
  77. getDOM(domSelector).classList.remove(className);
  78. }
  79.  
  80. /**
  81. * 获取单个DOM
  82. * @param domSelector DOM选择器
  83. * @returns DOM
  84. */
  85. function getDOM(domSelector, retryTime) {
  86. return document.querySelector(domSelector);
  87. }
  88.  
  89. /**
  90. * 获取多个DOM
  91. * @param domSelector DOM选择器
  92. * @returns DOMs
  93. */
  94. function getDOMs(domSelector) {
  95. return document.querySelectorAll(domSelector);
  96. }
  97.  
  98. /**
  99. * 删除多个DOM
  100. * @param domSelector DOM选择器
  101. */
  102. function deleteDOMs(domSelector) {
  103. $.each(getDOMs(domSelector), function(i, r){
  104. r.remove();
  105. });
  106. }
  107.  
  108. /**
  109. * 移动DOM
  110. * @param srcDomSelector 来源DOM选择器
  111. * @param dstDomSelector 目标DOM选择器
  112. */
  113. function moveBeforeDOM(srcDomSelector, dstDomSelector) {
  114. const srcDom = getDOM(srcDomSelector);
  115. const dstDom = getDOM(dstDomSelector);
  116. if(srcDom != null && dstDom != null) {
  117. dstDom.before(srcDom);
  118. }
  119. }
  120.  
  121. var eyeComfort = GM_getValue('eyeComfort', false);
  122. function toggleEyeComfort(isOn) {
  123. removeDOMClass('html', 'eyecomfort-on');
  124. removeDOMClass('html', 'eyecomfort-off');
  125. if(isOn){
  126. addDOMClass('html', 'eyecomfort-on');
  127. }else{
  128. addDOMClass('html', 'eyecomfort-off');
  129. }
  130. eyeComfort = isOn;
  131. GM_setValue('eyeComfort', eyeComfort);
  132. }
  133.  
  134. var commentShow = GM_getValue('commentShow', true);
  135. function showComment(isShow) {
  136. removeDOMClass('#commentSideBoxshadow', 'comment-hide');
  137. removeDOMClass('#commentSideBoxshadow', 'comment-show');
  138. removeDOMClass('main', 'comment-hide');
  139. removeDOMClass('main', 'comment-show');
  140. if(isShow){
  141. addDOMClass('#commentSideBoxshadow', 'comment-show');
  142. addDOMClass('main', 'comment-show');
  143. }else{
  144. addDOMClass('#commentSideBoxshadow', 'comment-hide');
  145. addDOMClass('main', 'comment-hide');
  146. }
  147. commentShow = isShow;
  148. GM_setValue('commentShow', commentShow);
  149. }
  150.  
  151. var directoryShow = GM_getValue('directoryShow', false);
  152. function showDirectory(isShow) {
  153. removeDOMClass('#rightAside', 'directory-hide');
  154. removeDOMClass('#rightAside', 'directory-show');
  155. removeDOMClass('#mainBox', 'directory-hide');
  156. removeDOMClass('#mainBox', 'directory-show');
  157. if(isShow){
  158. addDOMClass('#rightAside', 'directory-show');
  159. addDOMClass('#mainBox', 'directory-show');
  160. }else{
  161. addDOMClass('#rightAside', 'directory-hide');
  162. addDOMClass('#mainBox', 'directory-hide');
  163. }
  164. directoryShow = isShow;
  165. GM_setValue('directoryShow', directoryShow);
  166. }
  167.  
  168. /**
  169. * 目录定位功能修正
  170. */
  171. function fixDirectoryJump() {
  172. let directory = getDOMs('#groupfile a, #groupfileConcision a, #content_views a[target=_self]');
  173. $.each(directory, function(i, r){
  174. r.onclick = function() {
  175. if(!!getDOM('[name="'+r.getAttribute('href').replace('#', '')+'"], [id="'+r.getAttribute('href').replace('#', '')+'"]')) {
  176. getDOM('[name="'+r.getAttribute('href').replace('#', '')+'"], [id="'+r.getAttribute('href').replace('#', '')+'"]').scrollIntoView()
  177. }
  178. }
  179. })
  180. }
  181.  
  182. /**
  183. * 置顶功能修正
  184. */
  185. function fixGoTop() {
  186. getDOM('main').onscroll = function(){
  187. let scrollTop = this.scrollTop || document.body.scrollTop;
  188. if(scrollTop <= 200) {
  189. addDOMClass('.csdn-side-toolbar > [data-type="gotop"]', 'go-top-hide')
  190. }
  191. if(scrollTop > 200) {
  192. removeDOMClass('.csdn-side-toolbar > [data-type="gotop"]', 'go-top-hide')
  193. getDOM('.csdn-side-toolbar > [data-type="gotop"]').onclick = function(){
  194. getDOM('main').scrollTo({
  195. left: 0,
  196. top: 0,
  197. behavior: 'smooth'
  198. });
  199. }
  200. }
  201. }
  202. }
  203.  
  204. /**
  205. * 复制代码(免登录)
  206. */
  207. function copyCodeUnlogin() {
  208. const codeFrame = getDOMs('code');
  209. $.each(codeFrame, function(i, r){
  210. r.onclick = function(){
  211. mdcp.copyCode(event)
  212. };
  213. });
  214. const codeCopyBtn = getDOMs('.hljs-button.signin');
  215. if(codeCopyBtn.length > 0) {
  216. $.each(codeCopyBtn, function(i, r){
  217. r.setAttribute('data-title', '复制');
  218. r.onclick = function(){
  219. hljs.copyCode(event)
  220. };
  221. });
  222. const observer = new MutationObserver(function(e){
  223. $.each(e, function(i, r){
  224. if(r.target.getAttribute('data-title') == '登录后复制') {
  225. r.target.setAttribute('data-title', '复制');
  226. }
  227. });
  228. });
  229. observer.observe(getDOM('.hljs-button.signin'), {
  230. attributes: true,
  231. });
  232. }
  233. }
  234.  
  235. function htmlUnEscape(str) { //反转义
  236. var unescapes = {
  237. '&amp;': '&',
  238. '&lt;': '<',
  239. '&gt;': '>',
  240. '&quot;': '"',
  241. '&#39;': "'"
  242. },
  243. reEscapedHtml = new RegExp(/&(?:amp|lt|gt|quot|#39);/g);
  244. return (str && reEscapedHtml.test(str)) ? str.replace(reEscapedHtml, function(entity) {
  245. return unescapes[entity];
  246. }) : (str || '')
  247. }
  248.  
  249. function readComment(commentContent) {
  250. // 转换评论中的表情包
  251. var faceStart = 0, faceTypes = new Set();
  252. do{
  253. faceStart = commentContent.indexOf('[face]', faceStart);
  254. if(faceStart > -1) {
  255. faceTypes.add(commentContent.substring(faceStart + 6, commentContent.indexOf(':', faceStart)));
  256. faceStart++;
  257. }
  258. }while(faceStart > -1);
  259. faceTypes.forEach(function(r) {
  260. commentContent = commentContent.replaceAll('[face]' + r + ':', '<img src="//g.csdnimg.cn/static/face/' + r + '/');
  261. });
  262. commentContent = commentContent.replaceAll('[/face]', '" alt="表情包">');
  263.  
  264. // 转换评论中的代码块
  265. if(commentContent.indexOf('[code=') > -1 && commentContent.indexOf('[/code]') > -1){
  266. const textBeforeCode = commentContent.substring(0, commentContent.indexOf('[code='));
  267. const textAfterCode = commentContent.substring(commentContent.indexOf('[/code]') + 7);
  268. try{
  269. const codeLang = commentContent.substring(commentContent.indexOf('=') + 1, commentContent.indexOf(']'));
  270. var codeLangTrue = codeLang;
  271. commentContent = commentContent.substring(commentContent.indexOf(']') + 1, commentContent.lastIndexOf('['));
  272. commentContent = commentContent.trim();
  273. var hlCode;
  274. if(hljs.getLanguage(codeLang) == undefined) {
  275. hlCode = hljs.highlightAuto($('<div>').html(commentContent).text());
  276. codeLangTrue = hlCode.language;
  277. }else{
  278. hlCode = hljs.highlight($('<div>').html(commentContent).text(), {language: codeLangTrue});
  279. }
  280. commentContent = hlCode.value;
  281. var codeByLine = commentContent.split('\n');
  282. var codeLines = "";
  283. if(commentContent !== "") {
  284. codeLines += '<pre name="code2" class="'+codeLang+' hljs language-'+codeLangTrue+'"><ol class="hljs-ln" style="width:100%">';
  285. $.each(codeByLine, function(i, r){
  286. codeLines += '<li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="'+(i+1)+'"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">'+r+'</div></div></li>';
  287. });
  288. codeLines += '</ol></pre>';
  289. }
  290. commentContent = textBeforeCode + codeLines + textAfterCode;
  291. } catch(err){}
  292. }
  293. commentContent = commentContent.replaceAll("\n","<br>");
  294. commentContent = replaceUrlWithHyperLink(commentContent);
  295. return commentContent;
  296. }
  297.  
  298. function replaceUrlWithHyperLink(str){
  299. var re = /(f|ht){1}(tp|tps):\/\/([\w-]+\.)+[\w-]+(\/[\w-./?%&=]*)?/g;
  300. str = str.replace(re, function(website){
  301. return "<a class='comment-match-url' href='" + website +"' target='_blank'>" + website + "</a>";
  302. });
  303. return str;
  304. };
  305.  
  306. /**
  307. * 加载评论(免登录)
  308. */
  309. function loadCommentUnlogin() {
  310. if(getCookie('UserName') == null){
  311. $.ajax({
  312. url: 'https://blog.csdn.net/phoenix/web/v1/comment/list/'+articleId+'?page=0&size=3000',
  313. type: "POST",
  314. success: function (data) {
  315. let commentCustom = getDOM('#pcCommentSideBox').innerHTML + `<div class="comment-list-container"><div class="comment-list-box">`;
  316. $.each(data.data.list.sort(function(a,b){
  317. return b.info.commentId - a.info.commentId;
  318. }), function(i, r){
  319. commentCustom = `${commentCustom}<ul class="comment-list">` +
  320. `<li class="comment-line-box">` +
  321. `<div class="comment-list-item">` +
  322. `<a class="comment-list-href" target="_blank" href="https://blog.csdn.net/${r.info.userName}">` +
  323. `<img src="${r.info.avatar}" username="${r.info.userName}" alt="${r.info.userName}" class="avatar">` +
  324. `</a>` +
  325. `<div class="right-box">` +
  326. `<div class="new-info-box clearfix">` +
  327. `<div class="comment-top">` +
  328. `<div class="user-box">` +
  329. `<a class="name-href" target="_blank" href="https://blog.csdn.net/${r.info.userName}">` +
  330. `<span class="name ">${r.info.nickName}</span>` +
  331. `</a>` +
  332. `<span class="date" title="${r.info.postTime}">${r.info.dateFormat}</span>` +
  333. `</div>` +
  334. `</div>` +
  335. `<div class="comment-center">` +
  336. `<div class="new-comment">${readComment(r.info.content)}</div>` +
  337. `</div>` +
  338. `</div>` +
  339. `</div>` +
  340. `</div>` +
  341. `</li>` +
  342. `<li class="replay-box" style="display:block"><ul class="comment-list">`;
  343. $.each(r.sub, function(i1, r1){
  344. commentCustom = `${commentCustom}<li class="comment-line-box">` +
  345. `<div class="comment-list-item">` +
  346. `<a class="comment-list-href" target="_blank" href="https://blog.csdn.net/${r1.userName}">` +
  347. `<img src="${r1.avatar}" username="${r1.userName}" alt="${r1.userName}" class="avatar">` +
  348. `</a>` +
  349. `<div class="right-box">` +
  350. `<div class="new-info-box clearfix">` +
  351. `<div class="comment-top">` +
  352. `<div class="user-box">` +
  353. `<a class="name-href" target="_blank" href="https://blog.csdn.net/${r1.userName}">` +
  354. `<span class="name ">${r1.nickName}</span>` +
  355. (r1.userName === blog_address.split("/")[3] ? `<span class="is_bloger comment_status_tip">作者</span>` : ``) +
  356. `</a>` +
  357. `<span class="text">回复</span>` +
  358. `<span class="nick-name">${r1.parentNickName}</span>` +
  359. `<span class="date" title="${r1.postTime}">${r1.dateFormat}</span>` +
  360. `</div>` +
  361. `</div>` +
  362. `<div class="comment-center">` +
  363. `<div class="new-comment">${readComment(r1.content.indexOf("[/reply]") > -1 ? (r1.content.indexOf("[/reply]\n") > -1 ? r1.content.substring(r1.content.indexOf("[/reply]\n") + 9) : r1.content.substring(r1.content.indexOf("[/reply]") + 8)) : r1.content)}</div>` +
  364. `</div>` +
  365. `</div>` +
  366. `</div>` +
  367. `</div>` +
  368. `</li>`;
  369. });
  370. commentCustom = `${commentCustom}</ul></li></ul>`;
  371. });
  372. commentCustom = `${commentCustom}</div></div>`;
  373. getDOM('#pcCommentSideBox').innerHTML = commentCustom;
  374. getDOM('#pcCommentSideBox').style.display = 'block';
  375. removeDOMClass('#pcCommentSideBox', 'unlogin-comment-box-new');
  376. }
  377. });
  378. }
  379. }
  380.  
  381. /**
  382. * 暗色主题去除
  383. */
  384. function removeDarkTheme() {
  385. const darkToolbarCss = getDOM('link[href*="csdn-toolbar-dark"]');
  386. if(darkToolbarCss){
  387. darkToolbarCss.href = darkToolbarCss.href.replace('dark', 'default')
  388. }
  389. const darkSkinCss = getDOMs('link[href*="skin-black"], link[href*="skin-clickmove"], link[href*="skin-years"]');
  390. $.each(darkSkinCss, function(i, r){
  391. r.href = ""
  392. });
  393. const darkLogo = getDOM('img[title="CSDN首页"]');
  394. if(darkLogo){
  395. darkLogo.src="https://img-home.csdnimg.cn/images/20201124032511.png"
  396. }
  397. modifyDOM('body', 'background-color:#f5f6f7 !important; background-image:none !important;');
  398. }
  399.  
  400.  
  401. /**
  402. * 添加护眼开关
  403. */
  404. function addEyeComfortToggleButton() {
  405. const eyeComfortOnButton = generateSideToolBarElement('cuz-eyecomfort-on', commentShow ? 'display: flex' : 'display: none', null, '打开', '护眼');
  406. const eyeComfortOffButton = generateSideToolBarElement('cuz-eyecomfort-off', !commentShow ? 'display: flex' : 'display: none', null, '关闭', '护眼');
  407. eyeComfortOnButton.onclick = function(){
  408. toggleEyeComfort(true);
  409. eyeComfortOnButton.style = 'display: none';
  410. eyeComfortOffButton.style = 'display: flex';
  411. }
  412. eyeComfortOffButton.onclick = function(){
  413. toggleEyeComfort(false);
  414. eyeComfortOnButton.style = 'display: flex';
  415. eyeComfortOffButton.style = 'display: none';
  416. }
  417. getDOM('.csdn-side-toolbar').prepend(eyeComfortOnButton);
  418. getDOM('.csdn-side-toolbar').prepend(eyeComfortOffButton);
  419. }
  420.  
  421. /**
  422. * 添加评论区开关
  423. */
  424. function addCommentToggleButton() {
  425. const commentHideButton = generateSideToolBarElement('cuz-comment-hide', commentShow ? 'display: flex' : 'display: none', null, '隐藏', '评论');
  426. const commentShowButton = generateSideToolBarElement('cuz-comment-show', !commentShow ? 'display: flex' : 'display: none', null, '显示', '评论');
  427. commentHideButton.onclick = function(){
  428. showComment(false);
  429. commentHideButton.style = 'display: none';
  430. commentShowButton.style = 'display: flex';
  431. }
  432. commentShowButton.onclick = function(){
  433. showComment(true);
  434. commentHideButton.style = 'display: flex';
  435. commentShowButton.style = 'display: none';
  436. }
  437. getDOM('.csdn-side-toolbar').prepend(commentHideButton);
  438. getDOM('.csdn-side-toolbar').prepend(commentShowButton);
  439. }
  440.  
  441. /**
  442. * 添加目录开关
  443. */
  444. function addDirectoryToggleButton() {
  445. const directoryHideButton = generateSideToolBarElement('cuz-directory-hide', directoryShow ? 'display: flex' : 'display: none', null, '隐藏', '目录');
  446. const directoryShowButton = generateSideToolBarElement('cuz-directory-show', !directoryShow ? 'display: flex' : 'display: none', null, '显示', '目录');
  447. directoryHideButton.onclick = function(){
  448. showDirectory(false);
  449. directoryHideButton.style = 'display: none';
  450. directoryShowButton.style = 'display: flex';
  451. }
  452. directoryShowButton.onclick = function(){
  453. showDirectory(true);
  454. directoryHideButton.style = 'display: flex';
  455. directoryShowButton.style = 'display: none';
  456. }
  457. getDOM('.csdn-side-toolbar').prepend(directoryHideButton);
  458. getDOM('.csdn-side-toolbar').prepend(directoryShowButton);
  459. }
  460.  
  461. (
  462. function() {
  463. // 广告
  464. hideDOM('#kp_box_www_swiper_ban, .blog-slide-ad-box, .Community > .active-blog > .blog-banner');
  465.  
  466. hideDOM('.ad_fullWidth.www-banner-top, .toolbar-advert');
  467.  
  468. // 主题处理
  469. modifyDOM('.toolbar-inside', 'background: #fff !important');
  470. modifyDOM('body', 'background-color:#f5f6f7 !important; background-image:none !important;');
  471. // 隐藏左信息
  472. hideDOM('.blog_container_aside');
  473. // 调整右侧信息, 保留目录
  474. modifyDOM('#rightAside', 'display: block;');
  475. hideDOM('.programmer1Box, #recommendAdBox, #asideArchive, #recommend-right > .kind_person, #rightAsideConcision');
  476. modifyDOM('#groupfile', 'height: 100% !important; max-height: unset !important; margin-bottom: 0 !important;');
  477. modifyDOM('#groupfile>.groupfile-div', 'height: calc(100vh - 68px) !important; max-height: unset !important;');
  478. // 隐藏相关推荐
  479. hideDOM('.recommend-box, #recommendNps, .template-box');
  480. // 隐藏底部
  481. hideDOM('.blog-footer-bottom');
  482. // 隐藏文章工具栏
  483. hideDOM('#toolBarBox');
  484.  
  485. // 文章主体样式调整
  486. modifyDOM('.main_father', 'height: auto !important; overflow: hidden !important;')
  487. modifyDOM('#mainBox', 'height: calc(100vh - 68px) !important; width: calc(100vw - 300px); margin-left: 0 !important;')
  488. modifyDOM('main', 'width: 70% !important; height: 100% !important; overflow: auto !important; float: right')
  489. modifyDOM('.blog-content-box', 'padding-bottom: 60px !important;')
  490. modifyDOM('#article_content', 'height: unset !important; overflow: auto !important;');
  491. hideDOM('.hide-article-box');
  492.  
  493. // 调整右侧工具位置, 隐藏部分按钮
  494. modifyDOM('.csdn-side-toolbar', 'left: unset !important;')
  495. modifyDOM('.csdn-side-toolbar .tip-box,.csdn-side-toolbar > [data-type="guide"],.csdn-side-toolbar > [data-type="cs"],.csdn-side-toolbar > [data-type="report"],.csdn-side-toolbar > [data-type="search"],.csdn-side-toolbar > .directory,.csdn-side-toolbar > .sidecolumn', 'display: none !important;')
  496.  
  497. // 代码块超长自动展开所有
  498. hideDOM('.hide-preCode-box');
  499. modifyDOM('.set-code-hide', 'height: unset !important;max-height: unset !important;');
  500.  
  501. // 评论区
  502. hideDOM('#pcCommentBox, .comment-side-tit-close', '.passport-login-tip-container');
  503. modifyDOM('#commentSideBoxshadow', 'width: 29.5% !important; display:block !important; background: unset !important; position: relative !important; float: left');
  504. modifyDOM('.comment-side-content', 'width:100% !important;');
  505. modifyDOM('#pcCommentSideBox, #pcFlodCommentSideBox', 'height: auto !important; overflow-y: auto !important;');
  506.  
  507. // 免登录代码框鼠标可选
  508. modifyDOM('code', 'user-select: text !important;');
  509.  
  510. document.addEventListener('DOMContentLoaded',function(e){
  511. // 去除谷歌相关广告
  512. deleteDOMs('script[src*=google],link[href*=google],.adsbygoogle');
  513. fixDirectoryJump();
  514. fixGoTop();
  515. // 评论区DOM位置调整
  516. moveBeforeDOM('#commentSideBoxshadow', 'main');
  517. showComment(commentShow);
  518. showDirectory(directoryShow);
  519. loadCommentUnlogin();
  520.  
  521. removeDarkTheme();$("#content_views").unbind("keydown");
  522. $("#content_views").unbind("copy")
  523. removeDOM('.passport-login-container');
  524. })
  525. window.onload = function(){
  526. fixDirectoryJump();
  527. copyCodeUnlogin();
  528. addCommentToggleButton();
  529. addDirectoryToggleButton();
  530. addEyeComfortToggleButton();
  531. $("#content_views").off('click','a')
  532. $("#content_views").find("a").click(function(e){if(this.href&&"_self"!==this.target){e.preventDefault();var t=window.open(this.href,"_blank");t.focus()}})
  533. $("#content_views").unbind("keydown");
  534. $("#content_views").unbind("copy")
  535. }
  536.  
  537. }
  538. )();