remove the jump link in BAIDU (ECMA6)

去除百度搜索跳转链接

目前為 2016-04-10 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
// ==UserScript==
// @name              remove the jump link in BAIDU (ECMA6)
// @author            axetroy
// @description       去除百度搜索跳转链接
// @version           2016.4.11
// @grant             GM_xmlhttpRequest
// @grant             GM_addStyle
// @include           *www.baidu.com*
// @connect           tags
// @connect           *
// @compatible        chrome  完美运行
// @compatible        firefox  完美运行
// @supportURL        http://www.burningall.com
// @run-at            document-start
// @contributionURL   [email protected]|alipay.com
// @namespace         https://greasyfork.org/zh-CN/users/3400-axetroy
// @license           The MIT License (MIT); http://opensource.org/licenses/MIT
// ==/UserScript==

/* jshint ignore:start */
'use strict';

(function () {

  'use strict';

  var $ = require('./libs/jqLite');

  var init = require('./src/init');

  var observe = require('./src/observe');

  var mouseover = require('./src/mouseover');

  var scroll = require('./src/scroll');

  $(function () {

    // init
    init();

    // observe the document
    observe();

    // when mouse over on a A Tag and request
    mouseover();

    // scroll and request
    scroll();
  });

  console.info('去跳转启动...');
})();

/* jshint ignore:end */

},{"./libs/jqLite":4,"./src/init":6,"./src/mouseover":8,"./src/observe":9,"./src/scroll":10}],2:[function(require,module,exports){
/**
 * http service
 * @param ops
 * @returns {Promise}
 */

'use strict';

var $q = require('./$q');
var $ = require('./jqLite');

var $http = function $http() {
  var ops = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];

  var deferred = $q.defer();

  var onreadystatechange = function onreadystatechange(response) {
    if (response.readyState !== 4) return;
    response.requestUrl = ops.url;
    if (/^(2|3)/.test(response.status) || response.finalUrl) {
      deferred.resolve(response);
    } else {
      deferred.reject(response);
    }
  };

  var ontimeout = function ontimeout(response) {
    response.requestUrl = ops.url;
    response && response.finalUrl ? deferred.resolve(response) : deferred.reject(response);
  };

  var onerror = function onerror(response) {
    response.requestUrl = ops.url;
    response && response.finalUrl ? deferred.resolve(response) : deferred.reject(response);
  };

  ops = $.fn.merge({
    onreadystatechange: onreadystatechange,
    ontimeout: ontimeout,
    onerror: onerror
  }, ops);

  // make the protocol agree
  if (!new RegExp('^' + window.location.protocol).test(ops.url)) {
    ops.url = ops.url.replace(/^(http|https):/im, window.location.protocol);
  }

  GM_xmlhttpRequest(ops);
  return deferred.promise;
};

['HEAD', 'GET', 'POST'].forEach(function (method) {
  $http[method.toLocaleLowerCase()] = function (url) {
    var ops = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];

    var deferred = $q.defer();
    ops = $.fn.merge(ops, { url: url, method: method });
    $http(ops).then(function (response) {
      deferred.resolve(response);
    }, function (response) {
      deferred.reject(response);
    });
    return deferred.promise;
  };
});

module.exports = $http;

},{"./$q":3,"./jqLite":4}],3:[function(require,module,exports){

'use strict';

/**
 * simple deferred object like angularJS $q or q promise library
 * @param fn                 promise function
 * @returns {Promise}
 */
var $q = function $q() {
  var fn = arguments.length <= 0 || arguments[0] === undefined ? noop : arguments[0];

  return new Promise(fn);
};

/**
 * generator a deferred object use like angularJS's $q service
 * @returns {{}}
 */
$q.defer = function () {
  var deferred = {};

  deferred.promise = new Promise(function (resolve, reject) {
    deferred.resolve = function (response) {
      resolve(response);
    };
    deferred.reject = function (response) {
      reject(response);
    };
  });

  return deferred;
};

$q.resolve = function (response) {
  return $q(function (resolve, reject) {
    resolve(response);
  });
};

$q.reject = function (response) {
  return $q(function (resolve, reject) {
    reject(response);
  });
};

module.exports = $q;

},{}],4:[function(require,module,exports){

'use strict';

var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }

var noop = function noop(x) {
  return x;
};

var jqLite = (function () {
  function jqLite() {
    var _this = this;

    var selectors = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];
    var context = arguments.length <= 1 || arguments[1] === undefined ? document : arguments[1];

    _classCallCheck(this, jqLite);

    this.selectors = selectors;
    this.context = context;
    this.length = 0;

    switch (typeof selectors) {
      case 'undefined':
        break;
      case 'string':
        Array.from(context.querySelectorAll(selectors), function (ele, i) {
          _this[i] = ele;
          _this.length++;
        }, this);
        break;
      case 'object':
        if (selectors.length) {
          Array.from(selectors, function (ele, i) {
            _this[i] = ele;
            _this.length++;
          }, this);
        } else {
          this[0] = selectors;
          this.length = 1;
        }
        break;
      case 'function':
        this.ready(selectors);
        break;
      default:

    }
  }

  jqLite.prototype.each = function each() {
    var fn = arguments.length <= 0 || arguments[0] === undefined ? noop : arguments[0];

    for (var i = 0; i < this.length; i++) {
      fn.call(this, this[i], i);
    }
    return this;
  };

  jqLite.prototype.bind = function bind() {
    var types = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];
    var fn = arguments.length <= 1 || arguments[1] === undefined ? noop : arguments[1];

    this.each(function (ele) {
      types.trim().split(/\s{1,}/).forEach(function (type) {
        ele.addEventListener(type, function (e) {
          var target = e.target || e.srcElement;
          if (fn.call(target, e) === false) {
            e.returnValue = true;
            e.cancelBubble = true;
            e.preventDefault && e.preventDefault();
            e.stopPropagation && e.stopPropagation();
            return false;
          }
        }, false);
      });
    });
  };

  jqLite.prototype.ready = function ready() {
    var _this2 = this;

    var fn = arguments.length <= 0 || arguments[0] === undefined ? noop : arguments[0];

    this.context.addEventListener('DOMContentLoaded', function (e) {
      fn.call(_this2);
    }, false);
  };

  jqLite.prototype.observe = function observe() {
    var _this3 = this;

    var fn = arguments.length <= 0 || arguments[0] === undefined ? noop : arguments[0];
    var config = arguments.length <= 1 || arguments[1] === undefined ? { childList: true, subtree: true } : arguments[1];

    this.each(function (ele) {
      var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
      var observer = new MutationObserver(function (mutations) {
        mutations.forEach(function (mutation) {
          fn.call(_this3, mutation.target, mutation.addedNodes, mutation.removedNodes);
        });
      });
      observer.observe(ele, config);
    });
    return this;
  };

  jqLite.prototype.attr = function attr(_attr, value) {
    // one agm
    if (arguments.length === 1) {
      // get attr value
      if (typeof _attr === 'string') {
        return this[0].getAttribute(_attr);
      }
      // set attr with a json
      else if (typeof _attr === 'object') {
          this.each(function (ele) {
            for (var at in _attr) {
              if (_attr.hasOwnProperty(at)) {
                ele.setAttribute(at, value);
              }
            }
          });
          return value;
        }
    }
    // set
    else if (arguments.length === 2) {
        this.each(function (ele) {
          ele.setAttribute(_attr, value);
        });
        return this;
      } else {
        return this;
      }
  };

  jqLite.prototype.removeAttr = function removeAttr(attr) {
    if (arguments.length === 1) {
      this.each(function (ele) {
        ele.removeAttribute(attr);
      });
    }
    return this;
  };

  _createClass(jqLite, [{
    key: 'text',
    get: function get() {
      var ele = this[0];
      return ele.innerText ? ele.innerText : ele.textContent;
    }
  }], [{
    key: 'fn',
    get: function get() {
      var visible = function visible(ele) {
        var pos = ele.getBoundingClientRect();
        var w = undefined;
        var h = undefined;
        var inViewPort = undefined;
        var docEle = document.documentElement;
        var docBody = document.body;
        if (docEle.getBoundingClientRect) {
          w = docEle.clientWidth || docBody.clientWidth;
          h = docEle.clientHeight || docBody.clientHeight;
          inViewPort = pos.top > h || pos.bottom < 0 || pos.left > w || pos.right < 0;
          return inViewPort ? false : true;
        }
      };
      var debounce = function debounce(fn, delay) {
        var timer = undefined;
        return function () {
          var _this4 = this;

          var agm = arguments;
          window.clearTimeout(timer);
          timer = window.setTimeout(function () {
            fn.apply(_this4, agm);
          }, delay);
        };
      };
      var merge = function merge() {
        for (var _len = arguments.length, sources = Array(_len), _key = 0; _key < _len; _key++) {
          sources[_key] = arguments[_key];
        }

        return Object.assign.apply(Object, [{}].concat(sources));
      };
      return {
        visible: visible,
        debounce: debounce,
        merge: merge
      };
    }
  }]);

  return jqLite;
})();

var $ = function $() {
  var selectors = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];
  var context = arguments.length <= 1 || arguments[1] === undefined ? document : arguments[1];

  return new jqLite(selectors, context);
};
$.fn = jqLite.fn;

module.exports = $;

},{}],5:[function(require,module,exports){
// config
'use strict';

var config = {
  rules: '\n      a[href*="www.baidu.com/link?url"]\n      :not(.m)\n      :not([decoding])\n      :not([decoded])\n    '.trim().replace(/\n/img, '').replace(/\s{1,}([^a-zA-Z])/g, '$1'),
  debug: false,
  isDecodingAll: false
};

if (config.debug) {
  GM_addStyle('\n    a[decoded]{\n      background-color:green !important;\n      color:#303030 !important;\n    };\n    a[decoding]{\n      background-color:yellow !important;\n      color:#303030 !important;\n    }\n  ');
}

module.exports = config;

},{}],6:[function(require,module,exports){
'use strict';

var main = require('./main');
var $q = require('../libs/$q');
var config = require('./config');

var init = function init() {
  new main(config.rules).all().then(function () {
    return $q.resolve(true);
  }, function () {
    return $q.resolve(true);
  }).then(function () {
    new main(config.rules).oneByOne();
  });
};

module.exports = init;

},{"../libs/$q":3,"./config":5,"./main":7}],7:[function(require,module,exports){
/**
 * the main class to bootstrap this script
 */

'use strict';

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }

var config = require('./config');
var $ = require('./../libs/jqLite');
var $q = require('./../libs/$q');
var $http = require('./../libs/$http');

var main = (function () {
  function main() {
    var _this = this;

    var agm = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];

    _classCallCheck(this, main);

    if (!agm) return this;

    this.inViewPort = [];

    $(agm).each(function (ele) {
      return $.fn.visible(ele) && _this.inViewPort.push(ele);
    });
  }

  /**
   * request a url which has origin links
   * @returns {Promise}
   */

  main.prototype.all = function all() {
    var deferred = $q.defer();

    var url = window.top.location.href.replace(/(\&)(tn=\w+)(\&)/img, '$1' + 'tn=baidulocal' + '$3');

    config.isDecodingAll = true;

    $http.get(url, { timeout: 2000 }).then(function (response) {
      config.isDecodingAll = false;

      if (!response) return;
      var responseText = response.responseText;

      // remove the image/script/css resource
      responseText = responseText.replace(/(src=[^>]*|link=[^>])/g, '');

      var html = document.createElement('html');
      html.innerHTML = responseText;

      $('.t>a:not(.OP_LOG_LINK):not([decoded])').each(function (sourceEle) {
        $('.f>a', html).each(function (targetEle) {
          if ($(sourceEle).text === $(targetEle).text) {
            sourceEle.href = targetEle.href;
            $(sourceEle).attr('decoded', true);
          }
        });
      });

      deferred.resolve(response);
    }, function (response) {
      config.isDecodingAll = false;
      deferred.reject(response);
    });

    return deferred.promise;
  };

  main.prototype.one = function one(aEle) {
    var deferred = $q.defer();

    $(aEle).attr('decoding', true);

    $http.get(aEle.href, { timeout: 2000, anonymous: true }).then(function (response) {
      $(aEle).attr('href', response.finalUrl).attr('decoded', true).removeAttr('decoding');
      deferred.resolve(response);
    }, function (response) {
      $(aEle).removeAttr('decoding');
      deferred.reject(response);
    });

    return deferred.promise;
  };

  /**
   * request the A tag's href one by one those in view port
   * @returns {main}
   */

  main.prototype.oneByOne = function oneByOne() {
    var _this2 = this;

    $(this.inViewPort).each(function (aEle) {
      if (!main.match(aEle)) return;
      _this2.one(aEle);
    });
    return this;
  };

  /**
   * match the Element
   */

  main.match = function match(ele) {
    if (ele.tagName !== "A" || !ele.href || !/www\.baidu\.com\/link\?url=/im.test(ele.href) || !!$(ele).attr('decoded') || !!$(ele).attr('decoding')) {
      return false;
    } else {
      return true;
    }
  };

  return main;
})();

module.exports = main;

},{"./../libs/$http":2,"./../libs/$q":3,"./../libs/jqLite":4,"./config":5}],8:[function(require,module,exports){
/**
 * Created by axetroy on 16-4-10.
 */

'use strict';

var $ = require('../libs/jqLite');
var main = require('./main');

var mouseoverDebounce = $.fn.debounce(function (e) {
  var aEle = e.target;

  if (aEle.tagName !== "A" || !aEle.href || !/www\.baidu\.com\/link\?url=/im.test(aEle.href) || !!$(aEle).attr('decoded')) {
    return;
  }

  new main().one(aEle);
}, 100);

var mouseover = function mouseover() {
  return function () {
    $(document).bind('mouseover', function (e) {
      mouseoverDebounce(e);
    });
  };
};

module.exports = mouseover();

},{"../libs/jqLite":4,"./main":7}],9:[function(require,module,exports){
/**
 * Created by axetroy on 16-4-10.
 */

'use strict';

var $ = require('../libs/jqLite');
var main = require('./main');
var init = require('./init');
var config = require('./config');

var observe = function observe() {
  return function () {
    var observeDebounce = $.fn.debounce(function (target) {
      var addList = arguments.length <= 1 || arguments[1] === undefined ? [] : arguments[1];
      var removeList = arguments.length <= 2 || arguments[2] === undefined ? [] : arguments[2];

      if (!addList.length) return;

      config.isDecodingAll ? new main(config.rules).oneByOne() : init();
    }, 100);
    $(document).observe(function (target) {
      var addList = arguments.length <= 1 || arguments[1] === undefined ? [] : arguments[1];
      var removeList = arguments.length <= 2 || arguments[2] === undefined ? [] : arguments[2];

      observeDebounce(target, addList, removeList);
    });
  };
};

module.exports = observe();

},{"../libs/jqLite":4,"./config":5,"./init":6,"./main":7}],10:[function(require,module,exports){
/**
 * Created by axetroy on 16-4-10.
 */

'use strict';

var $ = require('../libs/jqLite');
var main = require('./main');
var config = require('./config');

var scroll = function scroll() {
  return function () {
    var scrollDebounce = $.fn.debounce(function () {
      new main(config.rules).oneByOne();
    }, 100);
    $(window).bind('scroll', function () {
      scrollDebounce();
    });
  };
};

module.exports = scroll();

},{"../libs/jqLite":4,"./config":5,"./main":7}]},{},[1]);