一部の DOM API 関数の呼び出しをインターセプトし、それらの引数を副作用として保存する必要があります。たとえば、関数getElementsByTagName
とに興味があるとしgetElementById
ます。以下の例を参照してください。
"use strict";
const jsdom = require("jsdom");
let document = jsdom.jsdom("<html><head></head><body><div id='foo'><div></div></div></body></html>");
let cpool = {ids: [], tags: []};
let obj = document.getElementById("foo");
// --> cpool = {ids: ["foo"], tags: []}
obj.getElementsByTagName("div");
// --> cpool = {ids: ["foo"], tags: ["div"]}
1 つの重要な注意点は、私はnode.jsを使用しており、document
オブジェクトはjsdomライブラリによって実装されているということです。これまでのところ、ES6 Proxies を利用して、前述の DOM 関数の動作を変更しようとしました。
これが、すべてのメソッド呼び出しをトラップするためにドキュメントオブジェクトをプロキシしようとした方法です。この手法または他の手法を使用して、問題を解決できるかどうか、またどのように使用できるか疑問に思います。
let documentProxy = new Proxy(document, {
get(target, propKey, receiver) {
return function (...args) {
Reflect.apply(target, propKey, args);
console.log(propKey + JSON.stringify(args));
return result;
};
}
});
documentProxy.getElementById("foo");
// --> getElementById["foo"]