当前位置: 首页 > 知识库问答 >
问题:

如何用javascript和applescript替换网页上的文本

祁嘉言
2023-03-14

下面的javascript代码来自这个问题的答案,非常适合替换网页上的文本。在Safari和Chrome中使用javascript控制台都取得了成功的结果。

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');

但是,当我将其保存为替换_文本时。js并尝试使用Applescript运行它,在Safari和Chrome中都会返回缺少的值

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

我也尝试运行javascript直接从Script编辑器中的告诉块,转义引号和转义后,而不是使用replace_text.js文件,但这也会导致丢失值。

当我将javascript代码直接复制并粘贴到脚本编辑器中,并尝试使用javascript运行程序运行它时,会出现错误-2700:Script Error。

第15行错误:引用错误:找不到变量:文档

如果我将脚本中的文档定义为document=”http://example.com“我得到了一个错误:

第12行错误:TypeError:undefined不是对象(计算'node.childNodes.length')

有人能告诉我我做错了什么吗?如何使用Applescript运行相同的javascript代码?

谢谢

共有1个答案

谭献
2023-03-14

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命令返回缺少的值),这是正常行为。

 类似资料:
  • 我有一个文本文件,用户在这里写东西,我用这个文本框的javascript获得文本,并在段落中显示它。我有段落的文本限制,比如50个chrac。如果用户写了超过50个chrac我想显示(...)在45个chrac之后。是否可以使用JavaScript? 这是用户写的段落,它有50多个chrac。 Lorem ipsum dolor sit amet,consectetur adipisicing e

  • 问题内容: 在讨论特定问题之前,我需要解释一些基本步骤。 首先,所涉及的应用程序处理客户在线约会的管理。 顾客填写完美容中心的护理表格并提供其信息后,将进入确认页面。 现在,此页面执行ajax请求以将约会存储在数据库中。 如果一切成功,将显示一个页面,其中包含约会的详细信息以及成功消息。 问题在于该页面当前仅显示在响应中,即在选项卡网络控制台浏览器中。 所以我的问题很简单: 即使在StackOve

  • 我只想知道如何用另一个文件完全替换用户的主机文件?注意:我只想给用户我的. exe编译文件(附加我自己的主机文件),并且在运行exe文件后,用户的主机文件应替换为我自己的主机文件,我附加到我的exe文件。

  • 我有一个文本字段,用户在其中写东西,我用javascript获取文本框的文本,并在段落中显示。我有文字限制的段落像50 chrac。如果用户编写的chrac超过50个,我想显示(…)45小时后,chrac。可以使用javascript吗? 像这样的段落是用户写的,它的50多个chrac。 Lorem ipsum dolor坐在那里,奉献给我们,我们的工作和伟大的礼物。在有限的条件下,在有限的条件下

  • 问题内容: 是否可以在不使用JavaScript的情况下禁用网页上的右键单击?我之所以这样问,是因为大多数浏览器都允许用户禁用JavaScript。 如果没有,如何使用JavaScript禁用右键单击? 问题答案: 您可以使用JavaScript通过为“contextmenu”事件添加事件侦听器并调用方法来做到这一点: 话虽这么说:不要做。 为什么?因为它除了使用户烦恼之外什么也做不到。同样,许多