2016-08-12 17 views
0

これはjavadriptのコードで、questionへの回答から来ており、ウェブページ上のテキストの置換に非常に適しています。 SafariとChromeの両方でjavascriptコンソールを使用すると、効果的な結果が得られました。ウェブページのテキストをjavascriptとapplescriptに置き換える方法

function replaceTextOnPage(from, to){ 
    getAllTextNodes().forEach(function(node){ 
     node.nodeValue = node.nodeValue.replace(new RegExp(quote(from), 'g'), to); 
    }); 

    function getAllTextNodes(){ 
     var result = []; 

     (function scanSubTree(node){ 
      if(node.childNodes.length) 
       for(var i = 0; i < node.childNodes.length; i++) 
        scanSubTree(node.childNodes[i]); 
      else if(node.nodeType == Node.TEXT_NODE) 
       result.push(node); 
     })(document); 

     return result; 
    } 

    function quote(str){ 
     return (str+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"); 
    } 
} 

replaceTextOnPage('oldtext', 'newtext'); 

しかし、私はSafariとクロームの両方で、replace_text.jsとしてこれを保存し、AppleScriptをして、それを実行しようとすると、それは私も実行してみました

tell application "Safari" 
    activate 
    tell the current tab of window 1 to do JavaScript "/Users/Me/ScriptFolder/replace_text.js" 
end tell 

欠損値返しますreplace_text.jsファイルを使用する代わりに引用符をエスケープしてエスケープした後にスクリプトエディタのtellブロックから直接javascriptを読み込みますが、これもmissiになります値はです。

スクリプトエディタに直接JavaScriptコードをコピーして貼り付けて、JavaScriptランナーを使用して実行すると、エラー-2700:スクリプトエラーが発生します。

Error on line 15: ReferenceError: Can't find variable: document

私はdocument = "http://example.com"としてスクリプト内で文書を定義した場合、私はエラーを取得する:

Error on line 12: TypeError: undefined is not an object (evaluating 'node.childNodes.length')

誰かが私が間違って何をやっている私に言うことはできますか? Applescriptでこの同じJavaScriptコードを実行するにはどうすればよいですか?

おかげ

答えて

1

do JavaScriptコマンドは、のJavaScriptコードではなく、ファイルパスを含む文字列を必要としています。

だから、あなたが使用することができます。

set myJS to read "/Users/Me/ScriptFolder/replace_text.js" as «class utf8» -- encoding of the file is "utf-8" 
tell application "Safari" 
    tell the current tab of window 1 to do JavaScript myJS 
end tell 

またはこの:

set myJS to "function replaceTextOnPage(from, to){ 
    getAllTextNodes().forEach(function(node){ 
     node.nodeValue = node.nodeValue.replace(new RegExp(quote(from), 'g'), to); 
    }); 
    return 'replaceTextOnPage(), Done' // just for testing, to avoid the missing value from the do JavaScript command 
    function getAllTextNodes(){ 
     var result = []; 
     (function scanSubTree(node){ 
      if(node.childNodes.length) 
       for(var i = 0; i < node.childNodes.length; i++) 
        scanSubTree(node.childNodes[i]); 
      else if(node.nodeType == Node.TEXT_NODE) 
       result.push(node); 
     })(document); 
     return result; 
    } 
    function quote(str){ 
     return (str+'').replace(/([.?*+^$[\\]\\(){}|-])/g, \"\\$1\"); 
    } 
} 
replaceTextOnPage('oldtext', 'newtext');" 

tell application "Safari" 
    activate 
    tell the current tab of window 1 to do JavaScript myJS 
end tell 

do JavaScriptコマンドの戻り欠損値関数の戻り何も(replaceTextOnPage機能を何も返しません)、それは正常です動作。

関連する問題