开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 79834|回复: 171
收起左侧

[图文资料] 水星浏览器开发指南

    [复制链接]
结帖率:82% (9/11)
发表于 2020-11-10 22:07:52 | 显示全部楼层 |阅读模式   广东省东莞市


介绍

水星浏览器是在2016年时创建的一个浏览器项目, 它的前身有Kirinoium、遥望浏览器、易CEF、CEF视图等等。项目的目标是跟踪 Google Chromium 嵌入式分支做成一个免费开源的易语言版 chromium 实现, 让广大易开发者们享受到来自 Chromium 的现代化浏览器技术。水星浏览器的典型应用场景包括:
作为一个兼容HTML5的浏览器控件嵌入到应用程序中。
创建一个轻量化的壳浏览器用于托管Web技术开发的应用程序。
使用浏览器进行自动化的Web适应性测试。


更新概览

本次更新在水星浏览器1.0+版的基础上进行了综合的结构性的升级, 着重提升稳定性以及多线程性能 , 主要解决了以下这些重要的严重问题和缺陷:
支持库结构化升级, 相对于1.0+版本, 本次升级支持库采用RAII和智能指针技术构建类型对象, 全面提升支持库稳定性并解决长久以来的内存过渡消耗与占用问题。
内核更新至 Chromium 80.0.3987.163 / CEF 80.1.16 版本, 支持多媒体音视频播放。
支持库全面换装支持多进程模式, 单进程模式已从 Chromium 68.0.3440.42 / CEF 3440 开始废除支持。
修复了在1.0版本中索引到错误框架会崩溃的问题。
修复了在1.0版本中执行异常脚本会崩溃的问题以及执行不一致的问题。
完善了支持了单/多浏览器环境隔离(提供独立的缓存与cookies存储设置)。
支持了基于 DOM 结构的网页元素访问。
支持了首选项(Preerences) 功能设置。
支持了静音模式。
支持了移动端设备的模拟功能, 包含设备模拟以及手势合成。
支持了以编程方式访问浏览器的功能。
支持了所有种类的请求发起方式, 包含: uri-data request, navigate request, url request, 浏览器无关 url request。
支持了 Google Chrome Extension 扩展程序。
新增了HTTP Server服务器类型, 用于提供小容量的 HTTP / Websocket 会话服务。
新增了网页套接字(Websocket)类型, 用于支持 Websocket Client 端会话服务。
新增了"CefQuery"功能用于支持Javascript与浏览器的交互访问详细介绍见例程。
扩充了浏览器事件以细化业务代码的处理时机, 扩充后浏览器拥有超60个事件。
改进了资源处理模型, 提供了更多更完整的资源处理与操作时机,  资源处理模型用于观察(Observer)浏览器资源的加载过程。
改进了cookies的操作方式, 提供了更为简易的操作接口并支持以文本方式进行导入导出。
改进了HOOK脚本功能, 提供了优先级更高更加稳定的操作方式。
改进了不能任意时机覆盖用户代理标识(User-Agent)的限制。
改进了所有异步访问接口与消息循环提供更友好的同步接口以及多线程消息模型以消除易语言与CEF多进程架构间的差异。
支持库全面中文化支持, 方便理解和快速输入。
更多详细改进信息见例程: \samples\水星浏览器测试.e


下载


水星项目使用 Github 代码仓库进行工程管理与下载分发。
仓库地址:  https://github.com/kirino17/ecef
release版: https://github.com/kirino17/ecef/releases


编译


编译见项目仓库说明信息。


安装

选择所需版本安装程序下载至本地磁盘上, 双击运行安装向导程序进行安装。如果本机已装有支持库, 需要先执行移除操作后在进行安装。

装有支持库内测版的电脑需要在系统环境变量"Path"中将测试版本运行时目录删除。

选择安装文件时, 应选择安装到易语言客户端运行目录

并在安装完成时勾选"启用水星浏览器支持库" 以安装支持库文件到易语言中。

支持库测试例程位于: 安装目录\ecef_runtime\release\samples\水星浏览器测试.exe

授权

水星浏览器支持库使用 BSD-3 Clause 开源协议免费授权, 欢迎使用。


常见问题指引

常见问题帮助


功能介绍

一个最简单的浏览器

readme-67.png
readme-68.png

====================================================

从浏览框中获取浏览器

  
子程序名返回值类型公开备 注
_按钮_取浏览器_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
如果真 (水星铬浏览框1.取浏览器数量 () > 0)
浏览器 = 水星铬浏览框1.取浏览器索引 (0)


i支持库列表   支持库注释   
ecef水星浏览器支持库


加载一个URL

  
子程序名返回值类型公开备 注
_按钮_取浏览器_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
如果真 (水星铬浏览框1.取浏览器数量 () > 0)
浏览器 = 水星铬浏览框1.取浏览器索引 (0)
浏览器.取主框架 ().加载URL (“some_url”)


i支持库列表   支持库注释   
ecef水星浏览器支持库



执行浏览器回退操作

  
子程序名返回值类型公开备 注
_按钮_取浏览器_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
如果真 (水星铬浏览框1.取浏览器数量 () > 0)
浏览器 = 水星铬浏览框1.取浏览器索引 (0)
浏览器.回退 ()


i支持库列表   支持库注释   
ecef水星浏览器支持库



获取主 iframe 中的HTML内容:

  
子程序名返回值类型公开备 注
_按钮_取浏览器_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
html文本型 
如果真 (水星铬浏览框1.取浏览器数量 () > 0)
浏览器 = 水星铬浏览框1.取浏览器索引 (0)
html = 浏览器.取主框架 ().取页面源码 ()


i支持库列表   支持库注释   
ecef水星浏览器支持库



浏览器窗口的原生句柄可以用下面的代码获取:

  
子程序名返回值类型公开备 注
_按钮_取浏览器_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
窗口句柄整数型 
如果真 (水星铬浏览框1.取浏览器数量 () > 0)
浏览器 = 水星铬浏览框1.取浏览器索引 (0)
窗口句柄 = 浏览器.取窗口句柄 ()


i支持库列表   支持库注释   
ecef水星浏览器支持库


使用窗口句柄获取浏览器

  
子程序名返回值类型公开备 注
_按钮_取浏览器_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
浏览器 = 水星铬浏览框1.取浏览器 (窗口句柄)


i支持库列表   支持库注释   
ecef水星浏览器支持库


执行Javascript脚本
运行Javascript表达式通过 水星框架 类型支持。 执行没用返回值的Javascript表达式使用方法 框架.执行脚本(), 具有返回值的Javascript表达式则应该使用方法 框架.执行脚本2() 。

  
子程序名返回值类型公开备 注
_按钮_演示_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
浏览器 = 水星铬浏览框1.取浏览器 (窗口句柄)
' 执行没有返回值的javascript表达式
浏览器.取主框架 ().执行脚本 (“alert('hello world')”, “demo_samples”, 0)


i支持库列表   支持库注释   
ecef水星浏览器支持库


执行具有返回值的表达式

  
子程序名返回值类型公开备 注
_按钮_演示_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
异常信息文本型 
执行结果水星通用型 
浏览器 = 水星铬浏览框1.取浏览器 (窗口句柄)
' 执行具有返回值的javascript表达式
执行结果 = 浏览器.取主框架 ().执行脚本2 (“(function(){ return 'hello world'; })();”, “demo_samples”, 0, 异常信息)
如果真 (执行结果.是否有效 ())
调试输出 (执行结果.取文本型 ())


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库


开始

初始化


在创建浏览器之前,  需要先对支持库进行初始化设置。从启动窗口或是从启动子程序开始应用程序并执行第一个支持库方法:  进程初始化()


  
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
进程初始化 (, )


i支持库列表   支持库注释   
ecef水星浏览器支持库


如果希望配置一些浏览器的初始化选项, 则使用方法:  创建初始化设置()  获取设置对象以配置初始化信息并将对象传递到:  进程初始化() 方法以完成设置。


  
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
变量名类 型静态数组备 注
初始化选项水星初始化设置 
初始化选项 = 创建初始化设置 ()
' 设置初始化信息
初始化选项.全局缓存目录 (取运行目录 ()“\userdata”)
初始化选项.用户数据目录 (取运行目录 ()“\userdata”)
' 应用设置
进程初始化 (初始化选项, )


i支持库列表   支持库注释   
ecef水星浏览器支持库


一些常用的初始化选项:

  • 全局缓存目录 设置磁盘上用于存放缓存数据的位置。如果此项为空, 某些功能将使用内存缓存, 多数功能将使用临时的磁盘缓存。 形如本地存储的HTML5数据库只能在设置了缓存路径后才能跨 session 存储。
  • 语言环境 此设置项将传递给Blink。如果此项为空, 将使用默认值"en-US"。此项额可以通过命令行参数 --lang 设置。
  • 用户数据目录 设置用户数据存储(例如拼写检查字段文件)位置。此值作为所有浏览器创建时使用的缺省值, 如非特别指定, 所有的浏览器都将会共享此设置。保持为空时则默认不会将数据存储到磁盘上。
  • 用户代理标识 设置此值作为: User-Agent HTTP 标头的返回值。
  • 保持用户首选项 设置此值, 用户首选项数据将使用JSON文件保留到缓存目录中。
  • 保持会话cookies  设置此值, 在全局cookies管理器中保留会话cookies(它们将没有有效期)。
  • 接收语言字符串 设置全局的HTTP接收语言字符串,以逗号分隔的语言代码字符串数组,不可以使用空格, 这些字符串值将在"Accept-Language" HTTP标头中使用。



命令行

浏览器执行初始化后将会触发第一个事件 "进程即将初始化"

  
子程序名返回值类型公开备 注
_水星铬浏览框1_进程即将初始化  
参数名类 型参考可空数组备 注
进程类型文本型
命令行水星命令行



i支持库列表   支持库注释   
ecef水星浏览器支持库


水星浏览器中的许多特性都可以使用命令行参数进行配置。 这些参数采用 "--some-argument[=optional-param]" 的形式设置。 如果需要将指定的命令行参数以编程方式传入浏览器, 则应在此事件中进行。

加载 flash 播放器插件

  
子程序名返回值类型公开备 注
_水星铬浏览框1_进程即将初始化  
参数名类 型参考可空数组备 注
进程类型文本型
命令行水星命令行
' 加载flash
命令行.置配置项值 (“ppapi-flash-version”, “29.0.0.140”)
命令行.置配置项值 (“ppapi-flash-path”, “d:\flash\pepflashplayer32_29_0_0_140.dll”)


i支持库列表   支持库注释   
ecef水星浏览器支持库



加载自定义插件(PPAPI)

水星浏览器支持加载自定义 PPAPI 插件, 插件使用命令行参数 "--register-pepper-plugins=..." 加载, 最大允许加载插件数量为64个。

    --register-pepper-plugins = <plugin-entry> + *( LWS + "," + LWS + <plugin-entry> )

    <plugin-entry> = <file-path> + [ "#" + <name> + ["#" + <description> + ["#" + <version>
        ]]] + *1( LWS + ";" + LWS + <mime-type-data> )

    <mime-type-data> = <mime-type> + [ LWS + "#" + LWS + <extension> ]

格式说明:
    --register-pepper-plugins = <插件入口(一般为DLL文件名)> + 可选的( [#插件名称 [#插件描述 [
        #插件版本] ] ] );MIME类型 + 可选的[#扩展信息]

    如需加载多个插件使用","分隔。

完整例子:
    --register-pepper-plugins = "d:\my\plugins\my-plugins.dll#插件的名字#插件的描述信息#插件版本;
    application/x-ppapi-test-xxxx#插件扩展信息,d:\my\plugins\my-plugins2.dll#第二个插件#第二个插件
    的描述信息#第二个插件的版本;application/x-ppapi-test-xxxx#第二个插件的扩展信息,..."


代码


  
子程序名返回值类型公开备 注
_水星铬浏览框1_进程即将初始化  
参数名类 型参考可空数组备 注
进程类型文本型
命令行水星命令行
' 加载ppapi
命令行.置配置项值 (“--register-pepper-plugins”, “d:\my\plugins\my-plugins.dll#插件的名字#插件的描述信息#插件版本;application/x-ppapi-test-xxxx#插件扩展信息,d:\my\plugins\my-plugins2.dll#第二个插件#第二个插件的描述信息#第二个插件的版本;application/x-ppapi-test-xxxx#第二个插件的扩展信息,...”)


i支持库列表   支持库注释   
ecef水星浏览器支持库



浏览器生命周期

创建

浏览器生命周期从执行 水星铬浏览框.创建浏览器开始() 开始。 可以在事件 "进程初始化完毕" 中或者再此事件之后的任意方便的位置添加创建代码。

  
子程序名返回值类型公开备 注
_水星铬浏览框1_进程初始化完毕  
' 创建浏览器作为子窗口
水星铬浏览框1.创建浏览器 (创建子窗口设置 (水星铬浏览框1.取窗口句柄 (), 0, 0, 水星铬浏览框1.宽度, 水星铬浏览框1.高度), “http://itwitch.cc/ecef”, , )


i支持库列表   支持库注释   
ecef水星浏览器支持库


浏览器创建完成后事件 "浏览器创建完毕" 会立即被触发。宿主程序可以在此事件中获取并保存浏览器对象的引用。

  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
集_浏览器水星浏览器  
集_浏览器窗口句柄整数型  

子程序名返回值类型公开备 注
__启动窗口_创建完毕  
进程初始化 (, )
子程序名返回值类型公开备 注
_水星铬浏览框1_进程初始化完毕  
' 创建浏览器作为子窗口
水星铬浏览框1.创建浏览器 (创建子窗口设置 (水星铬浏览框1.取窗口句柄 (), 0, 0, 水星铬浏览框1.宽度, 水星铬浏览框1.高度), “http://itwitch.cc/ecef”, , )
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器创建完毕  
参数名类 型参考可空数组备 注
浏览器水星浏览器
' 保存浏览器对象引用有以下几种方法:
' 1.保存对象引用, 保存对象的引用可以在任意位置直接访问浏览器对象。
集_浏览器 = 浏览器
' 2.保存窗口句柄引用, 保存浏览器的窗口句柄引用, 保存窗口句柄可以通过使用方法 水星铬浏览框.取浏览器() 重新获得浏览器对象。
集_浏览器窗口句柄 = 浏览器.取窗口句柄 ()
' 3.索引引用, 浏览器索引引用自动保存于浏览框中, 通过方法 水星铬浏览框.取浏览器索引() 获得浏览器对象, 索引从0开始, 索引顺序为浏览器创建顺序。



i支持库列表   支持库注释   
ecef水星浏览器支持库


打开

如果用户在浏览器内点击了具有 "target=_blank" 属性的连接则将会触发事件 "浏览器将要打开" 。


  
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器将要打开逻辑型 
参数名类 型参考可空数组备 注
浏览器水星浏览器
框架水星框架
目标URL文本型
目标框架名称文本型
链接的打开方式整数型
是否为手势点击逻辑型
窗口设置水星窗口设置
浏览器设置水星浏览器设置
是否禁止脚本访问整数型
' 如果希望链接在源浏览器中导航, 则可设置来源框架加载目标URL, 以此导航至新地址。
框架.加载URL (目标URL)
' 要促使浏览器取消创建窗口则返回真
返回 ()


i支持库列表   支持库注释   
ecef水星浏览器支持库


允许浏览器创建窗口则应为新窗口设置窗口样式信息, 并返回假。

  
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器将要打开逻辑型 
参数名类 型参考可空数组备 注
浏览器水星浏览器
框架水星框架
目标URL文本型
目标框架名称文本型
链接的打开方式整数型
是否为手势点击逻辑型
窗口设置水星窗口设置
浏览器设置水星浏览器设置
是否禁止脚本访问整数型
' 允许浏览器创建新窗口以导航至新链接则应为新浏览器窗口设置样式信息
' 设置为子窗口
窗口设置.置为子窗口 (水星铬浏览框1.取窗口句柄 (), 0, 0, 水星铬浏览框1.宽度, 水星铬浏览框1.高度)
' 返回假让浏览器继续进行
返回 ()


i支持库列表   支持库注释   
ecef水星浏览器支持库


关闭
关闭浏览器使用 水星铬浏览框.关闭浏览器() 方法。 关闭浏览器后 "浏览器将要关闭" 活 "浏览器即将消耗" 事件会依次被触发。

  
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器将要关闭逻辑型 
参数名类 型参考可空数组备 注
浏览器水星浏览器
' 在此事件中宿主程序可以进一步决定浏览器是否可以关闭。
' 如果希望浏览器继续运行并忽略关闭请求则应返回真
返回 ()
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器即将销毁  
参数名类 型参考可空数组备 注
浏览器水星浏览器
' 浏览器将被销毁前最后一个调用的事件。



i支持库列表   支持库注释   
ecef水星浏览器支持库


水星浏览器 和 水星框架

水星浏览器和水星框架对象被用来发送命令给浏览器以及在事件中获取状态信息。 每个水星浏览器对象都包含一个主框架对象, 主框架对象代表页面的顶层 iframe ; 同时每个浏览器对象可以包含零个或多个的子框架对象, 分别代表不同的子 iframe 。 例如, 一个浏览器加载了两个 iframe , 则该浏览器对象拥有三个框架对象( 顶层 iframe 和 两个子 iframe )。

获取主框架


  
子程序名返回值类型公开备 注
_按钮_演示_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
主框架水星框架 
浏览器 = 水星铬浏览框1.取浏览器 (hwnd)
主框架 = 浏览器.取主框架 ()


i支持库列表   支持库注释   
ecef水星浏览器支持库


使用框架

  
子程序名返回值类型公开备 注
_按钮_演示_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
主框架水星框架 
浏览器 = 水星铬浏览框1.取浏览器 (hwnd)
主框架 = 浏览器.取主框架 ()
' 在框架中加载一个URL
主框架.加载URL (“http://itwitch.cc/ecef”)


i支持库列表   支持库注释   
ecef水星浏览器支持库


框架的列举方法

  
子程序名返回值类型公开备 注
_按钮_演示_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
框架名称数组文本型0
框架标识符数组长整数型0
框架数组水星框架0
框架水星框架 
浏览器 = 水星铬浏览框1.取浏览器 (hwnd)
' 框架的列举方式有以下几种形式:
' 1.获取所有框架的名称
框架名称数组 = 浏览器.取所有框架名称 ()
' 从名称索引框架
如果真 (取数组成员数 (框架名称数组) > 0)
框架 = 浏览器.从名称取框架 (框架名称数组 [1])

' 2.获取所有框架的标识符
框架标识符数组 = 浏览器.取所有框架标识符 ()
' 从标识符索引框架
如果真 (取数组成员数 (框架标识符数组) > 0)
框架 = 浏览器.从标识符取框架 (框架标识符数组 [1])

' 3.获取所有框架对象
框架数组 = 浏览器.取所有框架 ()
' 直接使用框架
如果真 (取数组成员数 (框架数组) > 0)
框架 = 框架数组 [1]


i支持库列表   支持库注释   
ecef水星浏览器支持库



文件下载

浏览器产生下载请求时(包含调用方法 :  水星浏览器.启动下载() ), 事件 "浏览器即将下载" 将会被触发。 参数对象 "下载项" 指示了下载文件的状态信息。 执行类型方法 " 下载项.保存到() " 方法以允许浏览器下载资源并为资源提供磁盘存储位置。 省略调用此方法则浏览器将会忽略下载请求。


  
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器即将下载  
参数名类 型参考可空数组备 注
浏览器水星浏览器
下载项水星下载项
建议名称文本型
' 允许浏览器下载资源并为资源提供磁盘存储位置, 如果希望由用户决定保存路径,则设置第二个
' 参数为真, 设置后浏览器将忽略第一个参数并弹出一个文件选择对话框供用户选择保存路径。
下载项.保存到 (“d:\” + 建议名称, )


i支持库列表   支持库注释   
ecef水星浏览器支持库


如果通过了资源的下载请求浏览器将会每隔一秒触发一次事件 "浏览器下载进度已更新" 以告知当前资源的下载状态。要控制资源的下载行为可以使用参数 "下载项" 提供的类型方法: 下载项.取消下载() , 下载项.暂停下载() , 下载项.恢复下载() 等方法进行设置。

  
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器下载进度已更新  
参数名类 型参考可空数组备 注
浏览器水星浏览器
下载项水星下载项
下载项.暂停下载 ()
' 处理业务代码...
下载项.恢复下载 ()


i支持库列表   支持库注释   
ecef水星浏览器支持库



上下文菜单

浏览器上下文菜单产生的事件由 "浏览器菜单即将打开" 传递,  如果希望实现自定义菜单则应实现事件 "浏览器显示自定义菜单" 。 参数 "菜单信息" 提供了与菜单上下文有关的状态信息, 包括请求的来源, 页面地址以及页面期望创建的菜单类型等等。 参数 "菜单" 提供了一组菜单功能实现接口, 详细信息见类型说明。
  
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器菜单即将打开  
参数名类 型参考可空数组备 注
浏览器水星浏览器
框架水星框架
菜单信息水星菜单信息
菜单水星菜单
变量名类 型静态数组备 注
子菜单水星菜单 
调试输出 (“浏览器菜单即将打开”)
' 用户在浏览器中打开上下文菜单时调用此事件。
' 参数 | 菜单信息 | 提供了菜单有关的上下文信息
调试输出 (“菜单位置: ”, 菜单信息.取坐标X (), 菜单信息.取坐标Y ())
' 参数 | 菜单 | 提供了一组默认的菜单功能接口。
' 添加一个菜单项
菜单.添加菜单项 (2000, “测试菜单”)
' 添加分隔符
菜单.添加分隔符 ()
' 添加复选菜单
菜单.添加复选菜单项 (2001, “测试复选菜单”)
' 添加单选菜单
菜单.添加单选菜单项 (2002, “测试单选菜单1”, 990)
菜单.添加单选菜单项 (2003, “测试单选菜单2”, 990)
' 添加子菜单
子菜单 = 菜单.添加子菜单项 (2004, “测试子菜单”)
子菜单.添加菜单项 (3001, “子菜单项”)


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库


显示自定义菜单

  
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器显示自定义菜单逻辑型 
参数名类 型参考可空数组备 注
浏览器水星浏览器
框架水星框架
菜单信息水星菜单信息
菜单水星菜单
菜单回调水星菜单回调
调试输出 (“浏览器显示自定义菜单”)
' 如果希望显示自定义菜单,则在此事件中返回真以使用自定义菜单代替系统菜单。
' 使用自定义菜单时通过参数 | 菜单回调 | 提供菜单选择结果
' 菜单回调.执行命令 (2001, #事件标志.NONE)
' 返回 ()
返回 ()


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库



DOM

查询HTML页面DOM结构使用 框架.取文档对象() 方法。
  
子程序名返回值类型公开备 注
_按钮_演示_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
框架水星框架 
dom水星网页文档对象 
浏览器 = 水星铬浏览框1.取浏览器 (hwnd)
框架 = 浏览器.取主框架 ()
dom = 框架.取文档对象 ()


i支持库列表   支持库注释   
ecef水星浏览器支持库


HTML DOM 结构以及 DOM 元素 分别使用类型 "水星网页文档对象" 、"水星网页文档元素" 表示。 需要注意的是, 不要保留 DOM 对象以及DOM 元素的索引到局部变量的作用域之外使用。 这将导致对象无法被及时释放。

一些例子:

  
子程序名返回值类型公开备 注
_按钮_演示_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
框架水星框架 
dom水星网页文档对象 
head水星网页文档元素 
body水星网页文档元素 
document水星网页文档元素 
浏览器 = 水星铬浏览框1.取浏览器 (hwnd)
框架 = 浏览器.取主框架 ()
' 从框架获取DOM对象
dom = 框架.取文档对象 ()
' 打印文档类型
调试输出 (dom.取文档类型 ())
' 打印文档标题
调试输出 (dom.取文档标题 ())
' head 元素
head = dom.取HEAD元素 ()
' body 元素
body = dom.取BODY元素 ()
' document 元素
document = dom.取根元素 ()


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库


遍历元素

  
子程序名返回值类型公开备 注
_按钮_演示_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
框架水星框架 
dom水星网页文档对象 
document水星网页文档元素 
首个子元素水星网页文档元素 
最后一个子元素水星网页文档元素 
下一个兄弟元素水星网页文档元素 
上一个兄弟元素水星网页文档元素 
浏览器 = 水星铬浏览框1.取浏览器 (hwnd)
框架 = 浏览器.取主框架 ()
' 从框架获取DOM对象
dom = 框架.取文档对象 ()
' document 元素
document = dom.取根元素 ()
' 获取第一个子元素
首个子元素 = document.取首个子元素 ()
' 获取最后一个子元素
最后一个子元素 = document.取最后一个子元素 ()
' 获取下一个兄弟元素
下一个兄弟元素 = 首个子元素.取下一兄弟元素 ()
' 获取上一个兄弟元素
上一个兄弟元素 = 最后一个子元素.取上一兄弟元素 ()
' 检查是否有子元素
调试输出 (document.是否有子元素 ())


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库



CSS 选择器

除了支持标准的DOM结构遍历之外, 水星浏览器还支持使用 CSS 选择器索引元素。

查找单个元素

  
子程序名返回值类型公开备 注
_按钮_演示_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
框架水星框架 
dom水星网页文档对象 
元素水星网页文档元素 
浏览器 = 水星铬浏览框1.取浏览器 (hwnd)
框架 = 浏览器.取主框架 ()
' 从框架获取DOM对象
dom = 框架.取文档对象 ()
' 使用 CSS 选择器索引单个元素
元素 = dom.查询元素 (“#test > div > div > p”)


i支持库列表   支持库注释   
ecef水星浏览器支持库


查找所有符合的元素

  
子程序名返回值类型公开备 注
_按钮_演示_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
框架水星框架 
dom水星网页文档对象 
元素素组水星网页文档元素0
浏览器 = 水星铬浏览框1.取浏览器 (hwnd)
框架 = 浏览器.取主框架 ()
' 从框架获取DOM对象
dom = 框架.取文档对象 ()
' 使用 CSS 选择器索引所有符合的元素
元素素组 = dom.查询所有元素 (“#test > div > ul > li”)


i支持库列表   支持库注释   
ecef水星浏览器支持库


支持库支持的CSS 选择器如下:
选择器 例子 例子描述
.class .intro 选择 class="intro" 的所有元素
.#id #id="firstname" 选择 id="firstname" 的所有元素
(https://www.w3school.com.cn/cssref/selector_all.asp) (https://www.w3school.com.cn/cssref/selector_all.asp) 选择所有元素。
element p 选择所有

元素

element,element div,p 选择所有
元素和所有

元素。

element element div p 选择
元素内部的所有

元素。

element>element div>p 选择父元素为
元素的所有

元素。

element+element div+p 选择紧接在
元素之后的所有

元素。

element1~element2 p~ul 选择前面由

元素的每个

    元素。
[attribute] target 选择带有 target 属性的所有元素。
[attribute=value] target=_blank 选择 target="_blank"的所有元素。
[attribute~=value] title~=flower 选择 title 元素保护单词 "flower" 的所有元素。
[attribute~=value] lang¦=en 选择 lang 属性值以 "en" 开头的所有元素。
[attribute^=value] a[src^="https"] 选择 src 属性值以 "https" 开头的每个元素。
[attribute$=value] a[src^=".pdf"] 选择 src 属性值以 ".pdf" 结尾的每个元素。
[attribute*=value] a[src*="abc"] 选择 src 属性值中 "abc" 子串的每个元素。
:first-child p:first-child 选择属于父元素的第一个子元素的每个

元素。

:only-child p:only-child 选择属于其父元素的唯一子元素的每个

元素。

:nth-child(n) p:nth-child(2) 选择属于其父元素的第二个子元素的每个

元素。

:nth-last-child(n) p:nth-last-child(2) 同上, 从最后一个子元素开始计数。
:last-child p:last-child 选择始于其父元素最后一个子元素的每个

元素。

:first-of-type p:first-of-type 选择属于其父元素的首个

元素的每个

元素。

:only-of-type p:only-of-type 选择属于其父元素唯一的

元素的每个

元素。

:nth-of-type p:nth-of-type(2) 选择属于其父元素的第二个

元素的每个

元素。

:nth-last-of-type p:nth-last-of-type(2) 同上, 但是从最后一个子元素开始计数。
:last-of-type p:last-of-type 选择属于其父元素的最后一个

元素的每个

元素。



隐身(无痕)模式

水星浏览器支持使用隐身模式访问页面, 隐身模式下 不同浏览器间不共享缓存设置与cookies存储, 并且浏览器缓存数据仅会保留在内存中, 不会写出到磁盘上, 也不会从磁盘文件装载(除临时文件外) 。隐身模式使用非常简单, 由 水星铬浏览框.创建浏览器() 方法的第四个参数提供设置。
readme-64.png

隐身模式下所有的浏览器彼此间相互隔离不会共享缓存以及cookies数据, 但有一个例外清空, 如果一个浏览器是由另一个浏览器创建的它们将使用同一个缓存设置和cookies存储。由浏览器打开的浏览器是说用户在浏览器中点击链接时产生的浏览器。例如: 有 浏览器A 和 浏览器B , 浏览器A是通过 水星铬浏览框.创建浏览器() 方法创建的并且设置了隐身模式参数, 而浏览器B 是由用户在浏览器A中点击链接后产生的浏览器, 那么浏览器B将共享使用浏览器A的缓存设置以及cookies存储。 如果希望获取某一个浏览器的所有共享浏览器可以使用方法:  水星铬浏览框.取同源浏览器() 获得。

代理方案

水星浏览器支持使用类似 Google Chrome 一样的方式使用代理, 通过命令行参数传递代理信息。


    ---proxy-server=host:port
    指定用于请求的 HTTP/SOCKS4/SOCKS5 代理服务器。

    个人代理服务器使用以下格式:

    [<proxy-scheme>://]<proxy-host>[:proxy-port]

    其中<proxy-scheme>是代理服务器的协议, 并且是以下之一:

    "https" , "socks" , "socks4" , "socks5".

    如果省略 <proxy-scheme> , 则默认为: "http" 。 另请注意, "socks" 等同于 
    "socks5"

    一些例子:

    --proxy-server="foopy:99"
    使用HTTP代理"foopy:99"加载所有URL。

    --proxy-server="socks://foobar:1080"
    使用SOCKS v5代理"foobar:1080"加载所有URL。

    --proxy-server="socks4://foobar:1080"
    使用SOCKS v4代理"foobar:1080"加载所有URL。

    --proxy-server="socks5://foobar:66"
    使用SOCKS v5代理"foobar:66"加载所有URL。

    还可以通过添加前缀为不同的URL类型指定单独的代理服务器, 带有URL说明符的代理服务器:

    --proxy-server="https=proxy1:80;http=socks4://baz:1080"

    使用HTTP代理"proxy1:80"加载 https://* , 使用SOCKS v4代理"baz:1080"加载所有 http://* 。

    --no-proxy-server
    禁用代理服务器

    --proxy-auto-detect
    自动检测代理配置

    --proxy-pac-url=URL
    指定代理自动配置URL

如果代理请求授权将会触发事件 "浏览器请求用户身份验证" 。 如果参数 "是否为代理服务器" 为真, 则使用参数 "认证回调" 接口的提交方法提供身份验证信息。

  
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器请求用户身份验证逻辑型 
参数名类 型参考可空数组备 注
浏览器水星浏览器
认证源文本型
是否为代理服务器逻辑型
主机名称文本型
端口号整数型
文本型
认证方案文本型
认证回调水星认证
' 如果为代理服务器, 提交身份验证信息
如果真 (是否为代理服务器)
认证回调.提交 (, )


i支持库列表   支持库注释   
ecef水星浏览器支持库


Javascript 绑定

水星浏览器提供了两个Javascript内置方法以支持Javascript与浏览器的交互访问。

cefQuery

内置 javascript 方法  cefQuery 用于供 javascript 脚本向浏览器发起查询。命令的使用方法:

function shoutBrowser(){
        //向浏览器发起查询请求

        (function(){
                window.cefQuery(
                        request: "请求内容, 只能为string 类型",
                        persistent: false,  /*是否持久化*/
                        onSuccess: function(response) {
                                //回调接口, 浏览器已接受查询。

                                alert(response); //浏览器回复数据仍然为string类型。
                        },
                        onFailure: function(code, msg){
                                //回调接口, 浏览器拒绝了查询请求。
                                //参数|code、|msg| 包含了拒绝原因。

                                alert("failed: "+code + " hint: " + msg);
                        }
                );
        })();
}


发起查询请求后, 浏览器会将请求传递至事件 "脚本收到查询" 。
  
子程序名返回值类型公开备 注
_水星铬浏览框1_脚本收到查询逻辑型 
参数名类 型参考可空数组备 注
浏览器水星浏览器
框架水星框架
查询ID长整数型
请求文本型
持久性逻辑型
查询结果水星脚本查询回调
' 收到 Javascript 查询请求时触发此事件。



i支持库列表   支持库注释   
ecef水星浏览器支持库


参数 "请求" 是由javascript提供的查询信息。回复查询使用参数 "查询结果" 的接口方法:  查询结果.成功()

  
子程序名返回值类型公开备 注
_水星铬浏览框1_脚本收到查询逻辑型 
参数名类 型参考可空数组备 注
浏览器水星浏览器
框架水星框架
查询ID长整数型
请求文本型
持久性逻辑型
查询结果水星脚本查询回调
' 回复查询查询结果
查询结果.成功 (“aaaa!!”)


i支持库列表   支持库注释   
ecef水星浏览器支持库


如果查询不被认可, 则应使用使用参数 "查询结果"的接口方法:  查询结果.失败() 进行回复。

  
子程序名返回值类型公开备 注
_水星铬浏览框1_脚本收到查询逻辑型 
参数名类 型参考可空数组备 注
浏览器水星浏览器
框架水星框架
查询ID长整数型
请求文本型
持久性逻辑型
查询结果水星脚本查询回调
' 拒绝接受 JavaScript 的查询请求, 并告知拒绝原因。
查询结果.失败 (-100, “没有这个查询”)


i支持库列表   支持库注释   
ecef水星浏览器支持库



cefQueryCancel

内置 javascript 方法 cefQueryCancel 用于取消已发起的查询。

        //取消查询

        cefQueryCancel();



查询被取消后将会触发浏览器事件 "脚本查询已取消"

  
子程序名返回值类型公开备 注
_水星铬浏览框1_脚本查询已取消  
参数名类 型参考可空数组备 注
浏览器水星浏览器
框架水星框架
查询ID长整数型
调试输出 (“脚本查询已取消”, 查询ID)
' 当收到 Javascipt 发出的 cefQueryCancel 请求时调用此方法。



i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库



请求


uri-data

uri-data请求用于数据加载不会进行网络访问。使用 uri-data 可以将任意文本、HTML、图像、多媒体等内容放入浏览器中呈现。


  
子程序名返回值类型公开备 注
_按钮_演示_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
框架水星框架 
浏览器 = 水星铬浏览框1.取浏览器 (hwnd)
框架 = 浏览器.取主框架 ()
' 创建 uri-data 请求。uri-data 可以加载文本、HTML, 图像、多媒体等内容, 使用格式为:
' data:;base64,
' uri-data 只是一种数据格式, 本质上不算做请求, 所以不会产生网络事件。
框架.加载URL (取DataUri (到字节集 (“这是一个使用uri-data格式创建的HTML页面
), “text/html”))
子程序名返回值类型公开备 注
取DataUri文本型 
参数名类 型参考可空数组备 注
数据字节集
mime_type文本型
变量名类 型静态数组备 注
base64文本型 
如果真 (取字节集长度 (数据) > 0)
base64 = BASE64编码 (数据, 取字节集长度 (数据))
返回 (“data:” + mime_type + “;base64,” + base64)


i支持库列表   支持库注释   
ecef水星浏览器支持库



导航

导航请求用于浏览器跳转访问。

  
子程序名返回值类型公开备 注
_按钮_演示_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
框架水星框架 
浏览器 = 水星铬浏览框1.取浏览器 (hwnd)
框架 = 浏览器.取主框架 ()
' 导航请求
框架.加载URL (“https://www.google.com/”)


i支持库列表   支持库注释   
ecef水星浏览器支持库


正文

正文请求是比导航请求更复杂的请求, 作用同样用于浏览器跳转, 并可以支持设置请求方法(Method), 标头(HTTP-Header), 以及提交内容(PostData)等信息。

  
子程序名返回值类型公开备 注
_按钮_演示_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
框架水星框架 
请求水星请求 
浏览器 = 水星铬浏览框1.取浏览器 (hwnd)
框架 = 浏览器.取主框架 ()
' 使用请求对象创建请求
请求 = 创建请求 (“GET”, “https://www.chromium.org/”, “https://www.google.com”, , )
框架.加载请求 (请求)


i支持库列表   支持库注释   
ecef水星浏览器支持库


URL

url请求用于获取部分资源, 加载此请求浏览器不会产生跳转, 并且请求结果不会呈现至浏览器中。

  
子程序名返回值类型公开备 注
_按钮_演示_被单击  
变量名类 型静态数组备 注
浏览器水星浏览器 
框架水星框架 
请求水星请求 
请求结果水星URL请求 
浏览器 = 水星铬浏览框1.取浏览器 (hwnd)
框架 = 浏览器.取主框架 ()
' 发起URL请求, URL请求独立于浏览器网络事件, 并且可以获得请求结果。
请求 = 创建请求 (“GET”, “https://www.chromium.org/”, “https://www.google.com”, , )
调试输出 (请求.是否有效 ())
' 设置请求标志位, 用以控制请求行为。
请求.置标志值 (位或 ( #请求标志 .跳过缓存, #请求标志 .允许存储证书, #请求标志 .不要重定向))
请求结果 = 框架.发送URL请求 (请求, “”, “”)
调试输出 (“URL请求结果: ”, 请求结果.是否有效 (), 请求结果.取请求状态 (), 请求结果.取错误代码 ())
如果真 (请求结果.是否有效 ())
调试输出 (“响应数据: ”, 请求结果.取响应数据长度 (), 到文本 (请求结果.取响应数据 ()))


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库


浏览器无关url

浏览器无关请求是指不经过浏览器而发送的请求。

  
子程序名返回值类型公开备 注
_浏览器无关请求_被选择  
变量名类 型静态数组备 注
请求水星请求 
请求结果水星URL请求 
' 发起URL请求, URL请求独立于浏览器网络事件, 并且可以获得请求结果。
请求 = 创建请求 (“GET”, “https://www.chromium.org/”, “https://www.google.com”, , )
' 设置请求标志位, 用以控制请求行为。
请求.置标志值 (位或 ( #请求标志 .跳过缓存, #请求标志 .允许存储证书, #请求标志 .不要重定向))
请求结果 = 发送URL请求 (请求, , , )
调试输出 (“浏览器无关URL请求结果: ”, 请求结果.是否有效 (), 请求结果.取请求状态 (), 请求结果.取错误代码 ())
如果真 (请求结果.是否有效 ())
调试输出 (“浏览器无关URL响应数据: ”, 请求结果.取响应数据长度 (), 到文本 (请求结果.取响应数据 ()))


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库


POST

post请求用于向url提交数据。

  
子程序名返回值类型公开备 注
_Post_被选择  
变量名类 型静态数组备 注
请求水星请求 
请求结果水星URL请求 
提交元素水星提交元素 
响应水星响应 
' 创建POST请求
请求 = 创建请求 (“GET”, “http://127.0.0.1:19730/post-test”, , , )
请求.置方法 (“POST”)
' 设置自定义标头
请求.置标头列表 ( #TEST_TEST_HEADER )
' 设置请求关联的URL, 关联URL可以使用其cookies数据。
' 请求.置首要关联URL ()
' "https://www.jd.com/"
' 设置提交数据
提交元素 = 创建字节集提交元素 (到字节集 (“hello server!”))
' 提交文件
' 提交元素 = 创建文件提交元素 (资源路径+“\ecef_runtime\tests\urlrequest\test.txt”)
请求.添加提交元素 (提交元素)
' 设置请求标志位, 用以控制请求行为。
请求.置标志值 (位或 ( #请求标志 .跳过缓存, #请求标志 .允许存储证书, #请求标志 .不要重定向))
请求结果 = 发送URL请求 (请求, , , )
调试输出 (“URL请求状态: ”, 请求结果.是否有效 (), 请求结果.取请求状态 (), 请求结果.取错误代码 ())
如果真 (请求结果.是否有效 ())
调试输出 (“POST 响应数据: ”, 请求结果.取响应数据长度 (), 到文本 (请求结果.取响应数据 ()))


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库


对话框

在水星浏览器中有两种形式的对话框接口。提供文件选择器的文件对话框接口以及传递 javascript方法 alert、confrim、prompt的脚本对话框接口。


文件对话框

文件选择器对话框通常由 file 标签产生。用户点击了file标签后将会触发事件 "浏览器将要打开文件对话框"

  
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器将要打开文件对话框逻辑型 
参数名类 型参考可空数组备 注
浏览器水星浏览器
打开模式整数型
标题文本型
默认文件名文本型
过滤器文本型
选择过滤器整数型
对话框回调水星文件选择器



i支持库列表   支持库注释   
ecef水星浏览器支持库


如果希望向用户展示自定义文件对话框可以在此事件中返回真以替换系统对话框。

  
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器将要打开文件对话框逻辑型 
参数名类 型参考可空数组备 注
浏览器水星浏览器
打开模式整数型
标题文本型
默认文件名文本型
过滤器文本型
选择过滤器整数型
对话框回调水星文件选择器
调试输出 (“浏览器将要打开文件对话框”, 打开模式, 标题, 默认文件名, 过滤器, 选择过滤器)
' 返回假以使用系统对话框
' 返回 ()
' 返回真使用自定义文件对话框, 并使用参数 | 对话框回调 | 返回文件选择结果
' 提交文件选择结果
对话框回调.选择文件 (2, 资源路径 + “\ecef_runtime\tests\dialog\smiley.gif”)
返回 ()


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库



自动上传

通过编程方式向 file 元素标签提交选择文件。基于 Chrome 的安全策略限制使用 Javascript 访问文件元素标签会收到以下警告并导致访问无效。

File chooser dialog can only be shown with a user activation

一个解决的办法是通过向浏览器发送一个点击消息以激活 file 元素标签的显示功能, 代码如下。

  
子程序名返回值类型公开备 注
激活文件元素标签  
变量名类 型静态数组备 注
浏览器水星浏览器 
dom水星网页文档对象 
元素水星网页文档元素 
元素边界整数型0
DEVICE_SCALE_FACTOR双精度小数型 
dpi整数型 
x整数型 
y整数型 
hDesktop整数型 
hDC整数型 
浏览器 = 水星铬浏览框1.取浏览器 (hwnd)
' 为保持输入兼容性, 输入坐标应当适应屏幕缩放比例。
hDesktop = GetDesktopWindow ()
hDC = GetDC (hDesktop)
dpi = GetDeviceCaps (hDC, #LOGPIXELSY )
' 当前屏幕缩放比例因子
DEVICE_SCALE_FACTOR = 到数值 (dpi) ÷ 100
' 获取DOM结构
dom = 浏览器.取主框架 ().取文档对象 ()
' 找到 file 元素标签并获取边界信息
元素 = dom.查询元素 (“#avatar”)
元素边界 = 元素.取包围框 ()
' 向 file 元素标签发送鼠标事件以激活其显示功能。
x = 到整数 ( (元素边界 [1] + 元素边界 [3] ÷ 2) ÷ DEVICE_SCALE_FACTOR)
y = 到整数 ( (元素边界 [2] + 元素边界 [4] ÷ 2) ÷ DEVICE_SCALE_FACTOR)
浏览器.鼠标移动 (x, y, 假, #事件标志 .NONE)
浏览器.鼠标点击 (x, y, #点击事件 .鼠标左键, 假, 1, #事件标志 .LEFT_MOUSE_BUTTON)
浏览器.鼠标点击 (x, y, #点击事件 .鼠标左键, 真, 1, #事件标志 .LEFT_MOUSE_BUTTON)


i支持库列表   支持库注释   
ecef水星浏览器支持库



脚本对话框
脚本对话框是由 javascript 的 alert方法,confrim方法, prompt方法产生的对话框。 这些方法在浏览器中被调用后浏览器的 "浏览器脚本对话框将要打开" 事件。

  
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器脚本对话框将要打开逻辑型 
参数名类 型参考可空数组备 注
浏览器水星浏览器
页面URL文本型
对话框类型整数型
消息内容文本型
默认值文本型
对话框回调水星脚本对话框
禁止消息整数型



i支持库列表   支持库注释   
ecef水星浏览器支持库


事件的返回值决定了使用系统对话框还是使用自定义对话框。参数 "对话框类型" 指示了脚本对话框的类型,  参数 "消息内容" 和 "默认值" 分别提供了对应对话框类型的输入信息。如果希望使用自定义的对话框可参考以下情形:

  
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器脚本对话框将要打开逻辑型 
参数名类 型参考可空数组备 注
浏览器水星浏览器
页面URL文本型
对话框类型整数型
消息内容文本型
默认值文本型
对话框回调水星脚本对话框
禁止消息整数型
调试输出 (“浏览器脚本对话框将要打开”, 页面URL, 对话框类型, 消息内容, 默认值)
' javascript 执行 alert 、 confrim 、 prompt 等对话框方法时调用此事件。
' 参数 | 对话框类型 | 表示了对话框类型, 定义值为枚举常量: #脚本对话框.*
' 返回真以使用自定义对话框, 并通过参数 | 对话框回调 | 提交对话框结果
' 对话框回调.回复 (真, “yes!”)
' 返回 ()
' 返回假使用默认对话框
返回 ()


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库



网络

对于网络访问水星浏览器提供了丰富的处理时机。 浏览器导航时触发 "浏览器将要导航" 事件, 加载资源时触发 "浏览器将要加载资源" 事件, 重定向时触发 "浏览器资源重定向" 事件,  请求收到响应时触发 "浏览器资源请求收到响应" 事件, 资源加载完成时分别触发 "浏览器资源过滤器" 事件和 "浏览器资源加载完毕" 事件。 下面的通过几个应用场景来介绍这些事件的用法。


导航

导航是在浏览器加载新的URL时产生的事件,  如果希望阻止一些跳转链接的加载(例如, 广告, 弹出式页面等)可以在 "浏览器将要导航" 事件中完成。

  
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器将要导航逻辑型 
参数名类 型参考可空数组备 注
浏览器水星浏览器
框架水星框架
请求水星请求
是否为用户手势逻辑型
是否重定向逻辑型
变量名类 型静态数组备 注
url文本型 
url = 请求.取URL ()
调试输出 (“浏览器将要导航”, url, 是否为用户手势, 是否重定向)
' 浏览器开始导航前调用此事件。
' 阻止导航
如果真 (寻找文本 (url, “www.w3school.com.cn/html5/index.asp”, , ) ≠ -1)
返回 ()


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库



资源加载

想要关注浏览器的资源加载细节可在事件 "浏览器将要加载资源" 事件中进行。

  
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器将要加载资源整数型 
参数名类 型参考可空数组备 注
浏览器水星浏览器
框架水星框架
请求水星请求



i支持库列表   支持库注释   
ecef水星浏览器支持库


参数 "浏览器" 和 "框架" 分别代表了资源请求的来源。 "请求" 参数则包含了该资源请求的详细信息, 允许被修改。事件返回值决定了资源请求的处置方式。一些典型的用例场景:

  
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器将要加载资源整数型 
参数名类 型参考可空数组备 注
浏览器水星浏览器
框架水星框架
请求水星请求
变量名类 型静态数组备 注
url文本型 
url = 请求.取URL ()
调试输出 (“浏览器将要加载资源”, url)
' 修改 request 以重定向资源请求
如果真 (寻找文本 (url, “www.w3school.com.cn/htmldom/index.asp”, , ) ≠ -1)
请求.置URL (“https://developer.mozilla.org/zh-CN/docs/Web/HTTP”)

' 拦截请求
如果真 (寻找文本 (url, “www.w3school.com.cn/js/index.asp”, , ) ≠ -1)
调试输出 (“测试, 目标请求: ”, url, “已被拦截!!!”)
返回 ( #资源请求 .立即取消)

' 什么都不做, 放行资源
返回 ( #资源请求 .立即通过)


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库



重定向

当某些资源响应(Response)告知浏览器需要前往另一个地址进行获取时会产生事件 "浏览器资源重定向"。

  
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器资源重定向  
参数名类 型参考可空数组备 注
浏览器水星浏览器
框架水星框架
请求水星请求
响应水星响应
新地址文本型



i支持库列表   支持库注释   
ecef水星浏览器支持库


参数 "浏览器" 和 "框架" 是资源请求的来源。参数 "请求" 和 "响应" 包含了该资源请求的会话信息。 参数 "新地址" 为原响应(Response)告知浏览器更换访问的地址, 该地址可以被覆盖, 覆盖后浏览器将前往覆盖后的地址进行资源访问。

  
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器资源重定向  
参数名类 型参考可空数组备 注
浏览器水星浏览器
框架水星框架
请求水星请求
响应水星响应
新地址文本型
变量名类 型静态数组备 注
列表值水星列表型 
调试输出 (“浏览器资源重定向”, 新地址)
如果真 (寻找文本 (新地址, “www.itwitch.cc/ecef”, , ) ≠ -1)
新地址 = “https://www.google.com/”
返回 ()


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库



可选化资源过滤

可选化的资源内容过滤是指对资源内容进行检索过滤以及调整的过程, 资源过滤器对于于消除广告,和替换潜在不受欢迎的内容等很有帮助。在水星浏览器中通过事件 "浏览器资源过滤器" 和 "浏览器资源过滤器已就绪" 支持这项功能。

完成资源的可选化过滤需要先在 "浏览器资源过滤器" 事件中启用资源过滤器, 启用的方法是事件返回值。

  
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器资源过滤器逻辑型 
参数名类 型参考可空数组备 注
浏览器水星浏览器
框架水星框架
请求水星请求
响应水星响应
变量名类 型静态数组备 注
url文本型 
url = 请求.取URL ()
' 返回真以对指定的资源启用资源过滤器
如果真 (寻找文本 (url, , , ) ≠ -1)
返回 ()


i支持库列表   支持库注释   
ecef水星浏览器支持库


启用资源过滤器后, 浏览器将会在资源加载完成后触发 "浏览器资源过滤器已就绪" 事件。在此事件中完成资源的可选化过滤设置。

  
子程序名返回值类型公开备 注
_水星铬浏览框1_浏览器资源过滤器已就绪  
参数名类 型参考可空数组备 注
浏览器水星浏览器
过滤器水星资源过滤器
变量名类 型静态数组备 注
url文本型 
目标资源字节集 
替换资源字节集 
url = 过滤器.取URL ()
' 资源过滤器已准备就绪, 在此事件中完成对资源的可选过滤
' 对指定的资源进行过滤
如果真 (寻找文本 (url, , , ) ≠ -1)
' 获取目标资源
目标资源 = 过滤器.取资源 ()
' 替换目标资源
替换资源 = 读入文件 (资源路径 + “\ecef_runtime\tests\dom\smiley.gif”)
如果真 (取字节集长度 (替换资源) > 0)
' 用新的资源替换目标资源
过滤器.置资源 (替换资源, 取字节集长度 (替换资源))



i支持库列表   支持库注释   
ecef水星浏览器支持库


参数 "过滤器" 提供了资源过滤器操作接口。通过接口方法 "过滤器.取资源()" 获取原始资源, 在完成内容过滤后再使用接口方法 "过滤器.置资源()" 以将过滤后的资源提交回浏览器。



偏好/首选项(Preference)

水星浏览器和 Google Chrome 一样支持用户偏好 / 首选项(Preference) 设置。如果你希望配置一些默认的偏好设置到浏览器中可以参考下面这些用法。

检索首选项

  
子程序名返回值类型公开备 注
列举首选项  
变量名类 型静态数组备 注
浏览器水星浏览器 
首选项信息水星字典型 
首选项名称数组文本型0
i整数型 
类型整数型 
浏览器 = 水星铬浏览框1.取浏览器 (hwnd)
如果真 (浏览器.是否有效 ())
' 水星浏览器和 Google Chrome 一样支持偏好/首选项(Preference)设置。 如果需要设置一些默认的偏好设置到浏览器中可以参考以下用例。
' 关于一些可能受支持的首选项查询,参考手册: http://itwitch.cc/ecef/  偏好/首选项(Preference) 章节
' 获取所有首选项
首选项信息 = 浏览器.取所有首选项 ()
' 获取所有首选项名称
首选项名称数组 = 首选项信息.取所有键 ()
调试输出 (首选项名称数组)
' 打印首选项值
计次循环首 (取数组成员数 (首选项名称数组), i)
类型 = 首选项信息.取类型 (首选项名称数组 [i])
判断 (类型 = #值类型 .BOOL)
调试输出 (“首选项: ”, i, 首选项名称数组 [i], 首选项信息.取逻辑型 (首选项名称数组 [i]))
判断 (类型 = #值类型 .INT)
调试输出 (“首选项: ”, i, 首选项名称数组 [i], 首选项信息.取整数型 (首选项名称数组 [i]))
判断 (类型 = #值类型 .DOUBLE)
调试输出 (“首选项: ”, i, 首选项名称数组 [i], 首选项信息.取双精度小数型 (首选项名称数组 [i]))
判断 (类型 = #值类型 .STRING)
调试输出 (“首选项: ”, i, 首选项名称数组 [i], 首选项信息.取文本型 (首选项名称数组 [i]))
判断 (类型 = #值类型 .NULL)
调试输出 (“首选项: ”, i, 首选项名称数组 [i], “”)
判断 (类型 = #值类型 .DICTIONARY)
调试输出 (“首选项: ”, i, 首选项名称数组 [i], “<字典值>”)
判断 (类型 = #值类型 .LIST)
调试输出 (“首选项: ”, i, 首选项名称数组 [i], “<列表值>”)



计次循环尾 ()


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库



查找首选项

  
子程序名返回值类型公开备 注
查找首选项  
变量名类 型静态数组备 注
浏览器水星浏览器 
i整数型 
类型整数型 
通用值水星通用型 
浏览器 = 水星铬浏览框1.取浏览器 (hwnd)
如果真 (浏览器.是否有效 ())
' 查找首选项
如果真 (浏览器.是否存在首选项 (“enable_referrers”))
' 读取选项值
通用值 = 浏览器.取首选项 (“enable_referrers”)
调试输出 (通用值.是否有效 (), 通用值.取类型 (), 通用值.取逻辑型 ())



i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库



设置首选项

  
子程序名返回值类型公开备 注
设置首选项  
变量名类 型静态数组备 注
浏览器水星浏览器 
浏览器 = 水星铬浏览框1.取浏览器 (hwnd)
如果真 (浏览器.是否有效 ())
' 设置首选项
如果 (浏览器.可否设置首选项 (“enable_do_not_track”))
' 设置首选项
如果真 (浏览器.置首选项值 (“enable_do_not_track”, 创建通用值 ()))
调试输出 (“首选项: enable_do_not_track 设置成功!”)



调试输出 (“首选项: enable_do_not_track 无法设置!”)



i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库



设置用户偏好 / 首选项后当用户首次打开浏览器时将应用这些设置。关于首选项的详细信息可以查阅 Chromium 代码 pref_names.cc 中的介绍。

https://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/pref_names.cc?view=markup

下面是一些常见的首选项设置。

名称 描述
disable_screenshots 禁用屏幕快照加速器和扩展程序API
profile.ephemeral_mode 如果设置为true, 则在临时模式下创建配置文件, 并且不存储其配置文件, 仅会在内存中使用
intl.charset_default 设置网页中使用的默认字符编码, 缺少MIME字符集规范时
intl.accept_languages 创建HTTP时用于Accept-Languages HTTP标头的值
intl.static_encodings 显示用于不同语言环境的编码列表的值,语言环境它是从响应的字符串资源(即存储在资源包中的不可翻译部分)
settings.labs.mediaplayer 开启媒体播放器的逻辑值选项
settings.use_shared_proxies 逻辑值选项, 用于控制是否从共享网络中获取代理设置
plugins.migrated_to_pepper_flash Pepper Flash已禁用, 如果希望在浏览器中重新使用, 则启用此首选项
plugins.allow_outdated 逻辑值选项, 指示是否允许使用过时的插件
plugins.always_authorize 逻辑值选项, 指示是否始终允许插件获取授权
profile.default_zoom_level 默认的缩放级别
geolocation.enabled 逻辑值选项, 是否启用地理位置信息
disable_3d_apis 禁用3D API(WebGL, Pepper 3D)
profile.default_content_settings 适用于默认情况下的内容设置
enable_referrers 是否启用发送来源(referrer)地址
enable_do_not_track 是否发送DNT标头
gl_vendor_string GL_VENDOR字符串
gl_renderer_string GL_RENDERER字符串
gl_version_string GL_VERSION字符串
fullscreen.allowed 确定用户是否可以进入全屏模式
extensions.disabled 是否启用扩展程序
devtools.port_forwarding_enabled 逻辑值选项, 指示是否应打启用端口转发
devtools.port_forwarding_default_set 逻辑值选项, 指示是否已设置默认端口转发配置
devtools.port_forwarding_config 用于端口转发的port->location字典对
devtools.remote_enabled 指示是否启用远程开发工具调试
auth.allow_cross_origin_prompt 逻辑值选项, 指示是否允许跨域子内容请求
device_status.location 设备位置报告
browser.disk_cache_dir 指示磁盘缓存存储位置的字符串




服务器
水星服务器类型提供小容量的 HTTP / Websocket 会话服务。


创建服务器

  
子程序名返回值类型公开备 注
_按钮_创建服务器_被单击  
' 创建一个 HTTP-server 服务器。
创建服务器 (“127.0.0.1”, 9797, 10)
' 服务器创建成功后事件: 服务器启动就绪 将会执行。



i支持库列表   支持库注释   
ecef水星浏览器支持库


服务器创建成功后将会调用 "服务器启动就绪事件"

  
子程序名返回值类型公开备 注
_水星铬浏览框1_服务器收到请求  
参数名类 型参考可空数组备 注
服务器水星服务器
客户ID整数型
客户地址文本型
请求水星请求



i支持库列表   支持库注释   
ecef水星浏览器支持库



参数 "服务器" 代表了 HTTP-Server 角色, 提供会话功能接口。

对于 HTTP 请求服务器通过 "服务器收到请求" 事件提供处理时机。

  
子程序名返回值类型公开备 注
_水星铬浏览框1_服务器收到请求  
参数名类 型参考可空数组备 注
服务器水星服务器
客户ID整数型
客户地址文本型
请求水星请求
变量名类 型静态数组备 注
url文本型 
自定义响应内容字节集 
响应数据字节集 
url = 请求.取URL ()
调试输出 (“服务器收到请求”, 服务器.取地址 (), 客户ID, 客户地址, url)
判断 (寻找文本 (url, “/test-404-request”, , ) ≠ -1)
' 返回 404 响应
服务器.发送404响应 (客户ID)  ' 找不到目标资源
判断 (寻找文本 (url, “/test-500-request”, , ) ≠ -1)
' 返回 500 响应
服务器.发送500响应 (客户ID, “error info”)  ' 500 响应为服务器内部错误
判断 (寻找文本 (url, “/test-other-request”, , ) ≠ -1)
' 返回 自定义 响应
自定义响应内容 = 到字节集 (“customize response return !!”)
服务器.发送自定义响应 (客户ID, 200, “text/html”, 取字节集长度 (自定义响应内容), #TEST_TEST_HEADER )
服务器.发送原始数据 (客户ID, 自定义响应内容, 取字节集长度 (自定义响应内容))


' 发送 200 响应
响应数据 = 到字节集 (“200 response!!!”)
服务器.发送200响应 (客户ID, “text/html”, 响应数据, 取字节集长度 (响应数据))


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库


如果客户请求了 WebSocket(网页套接字) 连接服务器会将连接请求传递至 "服务器收到套接字请求" 事件交由宿主程序来决定接受或是取消连接。

  
子程序名返回值类型公开备 注
_水星铬浏览框1_服务器收到套接字请求逻辑型 
参数名类 型参考可空数组备 注
服务器水星服务器
客户ID整数型
客户地址文本型
请求水星请求
变量名类 型静态数组备 注
url文本型 
url = 请求.取URL ()
调试输出 (“服务器收到套接字请求”, 服务器.取地址 (), 客户ID, 客户地址, url)
' 收到 Websocket 连接请求
' 允许使用套接字访问
返回 ()


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库


接受客户连接事件 "服务器套接字已连接" 将会被调用, 在此事件中构建连接上下文, 之后服务器与客户的通讯将在 "服务器收到套接字消息" 事件中进行。

  
子程序名返回值类型公开备 注
_水星铬浏览框1_服务器收到套接字消息  
参数名类 型参考可空数组备 注
服务器水星服务器
客户ID整数型
消息内容字节集
消息长度整数型
变量名类 型静态数组备 注
自定义数据字节集 
调试输出 (“服务器收到套接字消息”, 服务器.取地址 (), 到文本 (消息内容), 消息长度)
' 发送 websocket 消息
自定义数据 = 到字节集 (“hello client!!!”)
服务器.发送套接字消息 (客户ID, 自定义数据, 取字节集长度 (自定义数据))


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库



网页套接字(WebSocket)

网页套接字类型提供了用于创建和管理 Websocket 连接以及通过该连接发送和接收数据的API接口。


使用 创建网页套接字() 方法来创建一个 Websocket。

  
子程序名返回值类型公开备 注
_按钮_创建_被单击  
套接字 = 创建网页套接字 ()
如果真 (套接字.是否有效 ())
调试输出 (“创建网页套接字失败!!!”)
按钮_连接.禁止 = 假
返回 ()


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库



发起连接

  
子程序名返回值类型公开备 注
_按钮_连接_被单击  
按钮_连接.禁止 = 真
套接字 = 创建网页套接字 ()
如果真 (套接字.是否有效 ())
调试输出 (“创建网页套接字失败!!!”)
按钮_连接.禁止 = 假
返回 ()

' 发起 Websocket 连接
套接字.连接 (“ws://127.0.0.1:9797/test-ws-conn”)


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库



如果连接被服务器接受事件 "网页套接字连接成功" 将会被调用。

  
子程序名返回值类型公开备 注
_水星铬浏览框1_网页套接字连接成功  
参数名类 型参考可空数组备 注
套接字水星网页套接字
调试输出 (“网页套接字连接成功”)


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库



发送数据

  
子程序名返回值类型公开备 注
_按钮_发送数据_被单击  
变量名类 型静态数组备 注
自定义数据字节集 
如果真 (套接字.是否有效 () 套接字.连接是否有效 ())
自定义数据 = 到字节集 (“hello server!!!!”)
套接字.发送 ( #套接字流类型 .字符串, 自定义数据, 取字节集长度 (自定义数据))


i支持库列表   支持库注释   
ecef水星浏览器支持库



收到数据

  
子程序名返回值类型公开备 注
_水星铬浏览框1_网页套接字数据到达  
参数名类 型参考可空数组备 注
套接字水星网页套接字
流类型整数型
流数据字节集
调试输出 (“网页套接字数据到达”, 流类型, 到文本 (流数据))


i支持库列表   支持库注释   
ecef水星浏览器支持库
spec特殊功能支持库



关闭连接

  
子程序名返回值类型公开备 注
_按钮_关闭_被单击  
如果真 (套接字.是否有效 () 套接字.连接是否有效 ())
套接字.关闭 ()


i支持库列表   支持库注释   
ecef水星浏览器支持库




[/e]

点评

猫神厉害。。。。牛   河北省秦皇岛市  发表于 2020-11-11 12:13

评分

参与人数 30好评 +25 精币 +60 收起 理由
明天自然醒 + 1 + 3 支持开源~!感谢分享
星情 + 1 YYDS~!
ko44 + 1 + 2 开源精神必须支持~
datunhao + 1 + 1 支持开源~!感谢分享
sdif000 + 1 + 1 支持开源~!感谢分享
roor + 1 支持开源~!感谢分享
爱易编程 + 1 支持开源~!感谢分享
路,也很迷忙 + 1 + 2 神猫厉害!!!
我爱钱钱钱 + 1 + 2 奉上小小红包希望笑纳
fasdfasfa + 1 + 2 大神,请收下我的膝盖
gdj528 + 1 + 2 感谢分享,很给力!~
webyjh + 1 感谢分享,很给力!~
185553456 + 1 + 2 感谢分享,很给力!~
保奇 + 1 支持开源~!感谢分享
城南花已开 + 1 + 4 感谢分享,很给力!~
shizhong0117 + 1 支持开源~!感谢分享
huan21ni + 1 + 2 一直关注
1185384801 + 1 + 3 感谢分享,很给力!~
yjd + 1 + 2 支持开源~!感谢分享
chp8407 + 1 感谢分享,很给力!~
斜飞 + 1 支持开源~!感谢分享
外星人群控 + 1 + 3 3年忠实用户
默念、 + 1 + 4 猫神厉害。。。。牛
jxfa0086768 + 1 + 2 感谢分享,很给力!~
aismy + 1 + 4 猫老大棒棒的
afd + 1 + 3 支持开源~!感谢分享
已注销541904 + 1 + 2 用心了,一定好好学习,天天向上
huningli38 + 1 + 2 支持开源~!感谢分享
zxx120 + 1 + 2 支持开源~!感谢分享
大汉子 + 1 + 5 新技能已get√

查看全部评分


本帖被以下淘专辑推荐:

结帖率:74% (14/19)

签到天数: 12 天

发表于 2024-9-18 08:08:09 | 显示全部楼层   湖北省武汉市
旪彯っ旪楿儭 发表于 2024-9-18 02:40
用JS脚本取返回值然后在判断

水星通用型=水星铬浏览框1.取主框架 ().执行脚本2 (“document.documentElem ...

还真是可以,多谢大老
回复 支持 反对

使用道具 举报

结帖率:100% (5/5)

签到天数: 7 天

发表于 2024-9-18 02:40:33 | 显示全部楼层   内蒙古自治区乌兰察布市
本帖最后由 旪彯っ旪楿儭 于 2024-9-18 02:43 编辑
766711831 发表于 2024-8-17 20:19
怎么取滚动条位置,判断网页是不是到底最底部

用JS脚本取返回值然后在判断

水星通用型=水星铬浏览框1.取主框架 ().执行脚本2 (“document.documentElement.scrollTop”, “demo_samples”, 0, 异常信息)
调试输出(水星通用型.取整数型())

回复 支持 1 反对 0

使用道具 举报

发表于 2024-8-25 14:42:17 | 显示全部楼层   河南省三门峡市
终于的等到你
回复 支持 反对

使用道具 举报

结帖率:86% (6/7)

签到天数: 1 天

发表于 2024-8-21 09:06:24 | 显示全部楼层   广东省深圳市
在哪下载啊
回复 支持 反对

使用道具 举报

结帖率:74% (14/19)

签到天数: 12 天

发表于 2024-8-17 20:19:13 | 显示全部楼层   湖北省潜江市
怎么取滚动条位置,判断网页是不是到底最底部
回复 支持 反对

使用道具 举报

发表于 2024-8-17 18:40:23 | 显示全部楼层   江西省抚州市
馒头小子 发表于 2022-3-19 21:17
怎么设置才能正常?我的被放大了300%

属性里面设置高DPI缩放替代
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 3 天

发表于 2024-8-11 15:47:13 | 显示全部楼层   山东省烟台市
太牛了!!!
回复 支持 反对

使用道具 举报

结帖率:20% (5/25)

签到天数: 1 天

发表于 2024-7-27 20:45:38 | 显示全部楼层   黑龙江省鸡西市
水星支持库
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)

签到天数: 8 天

发表于 2024-7-20 12:53:26 | 显示全部楼层   河北省石家庄市

比精易WEB强太多了
回复 支持 1 反对 0

使用道具 举报

发表于 2024-7-18 11:18:01 | 显示全部楼层   北京市北京市
牛的牛的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表