素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

AutoPagerizeのFORCE_TARGET_WINDOWをXPathだけでやる

descendant-or-self::a[@href and not(starts-with(@href,"#") or starts-with(@href,"javascript:") or contains (@class,"autopagerize_link"))]は、AutoPagerizeのそれと同じ動きをする。たぶん、for文で回しながらフィルターにかけるより軽いんじゃないかと思う。

下のスクリプトはAutoPageLoader用。

// ==UserScript==
// @name           forceTargetWindow
// @namespace      http://d.hatena.ne.jp/javascripter/
// @include        http*
// ==/UserScript==

function setTargetBlank (doc) {
  var xpath = 'descendant-or-self::a[@href and not(starts-with(@href,"#") or starts-with(@href,"javascript:"))]',
      xr = document.evaluate(xpath,
                             doc,
                             null,
                             XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
                             null);
  for (var i = 0;i < xr.snapshotLength;i++)
    xr.snapshotItem(i).target = '_blank';
}

window.AutoPagerize &&
  window.AutoPagerize.addFilter(function (docs) {
    docs.forEach(setTargetBlank);
  });