2017-08-11 17 views
0

次の例では、categoryIdnullはなぜですか?CasperJS:evaluate()はヌル値を返します

var scripts = this.evaluate(function() { 
    var raScripts = "A lengthy script"; 

    return raScripts; 
}); 

var categoryId = this.evaluate(function() { 
    var text = 'more text'; 
    var lengthyScript = scripts + ' ' + text; 

    return lengthyScript; 
}); 

this.echo('Status: ' + categoryId); 
// categoryId is null 
+0

変数'scripts'はページコンテキストの外側で定義されますが、内部で使用されます。 –

+0

そして、 'this.evaluate'関数の外で' raScripts'バリエーションをどうやって使うことができますか? –

+0

あなたは 'evaluate'コールバックからそれを返すことで既にそれを行いました。 'raScripts'の値は' scripts'の値と同じです(値が循環参照のないプリミティブなオブジェクトだった場合)。ページコンテキストの中の次の "計算"のために、単に 'script'の値をページコンテキストに戻す必要があります。 –

答えて

0

私はあなたのscripts変数が(それはあなただけのキャスパー環境で定義されている)ブラウザ環境で定義されていないので、これはあると思います。実際、evaluateを使用すると、コンテキストはDOMであり、Casperインスタンスではありません。

var casper = require('casper').create(); 
var tag = 'h1'; // This is our global variable... 

casper.start('http://example.com/'); 

casper.waitForSelector('body', function() { 
    this.echo(this.evaluate(function() { 
    return document.querySelector(tag).textContent; // Oops! 
    })); 
}); 

casper.run(); 

をしかし、我々はevaluateの文脈の中で私たちの変数を注入した場合、我々は(「例ドメイン」である)期待される結果を得る:

これはnullを返します

var casper = require('casper').create(); 

casper.start('http://example.com/'); 

casper.waitForSelector('body', function() { 
    this.echo(this.evaluate(function (tag) { 
    return document.querySelector(tag).textContent; 
    }, 'h1')); 
}); 

casper.run(); 
+0

あなたのコメントありがとう、しかし私は本当にあなたの例の周りに私の頭を包むことはできません。 'scripts'変数は"長いスクリプト "を返します。 私の問題は 'categoryId'変数にあります。 '長いスクリプトmore text 'ではなく' null'を返しますが、 'scripts'変数と同じロジックで構築されています。 –

関連する問題