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

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

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

分割代入とfor eachとAutoPagerize

ページが見つかりません | Mozilla Developer Networkを使うと、for eachでオブジェクトから必要なものだけを取り出せる。

たとえば、AutoPagerizeのjsonからlocation.hrefにマッチするものを取り出すというのが簡潔に書ける。
下のGreasemokeyスクリプトでは、Firebugのconsoleに表示する。

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

(function(){

var SITEINFO_URLS=[
'http://wedata.net/databases/AutoPagerize/items.json'
];


function getCache(callback){
  var cache=GM_getValue('cache');
  if(cache){
    callback(eval(cache));
  }else{
    setCache(callback);
  }
}
function setCache(callback){
  var siteinfos=[];
  SITEINFO_URLS.forEach(
      function(url,i,arry){
        GM_xmlhttpRequest({
          method:'GET',
          url:url,
          onload:function(res){
            siteinfos.push( eval(res.responseText) );
            if(siteinfos.length==arry.length){
              GM_setValue('cache',uneval(siteinfos));
              callback(siteinfos);
            }
          }
        });
      });
}

function getMatchedSiteinfo(callback){
  getCache(function(siteinfos){
    var data=null;
    siteinfos.some(
      function(siteinfo){
        for each(var {data:{nextLink:nextLink,url:url,pageElement:pageElement}} in siteinfo){
          if(
            RegExp(url).test(location.href)
            &&
            document.evaluate(nextLink,document,null,XPathResult.BOOLEAN_TYPE,null).booleanValue
            &&
            document.evaluate(pageElement,document,null,XPathResult.BOOLEAN_TYPE,null).booleanValue
            ){
            data={nextLink:nextLink,url:url,pageElement:pageElement};
            return true;
          }
        }
        return false;
      });
    callback(data);
  });
}

getMatchedSiteinfo(function(data){unsafeWindow.console.log(data)});
})();

ちなみに上のソースは、AutoPagerizeを自作しようと思って挫折した残骸。