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; }
みたいに書いておくと、コンソールで書いたままスクリプトにできて便利。