FloatyJS 是一个原生 JavaScript 浮窗工具,用于在宿主页面中嵌入 iframe 浮窗,并让 iframe 页面获取宿主页面上下文。
它主要服务 AI 助手类场景:宿主页面提供按钮和页面信息,iframe 中的助手页面可以请求页面文本、焦点元素、鼠标所在元素、截图和组合快照。
FloatyJS 适合:
- 在任意页面右下角挂一个 AI 助手按钮
- 用 iframe 承载助手页面或客服页面
- 让助手获取当前页面摘要和用户所在位置
- 在不改造宿主业务框架的情况下接入浮窗
- 为 AI 工具提供页面上下文和截图
不适合:
- 复杂后台布局系统
- 需要深度接管宿主页面路由的场景
- 需要跨域读取敏感表单值的场景
- 替代完整前端应用框架
floaty-main.js:宿主页面入口,负责悬浮按钮、iframe 浮窗、页面上下文采集、截图和通信floaty-slave.js:iframe 页面入口,负责向宿主页面请求上下文floaty.js:兼容入口,转发到主入口index.html:宿主页演示台iframe.html:从页演示台serve.py:本地静态服务器脚本
新接入优先使用 floaty-main.js 和 floaty-slave.js。floaty.js 只用于兼容旧入口。
宿主页面添加:
<script
type="module"
src="./floaty-main.js"
data-theme-color="#111827"
data-button-text="AI"
data-tooltip-text="点击打开 AI 浮窗"
data-window-width="1000px"
data-window-height="800px"
data-window-title="AI 助手"
data-target-link="./iframe.html"
data-position="bottom-right"
data-close-on-outside-click="true"
defer
></script>iframe 页面添加:
<script type="module" src="./floaty-slave.js"></script>接入后,宿主页面会出现一个浮动按钮。点击按钮会打开 iframe 浮窗。
常用配置:
data-theme-color:悬浮按钮颜色data-button-text:按钮文本data-tooltip-text:按钮提示data-window-width:浮窗宽度data-window-height:浮窗高度data-window-title:浮窗标题data-target-link:iframe 地址data-position:按钮位置,支持bottom-right、bottom-left、top-right、top-leftdata-dark:是否启用暗色浮窗data-close-on-outside-click:点击外部是否关闭data-page-info:宿主页面提供的补充说明data-screenshot-library-url:截图依赖地址
data-page-info 很适合放页面业务摘要,例如“用户正在查看订单详情”或“当前页面是商品套餐对比页”。不要放密钥、token、身份证号、手机号完整值等敏感信息。
宿主页面加载后会暴露:
window.FloatyMain
window.floaty常用方法:
window.FloatyMain.open()
window.FloatyMain.close()
window.FloatyMain.toggle()
window.FloatyMain.setPageInfo("用户正在查看订单详情")
window.FloatyMain.getPageInfo()
window.FloatyMain.syncPageText()
window.FloatyMain.getState()
window.FloatyMain.destroy()如果宿主页面内容发生变化,可以调用 setPageInfo() 或 syncPageText() 让 iframe 获取最新上下文。
iframe 页面加载后会暴露:
window.FloatySlave常用方法:
await window.FloatySlave.getPageText()
await window.FloatySlave.getFocusContext({ depth: 5 })
await window.FloatySlave.getPointerContext({ depth: 5 })
await window.FloatySlave.getInteractionContext({ depth: 5 })
await window.FloatySlave.captureScreenshot({ includePointer: true })
await window.FloatySlave.getAISnapshot({ depth: 5, includeScreenshot: true })AI 助手通常优先使用 getAISnapshot(),它会组合页面文本、焦点上下文、鼠标上下文和可选截图。
FloatyJS 可以采集:
- 当前页面纯文本
- 当前页面标题和 URL
- 当前焦点元素及祖先链
- 当前鼠标位置元素及祖先链
- 页面截图
- 宿主页面补充说明
上下文采集应服务于明确的用户需求。不要为了“信息更全”无差别传递敏感内容。
iframe 可以请求宿主页面截图:
const screenshot = await window.FloatySlave.captureScreenshot({
includePointer: true,
fullPage: false,
format: "image/png",
scale: 1
})浏览器没有稳定 API 能直接把系统鼠标指针截进 DOM 截图。includePointer: true 时,FloatyJS 会根据最近一次鼠标位置叠加模拟指针。
截图可能包含用户正在查看的页面内容。调用前应确认场景确实需要截图,且不要把截图发送到无关第三方。
主从页面通过 postMessage 通信,统一 envelope:
{
"namespace": "floatyjs",
"version": "2.0.0",
"source": "floaty-main",
"target": "floaty-slave",
"type": "request",
"action": "page:getScreenshot",
"requestId": "1711111111111-abcd1234",
"payload": {},
"success": true,
"error": null,
"sentAt": "2026-03-22T12:34:56.000Z"
}调用方应通过 requestId 关联请求和响应,不要依赖消息顺序。
运行:
python serve.py打开:
http://127.0.0.1:8000/index.html
演示页包含宿主控制台、iframe 控制台、截图预览和 AI Snapshot 演示。
- iframe 地址应来自可信来源
- 不要把敏感表单值写入
data-page-info - 跨域使用时要明确允许的消息来源
- 截图和页面文本可能包含隐私信息
- 销毁浮窗时调用
destroy()清理事件监听
FloatyJS 提供的是上下文桥,不是权限隔离层。真正的权限控制仍应由宿主系统和后端服务负责。