Skip to content

Latest commit

 

History

17 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FloatyJS

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.jsfloaty-slave.jsfloaty.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-rightbottom-lefttop-righttop-left
  • data-dark:是否启用暗色浮窗
  • data-close-on-outside-click:点击外部是否关闭
  • data-page-info:宿主页面提供的补充说明
  • data-screenshot-library-url:截图依赖地址

data-page-info 很适合放页面业务摘要,例如“用户正在查看订单详情”或“当前页面是商品套餐对比页”。不要放密钥、token、身份证号、手机号完整值等敏感信息。

宿主侧 API

宿主页面加载后会暴露:

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 侧 API

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 提供的是上下文桥,不是权限隔离层。真正的权限控制仍应由宿主系统和后端服务负责。

About

一个轻量级且可定制的悬浮按钮和窗口组件.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Contributors

Languages