3

私は、Web サイトの完全な DOM へのアクセスとクロスドメインでサイトを開く機能の両方を本質的に必要とするサーバー側の JavaScript のビットとピースをいくつか実行していますが、少なくともこれまでのところ、PhantomJS はその仕事に最適なツールのようです。

ただし、 Object.watch() メソッドがありません。これはむしろ必要です。そのため、Stackoverflow の別の場所 ( https://gist.github.com/384583で入手可能) に回答として投稿されたシムを使用して、そのようなメソッドにアクセスできるようにしようとしています。

機能していません。

それはまた、私の JavaScript の理解レベルをはるかに超えているため、それが何をしているのか、なぜ機能していないのかを正確に理解するのを誰かが助けてくれるのではないかと思っています。

助けてくれてありがとう、

トビー

(以下に引用したコード:

// Cross-browser object.watch and object.unwatch

// object.watch
if (!Object.prototype.watch) {
    Object.prototype.watch = function (prop, handler) {
        var oldval = this[prop], newval = oldval,
        getter = function () {
            return newval;
        },
        setter = function (val) {
            oldval = newval;
            return newval = handler.call(this, prop, oldval, val);
        };
        if (delete this[prop]) { // can't watch constants
            if (Object.defineProperty) { // ECMAScript 5
                Object.defineProperty(this, prop, {
                    get: getter,
                    set: setter,
                    enumerable: true,
                    configurable: true
                });
            } else if (Object.prototype.__defineGetter__ &&     Object.prototype.__defineSetter__) { // legacy
                Object.prototype.__defineGetter__.call(this, prop, getter);
                Object.prototype.__defineSetter__.call(this, prop, setter);
            }
        }
    };
}

// object.unwatch
if (!Object.prototype.unwatch) {
    Object.prototype.unwatch = function (prop) {
        var val = this[prop];
        delete this[prop]; // remove accessors
        this[prop] = val;
    };
}

そして私のテストコード:

tO = {
    "v":0,
    "vplus":function(){this.v ++}
};
tO.watch("v", function(prop, oldval, newval) {
    console.log("The property "+prop+" is now "+tO.v+". Newval is "+newval+" and oldval     "+oldval+".");
    if (newval == 5){phantom.exit()};
});
tO.v = 1;
var i = 0
for(i=0; i<10; i++) {
    tO.v = i; 
    console.log(tO.v);
    if(tO.v == 9){
        console.log("got to 9");
    };
};
4

1 に答える 1

1

私自身の質問に答えるために:提供されたシムは壊れたセッター機能を配置しているようです。特に、ハンドラー関数が何か意味のあるものを返さない限り(それはおそらくそうではないかもしれません)、プロパティはundefinedに設定されます。交換

return newval = handler.call(this, prop, oldval, val);

var newval = handler.call(this, prop, oldval, val) || val;
return newval;

仕事をしているようだった。

ちなみに、この特定のシムは独創的ですが、いくつかの制限があります。

  • 監視値に依存するコードは動作に時間がかかる場合があるため、重要な操作の後で監視値をフラグとして使用する場合は、監視値を変更することをお勧めします。

  • 値に複数のハンドラーを追加することはできません。

于 2011-08-10T02:19:59.357 に答える