2

処理された1つのWebページから、エクスポートしたい新しいWebページにデータをコピーしようとしています。背景には、ページの一部を削り取り、元のページの一部を使用して新しいページを作成する必要があるということです。問題は、phantomJのincludeJs()メソッドとevaluate()メソッドがサンドボックス化されており、あるページから別のページにDOMをインポートする適切な方法がわからないようです。

次のようなテストコードがあります。ページは元のページで、新しいページがあります。

    ....
    var title = page.evaluate(function() {
        return title = document.getElementById('fooo').innerHTML;
    });
    console.log('page title:' + title);
    //fs.write('c:/Temp/title.js', "var title = '" + title + "';", 'w');

    var out = new WebPage;
    out.viewportSize = page.viewportSize;
    out.content = '<html><head></head><body><div id="wrapper"></div><p>done</p></body></html>';
    out.includeJs('c:/Temp/title.js', function() {
        var p = document.createElement('p');
        p.appendChild(document.createTextNode(title));
        document.getElementById('wrapper').appendChild(p);
    });
    ...
4

1 に答える 1

3

ここでの最後のincludeJs呼び出しの関数は機能しません-ご存知のように、サンドボックス化されています。つまり、クロージャは機能しないため、title定義されません。に変数を渡す方法はpage.evaluate機能リクエストとして記載されていますが、PhantomJSv.1.4.1では使用できません。

これを回避する一般的な方法は、Functionコンストラクターを使用することです。これにより、文字列を使用して関数を作成できます。

var myVar = {some:"values", I:"want to pass into my page"},
    test = new Function("window.myVar = " + JSON.stringify(myVar));
page.evaluate(test);

これで、サンドボックスでevaluate参照しているような関数を使用できるようmyVarになり、データがクライアントスコープで使用できるようになります。

于 2012-01-08T22:02:59.563 に答える