使用第三方易语言 JS 运行组件(推荐)

这是最直接、功能最强大的方法,有许多易语言爱好者开发的组件专门用于执行 JS 代码,它们通常封装了 V8Chakra 等现代 JS 引擎,性能好,支持 ES6+ 语法。

易语言运行js读取网页
(图片来源网络,侵删)

常用组件:

  • 易语言 JS 运行支持库:在易语言论坛或资源站搜索,有很多版本,选择一个口碑好的即可。
  • EJSS (Easy JavaScript Support):另一个流行的选择。

核心原理: 组件提供一个“执行JS代码”的命令,你可以将 JS 代码作为字符串传给它,它会返回执行结果。

示例:使用假想的 易语言 JS 运行支持库

目标: 访问 https://httpbin.org/get,并从中解析出 url 字段的值。

易语言运行js读取网页
(图片来源网络,侵删)

准备工作

  • 下载并安装一个易语言 JS 运行组件,并在易语言中引用它(通常是点击“窗口” -> “支持库...”,然后选择对应的 .e 文件)。
  • 创建一个易语言程序,界面可以很简单,一个“执行”按钮,一个“输出”编辑框。

易语言代码

.版本 2
.程序集 窗口程序集_启动窗口
.子程序 _按钮_执行_被单击
.局部变量 js代码, 文本型
.局部变量 返回结果, 文本型
.局部变量 url, 文本型
' 1. 定义要执行的 JavaScript 代码
' 我们使用 fetch API (现代浏览器和JS引擎都支持) 来获取网页内容
' 然后使用 .json() 将响应体解析为JSON对象
' 我们返回 JSON.stringify(obj) 来获取整个JSON字符串,以便在易语言中解析
js代码 = “
    // 使用 fetch 获取网页
    fetch('https://httpbin.org/get')
        .then(response => {
            if (!response.ok) {
                throw new Error('网络响应错误');
            }
            return response.json(); // 解析JSON数据
        })
        .then(data => {
            // 将整个JSON对象转换为字符串,这样易语言才能接收
            // 注意:JS中的JSON.stringify在V8引擎中可能叫 stringify
            // 这里我们直接返回 data.url 来获取特定字段
            return data.url;
        })
        .catch(error => {
            console.error('获取数据时出错:', error);
            return '发生错误: ' + error.message;
        });
”
' 2. 调用组件的命令执行JS代码
' 注意:这里假设组件名为 "JS运行支持库",并且有 "执行" 命令
' 你需要根据你实际使用的组件来调整命令名和参数
返回结果 = JS运行支持库.执行 (js代码)
' 3. 将返回的结果显示在编辑框中
编辑框_输出.内容 = 返回结果
' --- 另一种更简洁的JS代码(直接返回JSON字符串) ---
' js代码 = “
'     fetch('https://httpbin.org/get')
'         .then(response => response.json())
'         .then(data => JSON.stringify(data))
'         .catch(error => JSON.stringify({error: error.message}));
' ”
' ' 执行后,返回结果是一个完整的JSON字符串,你可以用易语言的“取中间文本”等命令来解析 "url" 字段。

优点:

  • 功能强大,可以执行复杂的JS逻辑。
  • 不依赖外部浏览器,速度快。
  • 可以模拟浏览器行为,如处理DOM操作。

缺点:

易语言运行js读取网页
(图片来源网络,侵删)
  • 需要额外下载和集成第三方组件,可能存在兼容性问题或不稳定的风险。

使用 WebBrowser 控件执行 JS

这是最传统的方法,利用 Windows 自带的 WebBrowser 控件(基于 IE 内核),它可以直接与网页中的 JS 交互。

核心原理: 通过 WebBrowser 控件的 Document.InvokeScript 方法,向当前加载的网页注入并执行 JS 代码。

示例: 访问一个简单的本地 HTML 文件,并执行其中的 JS。

准备工作

  • 在易语言窗口上放置一个 WebBrowser 控件(通常在“基本组件”面板里)。
  • 创建一个“执行JS”按钮。

创建一个测试用的 HTML 文件 在你的易语言程序同目录下,创建一个名为 test.html 的文件,内容如下:

<!DOCTYPE html>
<html>
<head>JS测试页面</title>
</head>
<body>
    <h1>欢迎!</h1>
    <p>这是一个测试页面。</p>
    <script>
        function getHello() {
            return "你好,易语言!";
        }
        function getPageTitle() {
            return document.title;
        }
    </script>
</body>
</html>

易语言代码

.版本 2
.程序集 窗口程序集_启动窗口
.子程序 __启动窗口_创建完毕
.局部变量 js代码, 文本型
' 窗口创建时,加载我们准备好的HTML文件
WebBrowser1.导航 (“\test.html”) ' 注意路径,如果你的HTML在其他位置请修改
.子程序 _按钮_执行JS_被单击
.局部变量 返回结果, 文本型
' 1. 定义要执行的JS代码
' 这里我们调用HTML文件中定义的 getHello 函数
js代码 = "getHello()"
' 2. 使用 InvokeScript 执行JS
' 第一个参数是JS函数名,第二个参数是函数的参数(这里没有参数,所以传空数组)
' 注意:这个命令可能会因为JS引擎不同而失败,例如在非IE模式下
返回结果 = WebBrowser1.文档.执行脚本 (js代码)
' 3. 显示结果
信息框 (“JS执行结果: ” + 返回结果, 0, , )
' --- 另一个例子:获取网页标题 ---
' js代码 = "getPageTitle()"
' 返回结果 = WebBrowser1.文档.执行脚本 (js代码)
' 信息框 (“网页标题是: ” + 返回结果, 0, , )

优点:

  • 不需要额外组件,是 Windows 自带的。
  • 可以直接与已加载页面的 JS 上下文交互。

缺点:

  • 依赖 IE 内核,对现代 JS (ES6+) 和 CSS 支持不佳,很多网站无法正常加载或执行。
  • 执行 JS 的方式在不同浏览器模式下可能不兼容。
  • 必须先成功加载网页,才能执行 JS。

调用外部浏览器命令行(读取渲染后内容)

这种方法不“运行”JS,而是利用浏览器(如 Chrome)的命令行工具,让它打开网页、执行所有 JS 和 CSS,然后将最终的 HTML 源码抓取回来。

核心原理: 通过命令行调用浏览器(如 chrome.exe)并带上特定参数,让它静默渲染页面,然后将输出重定向到一个文件,最后用易语言读取这个文件。

示例: 抓取 https://www.baidu.com 渲染后的 HTML。

准备工作

  • 确保你的电脑上安装了 Chrome 浏览器,并知道它的安装路径(C:\Program Files\Google\Chrome\Application\chrome.exe)。
  • 了解 Chrome 的命令行参数,特别是 --headless(无头模式,不显示窗口)和 --dump-dom(输出DOM结构)。

易语言代码

.版本 2
.程序集 窗口程序集_启动窗口
.子程序 _按钮_抓取渲染后内容_被单击
.局部变量 chrome路径, 文本型
.局部变量 目标网址, 文本型
.局部变量 命令行, 文本型
.局部变量 临时文件, 文本型
.局部变量 渲染后HTML, 文本型
' 1. 设置Chrome路径和目标网址
' 注意:这里需要替换成你自己的Chrome实际路径
chrome路径 = "C:\Program Files\Google\Chrome\Application\chrome.exe"
目标网址 = "https://www.baidu.com"
' 2. 创建一个临时文件来存储HTML输出
临时文件 = 取运行目录 () + "\rendered.html"
' 3. 构建完整的命令行
' --headless: 无头模式
' --disable-gpu: 禁用GPU加速,在某些服务器上需要
' --dump-dom: 输出DOM到标准输出
' --timeout=30: 设置超时时间(秒)
' --virtual-time-budget=10000: 模拟页面加载10秒,确保JS执行完成
' 最后将输出重定向 (>) 到临时文件
命令行 = “"” + chrome路径 + “" --headless --disable-gpu --dump-dom --timeout=30 --virtual-time-budget=10000 ” + 目标网址 + “ > ” + “"” + 临时文件 + “"”
' 4. 执行命令
' 使用 .dos命令() 来执行系统命令
输出调试文本 (“正在执行命令: ” + 命令行)
.程序集_运行命令 (命令行, , , )
' 5. 等待命令执行完成,并读取临时文件的内容
' 注意:这里需要加一个短暂的延迟,确保文件写入完成
延时 (2000)
(文件是否存在 (临时文件))
    渲染后HTML = 到文本 (读入文件 (临时文件))
    编辑框_输出.内容 = 取中间文本 (渲染后HTML, 1, 2000) ' 只显示前2000个字符,避免卡顿
    删除文件 (临时文件) ' 清理临时文件
否则
    信息框 (“抓取失败,请检查Chrome路径和网络!”, 16, , )
    输出调试文本 (“抓取失败,临时文件未生成。”)
    返回
结束如果

优点:

  • 100% 还原真实浏览器环境,能执行任何 JS,处理最复杂的网页。
  • 是爬虫抓取动态网页的终极方案。

缺点:

  • 非常慢,需要启动整个浏览器进程。
  • 依赖外部软件,必须确保目标机器安装了指定浏览器。
  • 代码相对复杂,需要处理命令行和文件。

总结与选择建议

方法 优点 缺点 适用场景
JS运行组件 功能强、速度快、不依赖浏览器 需要第三方组件,有兼容风险 需要执行复杂JS逻辑、模拟浏览器行为、不依赖外部环境的场景。
WebBrowser控件 系统自带,无需额外组件 依赖IE内核,JS支持差,必须先加载网页 与简单的、基于IE的旧网页进行交互。
外部浏览器命令行 100%还原真实渲染,JS支持最完美 速度慢,依赖外部软件,代码复杂 爬虫抓取高度动态化的现代网页(如SPA应用),需要获取最终渲染结果。

给你的建议:

  • 如果你只是想执行一些固定的JS逻辑来处理数据,比如解析JSON、加密解密等,首选方法一
  • 如果你需要和已经加载好的旧式网页交互,可以尝试方法二
  • 如果你是做爬虫,目标网页是现代的、JS驱动的(比如React/Vue构建的),并且不介意速度和依赖,那么方法三是不二之选。