読者です 読者をやめる 読者になる 読者になる

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

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

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

Greasemonkeyから安全にconsole.logを利用する

console.logを使う時は、unsafeWindow.console.log.apply(unsafeWindow.console, arguments);みたいにしたり、
location.href = "javascript:console.log(" + Array.map(arguments, uneval).join() + ")";みたいにすることが多い。
だけど、前者は安全ではないし、後者はプリミティブ値しか渡せない。
なので、下のようなコードをはじめに書いておくと、(たぶん)安全にconsole.logを利用することができる。

var console = {
  _defined: false,
  log: function(object) {
    if (!console._defined) {
      console._defined = true;
      location.href = "javascript:" + uneval(function() {
        document.addEventListener("consoleData",
        function(event) {
          console.log.apply(this, event.getData("object"));
        },
        false);
      }) + "()";
    }
    setTimeout(send, 100, arguments);
    function send(object) {
      var event = document.createEvent("DataContainerEvent");
      event.initEvent("consoleData", true, false);
      event.setData("object", object);
      document.dispatchEvent(event);
    }
  }
};

console.log(0, 1, 2, 3, 4);
console.log(document.body);
console.log(Array.slice(document.links));

他に、

// like Firebug API
function $(id) document.getElementById(id);
function $$(selector) Array.slice(document.querySelectorAll(selector));
function $x(xpath) {
  var xp = document.evaluate(
    xpath,
    document,
    null,
    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
    null),
  r = [];
  for (var i = 0;i < xp.snapshotLength;i++)
    r.push(xp.snapshotItem(i));
  return r;
}

みたいに書いておくと、コンソールで書いたままスクリプトにできて便利。