// ==UserScript== // @name check the links is visitable or not // @author burningall // @description 检查超链接是否有效 // @version 2015.8.22 // @include * // @grant GM_registerMenuCommand // @grant GM_xmlhttpRequest // @run-at document-start // @compatible chrome 推荐 // @compatible firefox 不推荐 // @license The MIT License (MIT); http://opensource.org/licenses/MIT // @supportURL http://www.burningall.com // @contributionURL troy450409405@gmail.com|alipay.com // @namespace https://greasyfork.org/zh-CN/users/3400-axetroy // @downloadURL none // ==/UserScript== (function(document){ var config = { "autoLoad":true,//脚本开始加载,是否自动ajax。(不建议为true,大量ajax会影响性能,甚至假死) "rules": /[a-zA-z]+:\/\/[^\s]*/img }; function Ob(target,config,fn){ var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; var observer = new MutationObserver(function(mutations){ mutations.forEach(function(mutation) { fn.call(target); }); }); observer.observe(target, config); } function addEvent(obj, type, fn){ return obj.addEventListener ? obj.addEventListener(type, function(e){ var ev = window.event ? window.event : (e ? e : null); if( fn.call(obj,ev)===false ){ e.cancelBubble = true;//阻止冒泡 e.preventDefault();//chrome,firefox下阻止默认事件 } }, false) : obj.attachEvent('on' + type, function(e){ ev.target = ev.target || ev.srcElement; if(fn.call(obj,ev)===false ){ e.cancelBubble = true;//阻止冒泡 return false;//阻止默认事件,针对IE8 } }); } function visible(obj) { var pos = obj.getBoundingClientRect(); if (document.documentElement.getBoundingClientRect) { var w = document.documentElement.clientWidth; var h = document.documentElement.clientHeight; var jugg = pos.top > h || pos.bottom < 0 || pos.left > w || pos.right < 0; if (jugg === true) { //不可视 return false; } else { //可视 return true; } } } function check(urlLink,a,secFn,failFn){ a.setAttribute("checking",true); GM_xmlhttpRequest({ method: "GET", url: urlLink, onerror: function(response ){ failFn(a); }, onreadystatechange:function(response){ if(response.readyState==4){ var status = response.status+''; if( status.charAt(0)=="4" || status.charAt(0)=="5" ){//4XX,5XX错误 failFn(a); }else{ secFn(a); } } } }); } function init(){ /** * 不考虑: * || * */ var link = document.querySelectorAll('a[href]:not([href^="javascript"]):not([href$="#"]):not([checking]):not([visited])'); var inViewPort = []; var a; for(var i=0;i300 ){ return; } for( var j=0;j