向任意网页注入自定义 CSS 样式、JavaScript 代码和操作按钮
JustZix 让你可以自动向选定网页注入自己的 CSS 和 JavaScript,并定义操作按钮(按需执行代码片段的快捷方式)。
https://justzix.com/* 的「justzix.com」目录。可以一键启用/禁用整个目录。每个集合以及每个分组都可以拥有自己的附加 URL 模式列表(chip-input)。列表为空时 —— 元素在目录模式匹配的所有地方生效。当你设置如 https://justzix.com/admin/* 时 —— 元素仅在 admin 子页面上生效。
| 目录模式 | 集合模式 | 生效于 |
|---|---|---|
https://justzix.com/* | (空) | 整个 justzix.com 域名 |
https://justzix.com/* | https://justzix.com/admin/* | 仅 /admin/ 区域 |
https://justzix.com/* | https://justzix.com/produkty/*https://justzix.com/koszyk | 仅产品子页面 + 购物车 |
*://localhost:*/* | *://localhost:3000/* | 仅端口 3000(dev) |
对于新用户,JustZix 内置了交互式教程,带你一步步构建一个完整的方案 —— 从 folder,经过 group 和 rule 集,到 CSS/JS 代码和一个操作按钮。提示以气泡形式出现在面板的相应元素旁边。
如何启动:
在「教程中心」窗口中选择一个教程并点击开始。教程过程中:
通过右键点击扩展图标 → 「选项」,或点击图标 → 「编辑面板」按钮进入。
小圆形按钮自动出现在与任何目录匹配的页面上。默认显示文字 ZIX,但每个目录可以有自己的标签。
目录标签:在目录栏最左侧(color picker 旁边)有一个用于按钮标签的文本字段。强制限制:最多 3 个字符,始终大写(输入时立即转为大写)。该字段接受字母和数字 —— 示例:ZIX、QA、DEV、ADM、X。多个目录匹配时取第一个设置了标签的目录的标签;其余被忽略(空字段 = fallback 到 ZIX)。
颜色状态(品牌调色板):
目录颜色:如果在目录上设置了 color picker,匹配页面上的浮动按钮会采用该颜色。「mixed」和「off」状态会自动调节饱和度。多个目录匹配时取第一个设置了颜色的目录的颜色。
进入编辑面板后,扩展会打开仪表板 —— 一个带有库概览和快捷入口的主页。此前面板会自动选中列表中的第一个目录;现在取而代之的是一个总览。
仪表板可通过侧栏中的点击 logo,以及通过每个编辑器(目录、分组、集合)面包屑栏上的「主页」图标进入。仪表板本身的标题也有一个「主页」图标 —— 点击它会刷新数据(从 storage 重新加载库并重新渲染仪表板)。
仪表板采用固定行的卡片布局:
chrome.storage.local 内存占用,以及最近一次云备份的日期。「最新示例」和「来自博客」卡片从项目网站获取内容;当 endpoint 不可用时(例如离线),这两张卡片会被隐藏。每次进入仪表板时都会重新检查扩展版本。
编辑模式下的左侧面板以层级显示目录 —— 可以展开每个目录查看其集合并进入编辑特定集合。
| 元素 | 动作 |
|---|---|
| 展开箭头 | 展开/折叠集合或分组列表(在会话间记住) |
| 点击目录名称(已折叠) | 选中目录,打开 Folder editor 并展开其分组/集合 |
| 点击已选中的目录 | 切换:折叠(再次点击重新展开)—— 分组同理 |
| 点击分组名称(已折叠) | 选中分组,打开 Group editor 并展开其集合 |
| 点击集合名称 | 打开单个集合视图(Rule editor) |
| 目录旁的复选框 | 启用/禁用整个目录(级联到分组及其激活的集合) |
| 分组旁的复选框 | 启用/禁用分组(级联到其激活的集合) |
| 集合旁的复选框 | 独立控制单个集合 |
| 目录/分组/集合旁的状态 ●/○ | 激活:● 激活,○ 不激活(强制禁用) |
| C J A U 集合旁 | 内容标志:C = 有 CSS,J = 有 JavaScript,A = 有操作,U = 有自有 URL 模式。仅当相应字段非空时出现。 |
| 左侧颜色条 | 目录颜色通过 box-shadow inset 绘制 —— 不挤动 folder 名称的位置(有颜色和无颜色的 folder 对齐) |
| drag&drop 句柄 | 用鼠标抓取并拖动以更改顺序 |
expandedFolders、expandedGroups)。
将鼠标悬停在目录、分组或集合上 —— 左侧会出现 drag&drop 句柄。用鼠标抓取并拖动:
侧栏与编辑器之间的垂直条隐藏左侧面板 —— 当你需要更多编辑器空间时很有用。状态在会话间记住。显示/隐藏后 CodeMirror 自动更新其宽度。
每个编辑器(CSS、JS、操作代码)下方有一个带垂直拖动句柄的水平条。用鼠标抓取并向下拖动以扩大编辑器。最小高度 80px,最大不限 —— 页面随内容自然滚动。
在每个 CodeMirror 代码编辑器上方 —— 集合卡片中的 CSS 和 JavaScript 以及操作编辑器中的「JS 代码」—— 都有一个搜索栏:文本字段和带放大镜图标的按钮。
n / 共计 格式的匹配计数器。| 快捷键 | 动作 |
|---|---|
Enter | 搜索(新查询)或转到下一个结果(查询未变时) |
Shift+Enter | 上一个结果 |
Ctrl+Alt+→ / Ctrl+Alt+← | 下一个 / 上一个结果 —— 在编辑器和搜索字段中均可用 |
Ctrl+Alt+F | 从代码编辑器将焦点移到搜索字段 |
Esc | 清除搜索字段 |
URL 模式定义目录在哪些页面上激活。
| 模式 | 匹配 |
|---|---|
https://justzix.com/admin | 仅这个精确的 URL |
https://justzix.com/* | justzix.com 上的所有页面 |
https://*.justzix.com/* | 所有子域名和页面 |
*://localhost:*/* | 所有本地应用 |
https://example.com/admin/* | 仅 /admin/ 区域和子页面 |
*example* | 任何包含 "example" 的 URL |
?id=123)和 hash(#section),除非你将它们写进模式中。
每个集合有两个独立的标志:
| 标志 | 含义 |
|---|---|
| 激活 ● | 此集合是否由目录以及分组的开关控制(两个层级都级联到 active rule)。启用目录或分组会启用其中所有激活的集合。 |
| 启用 ✓ | 当前状态:集合现在是否被注入到页面上。 |
切换目录 → 改变其分组中所有 active rule 的 enabled
切换分组 → 改变该分组所有 active rule 的 enabled
切换集合 → 仅改变该集合的 enabled
带 激活:否(badge ○)的规则在级联中被跳过 —— 你只能手动控制它们,与 folder 和分组的状态无关。
激活:否 • 启用:手动控制
集合不响应整个目录的启用。你只能手动控制它。适合不想批量启用的实验性修改。
激活:是 • 启用:是
标准设置。启用/禁用目录也会控制此集合。
激活:是 • 启用:否
集合「接入」到目录,但暂时禁用。下次点击目录的主开关会再次激活它。
| 动作 | 效果 |
|---|---|
| 左键点击 | 切换所有匹配的目录(启用/禁用) |
| 右键点击 | 打开带目录和集合列表的面板 |
| 拖动 | 移动位置(按窗口记住) |
在展开的面板(右键)中你可以:
actionBar.enabled(持久,传播到编辑面板)面板仅显示激活的集合(●)—— 独立的(○)为求简洁被隐藏。当 folder 只有一个名为「默认」的分组时,分组标题被省略 —— 只见集合。
点击 Chrome 扩展栏中的 JustZix 图标会打开 popup 小部件 —— 当前标签页的紧凑控制面板。自上而下:
actionBar.enabled)。在一个 workspace 中你可以有多个操作栏 —— 每个有自己的名称、方向、背景色、自己的按钮集和按浏览器窗口独立的位置。栏可以分配给folder、分组或单个集合(决定可见性和级联)。
在目录、分组或集合的编辑器中有一个按钮 「操作栏 (N)」。点击打开栏管理 modal。在 modal 中:
barId 聚合它们的操作)。集合卡片「操作」标签页中的每个操作都有一个下拉框 「操作栏」 —— 你从该集合可见的栏列表(集合自有的栏 + 分组的栏 + folder 的栏)中选择目标栏。
拖动栏时,扩展会检测相邻栏和浮动按钮在 ≤ 12 px 距离内的边缘。会出现 sticky 视觉指示器,松开后栏会连接成一个连接组。之后:
__float 作为 pseudo-bar)。右键点击栏的 drag handle → context menu:
在栏编辑模式下此菜单被静音;此时在标签上右键会给出「删除标签」选项。
对于操作栏的永久启用/禁用(无需 F5),扩展提供三个入口,全部映射到 storage 中相同的 actionBar.enabled —— 从一个地方更改会传播到编辑面板和其他 UI:
actionBar.enabled。actionBar.enabled = false —— 栏完全不渲染,状态在设备间同步(sync),在编辑面板中可见。barsHidden[barId] = true —— 栏消失直到 F5 / 关闭窗口。从 popup/floating panel 启用会自动清除此 runtime hide。操作栏编辑模式可通过三种方式开启:快捷键 Ctrl+Alt+S(从页面任意位置生效)、扩展 popup 小部件中的切换器,以及 Chrome context menu(右键 →「操作栏编辑模式」)。屏幕顶部会出现一个信息栏;再次使用任一切换器退出该模式。
在编辑模式下,元素的正常工作被暂停(点击不触发代码,字段不接受焦点)—— 取而代之,元素可以排布和缩放:
Ctrl+点击 = 添加/取消选择;点击空白区域或 Esc = 取消全选。Shift+在空白区域拖动 = 范围选择(矩形)。Delete 键一次删除所有选中的标签;在标签上右键给出「删除标签」选项;标签编辑器中也有「删除」按钮。操作元素在编辑面板中删除(它们属于规则)。flow):移除元素的自定义位置和大小以及所有标签(带确认)。Ctrl+Z 撤销最后一次更改(移动、调整大小、添加/编辑/删除标签、重置)。历史涵盖当前编辑会话。编辑模式是「硬性」的:移动和调整大小会对齐到 8 px 网格,元素无法拖出栏或放在另一个元素上 —— 碰撞时两个元素(移动的和它下面的)都获得红色边框,松开后元素回到先前的位置。栏无法缩小到使元素位于外部;当新元素或标签不适合栏时,栏画布会自动扩大。在编辑模式下右键点击栏不显示「隐藏/断开栏」菜单。
栏布局模式:栏以 flow 模式启动(经典 flexbox —— 元素一个接一个,垂直或水平)。第一次移动或缩放元素会将栏转换为 custom 模式(自由定位的画布)—— 视觉上无变化,因为当前布局被快照为起点。
custom 模式下的位置和大小(bar.layoutMode、bar.size、action.layout、action.size)被永久保存并在设备间同步 —— 与栏在页面上的「浮动」位置不同,后者仍按浏览器窗口保存。
每个操作都有一个类型 —— 由集合卡片中每个操作开头的下拉框选择。有 6 种类型可用:
| 类型 | UI | 何时触发代码 |
|---|---|---|
| BUTTON | 带最多 6 个字符 label 的可点击按钮 | 用户点击 |
| SELECT static | 栏风格的自定义下拉框 —— 选项在 modal 中配置 | 选择选项(value = option.value) |
| SELECT js | 原生 <select> —— 你的代码填充选项并绑定处理器 | 渲染时执行一次($el = <select>) |
| INPUT | 带 placeholder 的文本字段(单行) | change(Enter 或 blur) |
| SLIDER | 带 label + 值显示的滑块 <input type="range"> | change(松开鼠标 / Enter),value = 数字 |
| TEXTAREA | 多行字段 —— Enter 是正常换行(不触发代码) | change(blur —— 离开字段) |
| TOGGLE3 | 3 状态 segmented control(radio 风格)—— 3 个迷你按钮,一个活动 | 点击非活动状态,value = 活动状态的 state.value,外加 scope 中的 stateIdx 和 stateLabel |
静态文本标签不是操作类型 —— 在编辑模式下直接在栏上添加(见「栏编辑模式」→ 标签)。
value、$el(DOM 元素)、$action({ id, label, type, el });对 TOGGLE3 额外有 stateIdx(0-2)和 stateLabel。点击 SELECT 类型操作卡片中的 「选项 (N)」 打开 modal:
<select>)。{ name, value }。name = 用户看到的,value = 作为变量 value 进入 JS 的。<option> 的背景(js variant)action.id,带复制按钮 + 示例 JS selector。::placeholder 不可内联设置样式)。min < max。(min+max)/2。change(松开鼠标 / Tab / Enter)时执行。value = 数字值。\n 表示换行)。change(blur,不是 Enter —— textarea 中的 Enter 是正常换行)时执行。用户离开字段 → 保存值并触发代码。value = 含换行符的 string。value 传给代码的 string)。默认 label:OFF / MID / ON。colorText)。value(state.value,fallback 到 state.label)、stateIdx(0-2)、stateLabel、$el(容器 div)。选择 / 值 / 滑块位置 / textarea 内容 / toggle3 活动状态会按操作自动记住。F5 后值恢复;关闭标签页并重新打开它后(在与规则匹配的页面上)也恢复。每个 action.id 单例 —— 一个值,与具体 URL 无关。
每种类型 memory 中的值格式:
Storage:
sessionStorage —— 同步、F5-safe、每个标签页。chrome.storage.local.actionMemory[id] —— 跨标签页、durable。无跨设备同步:memory 保留在本地。两台电脑可以有不同的值(如每个用户不同的过滤器)。
sessionStorage 可被页面脚本读取(同 origin)。对于敏感数据不要使用 INPUT —— 改为直接在集合的「JS 代码」字段中写入值。
每个操作都有不变的 action.id(格式 a_<base36>_<random>)。在集合卡片中,每个操作旁有一个带行号的 badge —— 点击将完整 ID 复制到剪贴板,tooltip 显示完整 ID。
在用户 JS 中通过 data-jz-action-id 引用:
const el = document.querySelector('[data-jz-action-id="a_mp1deeq3_uimd8l"]');
el.value = 'nowa wartość';
el.dispatchEvent(new Event('change'));
或通过 window.JZ helper —— 见从 JS 编程式调用操作。
在任意页面上右键 → JustZix:
Ctrl+Alt+S 和 popup 中切换器之外的第三个入口。actionBar.enabled 状态。窗口子菜单在以下情况重建:tabs.onActivated、tabs.onUpdated(URL 更改)和 folders/groups/rules/actionBars/cssPanes/jsPanes/jsConsoles/outputConsoles/floatingHidden 的 storage.onChanged。TEMP 子菜单是静态的(始终 4 个项)。
扩展提供四种类型的浮动窗口,注入到页面上,与操作栏并列。每个窗口分配给 folder、分组或集合(像操作栏一样级联继承可见性),并出现在 URL 匹配的页面上。
管理:在 folder / 分组 / 集合的编辑器中你会找到一个按钮 「窗口 ▾ (N)」。点击展开带 4 种类型的菜单 —— 你选择类型,打开带该级别窗口列表的 modal(加上从上层继承的窗口)。你添加、命名、上色、删除。
| 类型 | 颜色 | 用途 |
|---|---|---|
| CSS pane | 绿色 | 作为 <style> 实时注入的 CSS textarea |
| JS pane | amber | 代码变化时执行的 JS textarea |
| JS Console | 紫色 | REPL —— 你输入代码,Ctrl+Enter 执行,output 在下方 |
| Output Console | 翡翠绿 | 只读的页面日志查看(console.* + 错误) |
带 CSS 文本字段的浮动窗口。每次更改(短暂停顿后)都会更新注入的 <style> —— 你实时看到效果。内容按浏览器标签页记住(在 F5 后存活,关闭标签页时消失)。适合在不保存到规则中的情况下快速测试 CSS。
在页面上下文中执行的 JavaScript 文本字段。代码在变化后(带延迟)或手动用 ▶ Run 按钮 / 快捷键 Ctrl+Enter 运行。执行错误显示在代码下方的红色条中。当代码自上次运行以来已更改时,Run 按钮亮黄色(「dirty」状态)。
页面中完整的控制台。你在底部字段输入代码,Ctrl+Enter(或 ▶)执行,结果追加到上方的日志区域。功能:
console.log/warn/error/info 调用显示在日志中(按类型着色)。Input、output 和历史按标签页记住。控制台在页面的 MAIN world 中执行代码 —— 你可以访问页面的所有变量和函数。
只读的日志查看 —— 自动捕获页面上发生的所有事情:console.log/warn/error/info/debug、未捕获的异常、未处理的 Promise rejection、网络流量以及对 dataLayer 的 push,还有你自己的 logger window.JUSTZIX.*。与 JS Console(你自己输入代码)不同 —— 这里日志自己流入。
窗口分为 6 个标签页,每个带条目计数器(badge):
| 标签页 | 内容 |
|---|---|
| All | 所有来源的所有条目,按时间顺序 |
| JZconsole | 仅你的 logger window.JUSTZIX.* |
| Console | 仅页面的标准 console.log/info/warn/error/debug |
| Network | 页面的网络请求(通过 chrome.webRequest) |
| Errors | 未捕获的异常和 Promise rejection —— 带可展开的详情 |
| DataLayer | 对 window.dataLayer(GTM)的 push + 对象的实时预览 |
标签页和搜索字段之间有一个过滤器栏,它根据选定的标签页变化:
log、info、warn、error、debug。取消勾选级别 → 行从预览中消失。过滤器栏下方有一个始终可见的搜索字段。实时过滤活动标签页的条目(片段匹配,不区分大小写)。Esc 清除字段。
console.* 条目默认折叠 —— 显示缩短的预览(如 [PickupMap][2026-05-16T15:25Z] AUTO_SELECTION_SKIPPED: {reason: 'Lower priority source', …})。点击展开完整参数(对象/数组作为可展开的 JSON 树),类似 DevTools 控制台。
Network 通过 chrome.webRequest 捕获请求(manifest 中的 webRequest 权限)。每个条目显示方法、URL、状态、资源类型、大小、持续时间、远程地址(Remote address)和发起者(Initiator)等。请求缓冲区在后台维护,因此窗口打开前的条目也会出现。
DataLayer 窗口分为两列:
dataLayer.push(...) 调用按事件顺序的流。window.dataLayer 对象的实时内容,作为索引化(0:、1:、…)的可展开 JSON 树 —— 你深入嵌套数据,类似 DevTools 中的对象检查器。快照在每次 push 后更新。右列标题中有展开全部 / 折叠全部按钮 —— 递归作用于整棵树。对 JustZix 自身 UI 的点击(展开树节点、窗口按钮)不会进入此标签页。如果页面收集 click 事件(例如 GTM auto-event),点击窗口会生成对 dataLayer 的 push 并重置树的展开状态 —— 扩展会识别此类 push 并不予报告(页面真实的 window.dataLayer 保持不变)。
Output Console 提供从你的代码(JS pane、操作、页面代码)记录日志的全局 API:
JUSTZIX.log('zwykły log');
JUSTZIX.warn('ostrzeżenie');
JUSTZIX.error(new Error('błąd')); // 显示 stack trace
JUSTZIX.info({ obj: 1, arr: [2,3] });
JUSTZIX.debug('szczegóły'); // 默认隐藏(过滤器)
可用别名:
window.JUSTZIX —— 主要的,始终可用window.__JUSTZIX__ —— 始终可用的别名window.JZ —— 别名,仅当页面没有自己的 window.JZ 时(某些页面,如 Google Ads,占用了这个名称)Output Console 出现后,你会在日志中看到一行欢迎消息,告知该页面上哪个别名可用。
console.log/warn/error/info/debug(...) —— 也透传到正常的 DevTools 控制台(我们不阻止)window.JUSTZIX.*(...) —— 你的专用通道(不进入 DevTools)throw new Error(...))—— 显示为带错误位置的红色.catch 的 Promise.reject(...)fetch/XHR 请求错误不进入 Errors 标签页(它们不是 JS 异常)—— 你会在状态 4xx/5xx 后的 Network 标签页中找到它们。我们不捕获 CSP 违规或 Chrome 内部警告。
Ctrl+Shift+H 打开一个可移动的快速帮助窗口 —— 在页面上使用 JustZix 的指南:全局快捷键、窗口内快捷键、Output Console、用鼠标操作窗口、操作栏编辑模式以及记录到 Output Console。它在任意页面都有效。抓住标题栏拖动窗口;Esc / 点击外部 / × / 再次 Ctrl+Shift+H 关闭。
颜色:在管理 modal(编辑面板)中,每个窗口都有 color picker —— 标题圆点、标题背景和文本、body 背景和文本、操作按钮颜色。
字体和大小:右键点击窗口的标题栏 → 带字体选择(Consolas、Menlo、Monaco、Courier New 和其他等宽字体)和大小(10–24 px)的菜单。
你抓住标题栏拖动每个窗口。当边缘靠近另一个窗口 / 操作栏 / 浮动按钮(≤ 12 px)时,会出现磁性吸附 —— 窗口连接成一个组。拖动连接的组会一起移动所有元素。位置按浏览器窗口记住。
每个窗口有 8 个 resize 句柄:4 个在角上(同时改变宽度和高度)以及 4 个在边缘上(仅改变一个轴)。被拖动的句柄保持对边不动。范围:宽度 180–1200 px,高度 120–900 px。新尺寸(pane.size)会被保存 —— 对持久窗口在设备间同步,对 TEMP 窗口按标签页。
在窗口内用鼠标滚轮滚动只会滚动该窗口的内容 —— 下方的页面不会滚动。当窗口区域到达滚动末端,或光标位于不可滚动的部分(标题、过滤栏)上时,同样如此。
每个窗口(无论是临时 TEMP 还是持久窗口)在标题栏右角都有一个× 关闭按钮。TEMP 被隐藏(从页面上下文菜单或快捷键重新打开),持久窗口 —— 被禁用(用 popup 中的复选框重新启用)。在标题栏双击:
当窗口边缘靠近另一个 JustZix 窗口(12 px 阈值)时,在吸附侧(两个窗口上)出现红色边缘。在此位置释放光标执行 snap —— 窗口随后作为一组移动。扩展的所有窗口都参与此机制:操作栏、FAB、持久面板(CSS/JS/Console/Output)、TEMP 和 AI Helper。
你可以在任意页面上创建临时窗口 —— 即使是你没有任何 folder 的页面。TEMP pane 是快速的 ad-hoc 工具:在陌生页面上测试 CSS/JS 而无需配置规则。
TEMP pane 的特性:
<style> 会立即更新。创建 / 关闭(切换):
AI Helper 是内置于扩展的 AI 助手,帮助为当前页面上的具体任务准备并部署 CSS/JS 方案。模型可以检查页面、在 TEMP 窗口中实时测试代码,并且 —— 经你批准后 —— 创建现成的目录、分组和集合。
侧栏设置菜单中的 「AI Helper」 项打开配置 modal:
chrome.storage.local)。密钥仅在你勾选其旁边的「同步」复选框时才传到其他设备 —— 此时它通过 JustZix 云同步(扩展同步 folder、分组和集合的同一通道)。未勾选的密钥永不离开设备。API 调用经过扩展的 service worker,因此密钥不进入页面上下文。
AI Helper 窗口是浮动窗口(每个标签页,像 TEMP 窗口 —— 可拖动、用 8 个句柄缩放、带关闭叉号、一个实例)。你打开 / 关闭它:
窗口中:提供商选择(当你有多于一个密钥时)和模型(实时获取的列表)、对话历史、清除对话按钮以及文本字段(用按钮或 Ctrl+Enter 发送)。模型自动获得当前页面的上下文 —— URL、标题和 HTML 片段。
AI Helper 按既定工作流引导对话:
query_page 检查页面(selector、DOM 结构)。read_temp_pane 和 read_console 检查被测代码是否报错,然后再向你展示结果。模型通过简单的文本协议(块 @@JZ_TOOL@@ … @@END@@)使用工具,对 OpenAI、Anthropic 和 Gemini 的工作方式相同。工具调用及其结果在窗口中显示为单独的「chip」。可用工具:
| 工具 | 动作 |
|---|---|
query_page | 返回 selector 匹配数和最多 5 个元素的 HTML |
list_structure | 返回现有 folder / 分组 / 集合及其 id |
open_temp_pane | 打开临时 TEMP 窗口(CSS 或 JS) |
set_temp_pane_code | 将代码插入 TEMP 窗口 —— 用于实时测试 |
read_temp_pane | 检查 TEMP 窗口 —— 对 JS 执行代码并返回错误或成功 |
read_console | 打开 TEMP Output Console 窗口并返回页面捕获的 console 条目 |
create_folder | 创建 folder + 默认分组(需要确认) |
create_group | 在 folder 中创建分组(需要确认) |
create_rule | 创建带 CSS/JS 代码的集合(需要确认) |
create_bar | 创建附加到 folder/分组/集合的操作栏(需要确认) |
create_action | 在操作栏上创建操作(button/select/input/slider/textarea/toggle3)(需要确认) |
request_user_input | 在聊天窗口中向用户显示内嵌表单(文本 / 数字 / 颜色 / select / 复选框字段)并等待响应 |
list_bars / list_actions / list_panes / list_all | 返回现有操作栏 / 操作 / 窗口(CSS/JS/Console/Output)的列表 —— 可选按父级过滤 |
read_folder / read_group / read_rule / read_bar / read_action | 返回特定实体的完整数据(在计划修改之前) |
update_folder / update_group / update_rule / update_bar / update_action | 修改现有实体 —— 需要确认(带字段差异) |
create_css_pane / create_js_pane / create_js_console / create_output_console | 创建持久前端窗口(需要确认) |
read_*_pane / read_*_console + update_*_pane / update_*_console | 读取和修改持久窗口的元数据(名称、颜色、位置、大小、样式) |
read_pane_code / update_pane_code | 读取并插入 CSS/JS 代码到持久窗口(按浏览器标签)—— 需要确认 |
screenshot_page | 将当前页面视图捕获为图像 —— JustZix 界面自动隐藏;用于支持视觉的模型 |
read_temp_pane + read_console),通过内嵌表单向你请求数据(request_user_input),并对页面截图(screenshot_page)作为附加到下一个请求的图像。
在 AI Helper 窗口的标题栏上右键点击会打开一个菜单,其中有「上移一层」 / 「下移一层」选项(在 JustZix 窗口重叠时更改顺序),「断开与:X」(当 AI Helper 与另一个窗口连接时)以及「外观…」。「外观…」面板可分别对对话中的四个角色设置样式:你的消息、AI 回复、工具结果、内嵌表单 —— 每个都有自己的字体、大小、文字颜色和背景。值按设备保存。
AI Helper 窗口参与与操作栏、持久窗口(CSS / JS / Console / Output)和 TEMP 窗口相同的吸附机制。将边缘拖到另一个 JustZix 窗口附近(12 px 阈值)→ 磁性吸引,红色边缘在两个窗口上指示吸附侧。连接的窗口作为一组移动。
当窗口重叠时,每个窗口的上下文菜单中的「上移一层」 / 「下移一层」选项(在标题栏右键)会进行一次性跳转 —— 窗口移到所有重叠邻居之上 / 之下,不需要多次点击。
screenshot_page 工具捕获当前页面视图并作为图像发送给模型。整个 JustZix 界面在捕获之前自动隐藏(FAB、操作栏、AI Helper、持久面板、TEMP)。最近 3 个截图的缓冲区,一次性附加到下一个请求(发送后从缓冲区中删除,以节省 token)。需要支持视觉的模型(例如 gpt-4o、claude-3+/4、gemini-1.5+/2)。在聊天结果芯片下方显示缩略图 —— 点击打开全屏视图。
| 快捷键 | 动作 |
|---|---|
Ctrl+Alt+G | 创建 / 关闭 TEMP CSS pane |
Ctrl+Alt+H | 创建 / 关闭 TEMP JS pane |
Ctrl+Alt+J | 创建 / 关闭 TEMP JS Console |
Ctrl+Alt+K | 创建 / 关闭 TEMP Output Console |
Ctrl+Alt+I | 在独立窗口中打开编辑面板,自动选中本页面的第一个激活集合,CSS 选项卡 |
Ctrl+Alt+O | 同上,JS 选项卡 |
Ctrl+Alt+P | 同上,操作 选项卡 |
Ctrl+Alt+\ | 打开 / 关闭 AI Helper 窗口 |
Ctrl+Alt+S | 操作栏编辑模式 —— 启用 / 禁用 |
Ctrl+Z | 撤销最后一次更改(仅在栏编辑模式下) |
Delete | 删除选中的标签(仅在栏编辑模式下) |
Esc | 取消选择所有元素(仅在栏编辑模式下) |
Ctrl+Shift+L | 清除每个 Output Console 的活动标签页 |
Ctrl+Shift+H | 快速帮助 —— 快捷键与页面内窗口(全局) |
| 快捷键 | 动作 | 窗口 |
|---|---|---|
Ctrl+Enter | 执行代码 / 发送消息 | JS pane、JS Console、AI Helper |
↑ / ↓ | 命令历史 | JS Console(input) |
Ctrl+L | 清除 output | JS Console |
Esc | 清除搜索字段 | Output Console |
| 快捷键 | 动作 |
|---|---|
Ctrl+Alt+F | 聚焦到编辑器上方的搜索字段 |
Ctrl+Alt+→ / Ctrl+Alt+← | 下一个 / 上一个搜索结果 |
Enter / Shift+Enter | 搜索 / 下一个 / 上一个结果(在搜索字段中) |
Ctrl+Alt+I / O / P | 切换激活集合的选项卡到 CSS / JS / 操作(当集合卡片已渲染时) |
Ctrl+Alt+G/H/J/K 是相邻的键(Vim 布局),在所有浏览器和系统中都空闲。Ctrl+Alt+L 被有意省略 —— 在 Linux 上它锁屏。Ctrl+Alt+S(编辑模式)和 Ctrl+Alt+\(AI Helper)属于同一个修饰键家族。Output Console 快捷键(Ctrl+Shift+...)不冲突,因为修饰键不同。
扩展提供五种导出格式(完整、部分、目录、分组、集合),导入时自动检测文件类型,以避免意外覆盖。
在侧栏设置菜单中: 导出设置。modal 打开两种模式:
部分导出文件的名称为 justzix-partial-DATA.json(vs. 完整导出的 justzix-backup-DATA.json),内部带标志 partial: true 和字段 groups[]。
在目录栏中: 导出 —— 打开带分组和集合树的 modal(类似部分导出,但限制到此目录)。仅导出选定的集合以及它们所属的分组 —— 空分组不进入文件。
格式 justzix-folder —— 文件包含带目录分组和集合层级的字段 groups[]。
在分组栏中: 导出 —— 带分组集合列表(复选框)的 modal。文件:justzix-grupa-<名称>-<日期>.json,格式 justzix-group。
在集合视图中: 导出集合 —— 立即下载文件(无 modal)。格式 justzix-rule,名称:justzix-zestaw-<名称>-<日期>.json。
justzix-full —— 所有内容的完整备份partial: true 的 justzix-full —— 主导出的选定元素justzix-folder —— 带选择树的单个目录justzix-group —— 分组 + 选定集合justzix-rule —— 单个集合加载文件/粘贴 JSON 后,扩展自动识别类型并显示彩色检测面板:
| 颜色 | 含义 | 动作 |
|---|---|---|
| Teal(青绿色) | 正确的完整备份 | 显示目录/集合数量、导出日期、覆盖警告 |
| 紫色 | 部分备份(partial: true) | 模式选择:与现有内容合并或替换全部 |
| 橙色 | 此 modal 中的文件类型不正确 | 指向正确 modal 的消息,导入按钮被锁定 |
| 红色 | JSON 解析错误 / 格式无效 | 导入按钮被锁定 |
1 / nadpisz —— 覆盖现有目录(会删除其分组和集合)2 / kopia(默认)—— 作为带新 ID 的副本导入,folder 名称中带 "(import)",不丢失现有数据在目录栏中: 导入。按 ID 和名称检查冲突:
在分组栏中: 导入 —— 接受 3 种格式:
justzix-group —— 插入文件中分组的所有集合justzix-folder —— 插入 folder 所有分组的所有集合justzix-rule —— 插入一个集合文件中的所有集合以新 ID 进入当前分组(操作始终为「添加副本」类型 —— 无冲突)。
在集合视图中: 导入集合 —— 仅接受 justzix-rule。带 3 个选项的 prompt:
1 / zastap —— 替换当前集合的内容(id 和 groupId 保留)2 / kopia(默认)—— 作为新集合添加到当前集合旁,在同一分组中,带 "(import)" 后缀设置 → 云同步会打开同步账户 modal。扩展将你的库(目录、分组、集合、操作、操作栏、前端窗口)保存在 justzix.com 云中,并在各设备间保持一致。同步仅在登录后工作 —— 没有账户时扩展只在本地工作。
登录时,扩展将本地数据与云中的数据进行比较:
| 选择 | 作用 |
|---|---|
| 使用云数据 | 清除本地库,并根据服务器重建账户状态 |
| 发送我的本地数据 | 本地数据成为权威 —— 它删除云中已有的内容 |
| 合并 | 合并两组数据 —— 添加缺失的实体,保留已有的实体 |
你也可以取消 —— 扩展随即注销并不做任何更改。
首次对账之后,同步在后台运行:扩展大约每分钟推送一次更改并拉取新实体。在一台设备上做的更改会在短时间后出现在其他设备上。「云同步」项旁边的状态点显示账户是否已连接。
同步模态框的状态标签页显示账户状态并提供操作按钮:
账户中实体的计数:目录、分组、集合、操作、操作栏、前端窗口。仅统计树中可达的实体(分组必须有存在的目录,集合必须有分组,栏/窗口必须有存在的父级)—— 与仪表板的计数保持一致。在打开面板时以及手动同步后刷新。
设备本地的最近同步日志。页面上可见最近 10 条记录;「查看完整历史」按钮会打开一个包含完整列表的窗口(最多 100 条记录)。每条记录包含:
该日志是本地的 —— 不在设备之间同步。每次实际改变了某些内容的同步 tick 后都会创建一条记录;手动「立即同步」始终会留下一条记录,即使更改为零。
使用统计(CSS 应用、JS 执行、窗口显示)作为每设备的独立实体进行同步 —— 仪表板的卡片会将其汇总自所有已配对的设备。主题和语言作为账户的共享设置进行同步,并在另一台设备上下次打开面板时应用。
将 JSON 文件发到即时通讯工具的替代方案。你发布一个带生存时间(1h / 6h / 12h / 24h / 48h)的公开链接并交给接收者。justzix.com 后端将 payload 保存在云中直到过期,之后被删除。
需要登录的同步账户(Sync)。token 本身是公开 secret —— 任何有链接的人都能下载,因此如果内容敏感,不要在公开渠道发送。
JZS-XXXX-XXXX-XXXX-XXXX(16 个 Crockford base32 字符,~80 位熵)。也接受整个 URL https://www.justzix.com/s/JZS-... —— 扩展会解析并归一化(易混淆的字母 I/L→1、O→0、U→V)。
超出限制 = 带波兰语消息的错误。在 我的 share 面板中撤销未使用的链接。
「共享 URL」按钮在四个入口,紧挨「下载文件」:
justzix-full)justzix-folder)justzix-group)justzix-rule)点击打开链接生成 modal:subject + 共享内容的 summary、带 TTL 的 radio(默认 24h)、「生成链接」。成功后 modal 切换到结果视图,带两个可复制的值:
https://www.justzix.com/s/JZS-... —— 发给没有扩展的人(会显示 landing 页面)JZS-XXXX-XXXX-XXXX-XXXX —— 在接收者扩展的「从 URL 导入」中粘贴每个都有自己的「复制」按钮。也显示本地时区的过期时间。
设置 → 我的 share(单独的 modal,不是同步的一部分 —— 这是两个不同的功能)。显示活动链接列表:标题中的计数器 X/20 个活动 · Y MB / 50 MB,以及每个 share 的卡片,带:
X 个目录 · Y 个分组 · Z 个集合 · N 行 JS · A KB撤销不会撤回已下载的内容。如果有人已经下载了 payload,它在本地存于他那里。Share 是「尽力而为的时间限制」,不是 DRM。
设置 → 从 URL 导入(在「导入设置」和「云同步」之间, 链条图标)。modal 有两个步骤:
步骤 1 —— 输入。你粘贴链接或纯 token。客户端校验:从 URL 提取 token,归一化为 Crockford-base32,检查 16 个字符 + 格式。格式错误 → 带正确格式提示的消息。
步骤 2 —— 预览。扩展显示 share 的摘要:
如果 share 包含 JavaScript(jsLines > 0)—— 会出现带链接 「显示 JavaScript 代码」 的红色警告横幅。它打开一个带每条规则和操作完整 JS 代码的 overlay —— 在导入之前查看它,因为代码会在匹配的页面上执行。
步骤 3 —— 导入。点击「导入」→ 后端返回完整 payload → 扩展以始终全新的 ID 创建新实体(绝不按 ID 覆盖现有的):
| 类型 | 发生什么 |
|---|---|
justzix-rule | 创建新目录 + 「默认」分组 + 导入的集合 |
justzix-group | 创建新目录 + 导入的分组 + 集合 |
justzix-folder | 作为新的顶级目录添加 |
justzix-full | 合并:以全新 ID 加入所有 folders/groups/rules |
新容器的名称:<发送方名称或 "Import"> <波兰语日期> —— 你之后可以任意重命名 / 移动。
| 错误 | 消息 |
|---|---|
| token 无效 | 「Token jest nieprawidłowy. Sprawdź czy skopiowałeś cały link.」 |
404 not_found | 「Ten link wygasł lub został odwołany przez nadawcę. Poproś o nowy.」 |
429 rate_limited | 「Zbyt wiele prób. Zaczekaj chwilę i spróbuj ponownie.」 |
| 5xx / network | 「Problem z serwerem. Spróbuj ponownie.」 |
后端不区分 404「从未存在」和 404「已过期 / 已撤销」—— 这是有意的,以免泄露 token 是否曾经存在。
每个操作(来自集合卡片中的「操作」标签页)都可以从集合的 JS 或另一个操作的代码中编程式调用。全局命名空间 window.JZ 在每次执行用户 JS 前自动安装到 MAIN world。
| 调用 | 作用 |
|---|---|
JZ.click(labelOrId) | 编程式点击。每种操作类型的语义:BUTTON → el.click()。SELECT static(带下拉框的按钮)→ el.click()(打开 popup;用户手动选择选项)。SELECT js(原生 <select>)→ 将 value 设为第一个 non-disabled 选项并 dispatch change。INPUT / TEXTAREA / SLIDER → el.click() —— 注意:不改变值也不触发 change 处理器。要设置值:const el = JZ.action('LBL'); el.value = 'X'; el.dispatchEvent(new Event('change'))。TOGGLE3 —— el.click() 落在容器上;要激活特定状态请用 el.querySelector('.jz-toggle3-state[data-jz-state-idx="1"]').click()。返回 true/false。 |
JZ.value(labelOrId) | 统一的当前值 getter。INPUT / TEXTAREA → 原生 el.value。SLIDER → wrap.dataset.jzValue(wrap 是 DIV,渲染器从初始 + 在 input/change 时设置 data 属性)。SELECT(js) → 原生 el.value。SELECT(static) → el.dataset.jzValue(渲染器在每次选择时设置)。TOGGLE3 → el.dataset.jzValue(活动状态的 state.value;fallback 到 state.label)。BUTTON → null。未找到元素 → null。 |
JZ.setValue(labelOrId, value) | 编程式 setter。INPUT/TEXTAREA → el.value = String(v) + dispatch input+change。SLIDER → 设置原生 <input.jz-action-slider> + dispatch。SELECT(js) → el.value = String(v) + dispatch change。SELECT(static) + TOGGLE3 → 发送 CustomEvent 'jz-set-value',content.js 监听器执行完整流程(memory + UI + 触发代码)。TOGGLE3 查找:按 state.value → fallback 到 state.label → fallback 到数字 idx 0-2。BUTTON → false。返回 true/false。 |
JZ.action(labelOrId) | 返回操作元素(button / select / input / textarea / slider / toggle3 容器)或 null。查找:先按 data-jz-action-id,再按 data-jz-key(大写 label)大小写不敏感查找。对所有 6 种操作类型有效。 |
JZ.actionById(id) | 仅按稳定的 action.id 查找(如 'a_mp1deeq3_uimd8l')。对无 label 的操作或想要确定性时推荐。 |
JZ.actions() | 当前页面上所有可见操作元素的数组(button + select + input + textarea + slider + toggle3)。 |
JZ.labels() | 原始标签的数组(保留你输入的大小写)。 |
// === 读取 ===
const filter = JZ.value('FILT'); // INPUT/TEXTAREA — string
const opacity = JZ.value('OPAC'); // SLIDER — string numeric ("75")
const mode = JZ.value('MODE'); // SELECT static — string (option.value)
const theme = JZ.value('THM'); // TOGGLE3 — 活动状态的 state.value
// === 设置 ===
JZ.setValue('FILT', 'nowa wartość'); // INPUT/TEXTAREA — string + dispatch input+change
JZ.setValue('OPAC', 75); // SLIDER — clamp 到 min/max,dispatch input+change
JZ.setValue('SRT', 'prod'); // SELECT(js) — 原生 select + dispatch change
JZ.setValue('MODE', 'staging'); // SELECT static — content.js 执行流程(memory + UI + 代码)
JZ.setValue('THM', 'dark'); // TOGGLE3 — 按 state.value 查找(fallback 到 label,再到 idx)
JZ.setValue('THM', 2); // TOGGLE3 — 等价;数字 idx 也有效
| 调用 | 作用 |
|---|---|
JZ.bars() | 页面上可见的所有 .jz-actions-bar 容器(ActionBars)。 |
JZ.barById(id) | 按 data-jz-bar-id 的栏元素。 |
JZ.floatingBtn() | 主浮动按钮 #justzix-floating-btn 或 null(当隐藏时)。 |
JZ.click / JZ.action 中的查找按 label 大小写不敏感,但按稳定的 action.id 精确。对于无 label 的操作(通常是 INPUT)使用 JZ.actionById('a_...')。
在操作的「JS 代码」字段中你自动可用一些变量 —— 由 background service worker 在执行前作为 const 注入:
| 变量 | 包含什么 | 何时可用 |
|---|---|---|
$el | 此操作的 DOM 元素(input / select / button / textarea / toggle3 容器) | 当 action.id 存在时始终 |
$action | { id, label, type, el } | 始终 |
value | 每种类型的当前值:SELECT static → option.value;INPUT/TEXTAREA → 字段内容;SLIDER → 数字;TOGGLE3 → 活动状态的 state.value(value 为空时 fallback 到 state.label)。 | SELECT static、INPUT、TEXTAREA、SLIDER、TOGGLE3。SELECT js:代码在渲染时运行一次 —— value 为空。 |
stateIdx | 整数 0-2 —— 活动状态的索引(点击从哪个状态开始)。 | 仅 TOGGLE3 |
stateLabel | String —— 活动状态的 label(最多 5 个字符)。 | 仅 TOGGLE3 |
在 SELECT 和 INPUT 类型操作的配置 modal 中,「稳定的操作 ID」面板显示完整的 action.id,带复制按钮以及示例 JS selector(document.querySelector('[data-jz-action-id="..."]'))。在 BUTTON 列表下方可见 JZ.click('LBL') chip —— 点击 chip 将代码片段复制到剪贴板。
visible: true,栏在树中可见 + 页面 URL 匹配规则)。JZ.click() 返回 false,JZ.action() 返回 null。JZ.click()。// "AUTO" 操作的代码
JZ.click('LOAD'); // 点击 LOAD 操作(如加载数据)
setTimeout(() => JZ.click('PROC'), 500); // 500ms 后 PROC(处理)
setTimeout(() => JZ.click('SAVE'), 1500); // 1500ms 后 SAVE(保存)
动态元素出现后点击删除它的操作:
// 集合 JS 代码 — 对动态出现的 modal 的 observer
const observer = new MutationObserver(() => {
if (document.querySelector('.cookie-banner')) {
JZ.click('CCK'); // 点击删除横幅的操作
observer.disconnect();
}
});
observer.observe(document.body, { childList: true, subtree: true });
// JZ.click 在 INPUT 上不改变值 — 使用带 dispatch 'change' 的模式:
const el = JZ.action('SRCH'); // 或 JZ.actionById('a_mp1deeq3_uimd8l')
if (el) {
el.value = 'nowy filtr';
el.dispatchEvent(new Event('change'));
}
如果你更喜欢直接处理 DOM(如改变样式而非调用):
// 按稳定 ID 查找(推荐 — 对 label 更改有抵抗力):
const el = document.querySelector('[data-jz-action-id="a_mp1deeq3_uimd8l"]');
// 按 label 查找(大小写不敏感 — data-jz-key 中为大写):
const btn = document.querySelector('[data-jz-key="MYBT"]');
btn.style.opacity = '0.5'; // 调暗
btn.dataset.busy = 'true'; // 自有属性
操作元素在 DOM 中的位置:
| 操作类型 | 容器 | 元素 selector |
|---|---|---|
| BUTTON | .jz-actions-bar[data-jz-bar-id="..."] | .jz-action-btn[data-jz-action-id="..."] |
| SELECT (static) | .jz-actions-bar | .jz-action-select[data-jz-action-variant="static"](带 popup 的 button;data-jz-value = 当前选中的值) |
| SELECT (js) | .jz-actions-bar | .jz-action-select.jz-variant-js(原生 <select>) |
| INPUT | .jz-actions-bar | .jz-action-input[data-jz-action-id="..."] |
| SLIDER | .jz-actions-bar | .jz-action-slider-wrap[data-jz-action-id="..."](wrap);滑块本身:.jz-action-slider(原生 <input type="range">) |
| TEXTAREA | .jz-actions-bar | .jz-action-textarea[data-jz-action-id="..."] |
| TOGGLE3 | .jz-actions-bar | .jz-action-toggle3[data-jz-action-id="..."](容器;data-jz-value = 活动的 state.value);state 按钮:.jz-toggle3-state[data-jz-state-idx="0|1|2"],活动的有类 .active |
所有元素都有属性 data-jz-action-id(唯一的稳定标识符)。Selector .jz-actions-bar 是安全的 —— 不与页面 DOM 冲突。
data-jz-key)对所有操作类型有效。每个操作元素都同时有 data-jz-label(原始大小写)和 data-jz-key(大写)。为确定起见(如 label 可能更改时)使用稳定的 data-jz-action-id 或 JZ.actionById()。
「搜索」字段过滤目录树。匹配逻辑:
匹配不区分大小写,黄色高亮显示匹配位置。
点击 Chrome 工具栏中的扩展图标后会出现带大型绿/灰切换器「Plugin enabled」的 popup 小部件。在禁用模式下,任何页面上都不注入任何 CSS/JS,与目录设置无关。此时浮动按钮被禁用(Halt Red,opacity 0.7)。状态在 Chrome 重启后存活。
URL 模式字段旁的按钮 —— 从活动标签页插入 protocol://host/*。2 秒创建目录。扩展选项页面的地址被跳过 —— 取最新的外部标签页。
URL 字段右侧内联出现信息「匹配 X 个打开的标签页」或警告。立即捕获拼写错误。
CSS 和 JS 的快照在最后一次编辑后 3 秒创建(debounce)。限制 5 个版本 —— 最旧的被挤出。恢复版本时,当前内容作为最新快照添加到历史中,因此你总能撤销撤销。
集合卡片标题中有一个标签字段 —— 用逗号分隔输入。它们作为侧栏中集合名称旁的小标签出现。搜索也能按标签找到。
每个目录可以在浮动按钮上有自己的标签(最多 3 个字母,大写)和颜色(color picker)。标签和颜色帮助视觉识别哪个项目在给定页面上激活。
每个操作按钮都计数它被点击了多少次。帮助看到哪些真正被使用。
CSS 编辑器下方显示带语法问题列表的栏:
/* ... */})}(带行号)这是简单的语法校验 —— 不检查 properties/values 的正确性。带错误的 CSS 仍会注入(浏览器只是跳过错误的规则)。
在单个目录导入 modal 中,加载文件后出现带度量的集合列表:
文件内容(3 个集合):
Auto-login CSS: 0L • JS: 4L JS
Ukryj banner cookie CSS: 8L • JS: 0L
Debug GTM CSS: 0L • JS: 12L • 2 akcji (8L) JS
如果存在任何 JS 行,会有带行数的警告。点击 JS 按钮显示完整代码以便导入前查看。
每个 JS 集合都单独以自己的 try/catch 执行。一个集合中的错误不会阻塞其他集合的执行。错误以集合/操作名称和完整 stack trace 记录到控制台。
侧栏设置菜单中的内存使用指示器(如 1.2 MB / 10 MB)。超过 80% 为红色。
列表上方的复选框 —— 隐藏标记为独立(○)的集合,只显示目录中激活的(●)。当目录有很多集合时帮助筛掉「手动」集合。对开关更改立即响应。
扩展在 manifest 中有固定的 key(Firefox 构建 —— 固定的 gecko.id),这意味着扩展的 ID 在更新间不变 —— 数据(目录、集合、设置)得以保留。JustZix 面向四种浏览器发布:Chrome、Edge、Opera 和 Firefox。
当服务器发布了比已安装版本更新的包时,设置菜单中(版本号旁边)会出现一条绿色的「有新版本可用」横幅。横幅包含一个下载链接。该检查是静默的 —— 没有网络时横幅就不显示。
chrome://extensions/(Edge:edge://extensions/)中找到扩展并点击卡片上的刷新图标Firefox 构建通过 about:debugging → 「此 Firefox」 → 「临时载入附加组件」加载(指向 justzix_firefox/ 文件夹中的 manifest.json)。更新 = 覆盖文件后重新载入。
"key" 字段(Chromium)/ gecko.id(Firefox)/* Ukryj typowe reklamy */
.ad, .ads, .advertisement,
.banner-ad, [class*="ad-banner"],
[id*="google_ads"] {
display: none !important;
}
/* Ukryj cookie banner */
.cookie-banner, #cookie-notice {
display: none !important;
}
html {
filter: invert(0.92) hue-rotate(180deg);
}
img, video, picture, iframe, [style*="background-image"] {
filter: invert(1) hue-rotate(180deg);
}
技巧:反转整个页面并再次反转图像。在大多数页面上效果出奇地好。
/* Pokoloruj wszystkie elementy z data-testid */
[data-testid] {
outline: 2px dashed #f59e0b !important;
outline-offset: -2px;
}
[data-testid]::before {
content: attr(data-testid);
position: absolute;
background: #f59e0b;
color: white;
font-size: 10px;
padding: 2px 4px;
z-index: 9999;
}
/* Zwiększ czytelność tabel admina */
table.admin-list td, table.admin-list th {
padding: 8px 12px !important;
font-size: 14px !important;
}
/* Sticky header tabeli */
table.admin-list thead {
position: sticky;
top: 0;
background: white;
z-index: 10;
}
/* Naprzemienne wiersze */
table.admin-list tbody tr:nth-child(odd) {
background: #f9fafb;
}
/* Często strony mają sztywne max-width 1200px - wymuś szerokość */
.container, .main-content, main {
max-width: 95% !important;
width: 95% !important;
}
body::before {
content: "ŚRODOWISKO DEV";
position: fixed;
top: 0;
left: 0;
right: 0;
background: #dc2626;
color: white;
text-align: center;
padding: 4px;
font-weight: bold;
z-index: 999999;
font-family: 'Roboto Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
}
body { padding-top: 28px !important; }
对于模式 https://dev.example.com/* 很棒,避免混淆环境。
// Tylko dla dev! Nigdy nie zapisuj prawdziwych haseł
window.addEventListener('load', () => {
const login = document.querySelector('input[name="login"]');
const pass = document.querySelector('input[name="password"]');
if (login) login.value = 'admin@dev.local';
if (pass) pass.value = 'devpass123';
});
// Przechwyć dataLayer.push (GTM)
const origPush = window.dataLayer?.push;
if (origPush) {
window.dataLayer.push = function(...args) {
console.log('%c[GTM]', 'color:#16a34a;font-weight:bold', args);
return origPush.apply(window.dataLayer, args);
};
}
// Przechwyć gtag
const origGtag = window.gtag;
if (origGtag) {
window.gtag = function(...args) {
console.log('%c[GA4]', 'color:#2563eb;font-weight:bold', args);
return origGtag.apply(window, args);
};
}
非常适合在不触碰代码的情况下调试生产环境的分析配置。
// Co 500ms przez 10s sprawdzaj i klikaj przyciski "Akceptuj"
let attempts = 0;
const interval = setInterval(() => {
if (++attempts > 20) return clearInterval(interval);
const buttons = [...document.querySelectorAll('button, a')];
const target = buttons.find(b =>
/akceptuj|zgoda|accept all/i.test(b.textContent || '')
);
if (target) {
target.click();
clearInterval(interval);
}
}, 500);
document.addEventListener('keydown', (e) => {
// Ctrl+Shift+S - zapisz formularz
if (e.ctrlKey && e.shiftKey && e.key === 'S') {
e.preventDefault();
document.querySelector('button[type="submit"]')?.click();
}
// Ctrl+Shift+E - przejdź do edycji (nieprzetestowany przykład)
if (e.ctrlKey && e.shiftKey && e.key === 'E') {
e.preventDefault();
document.querySelector('a.edit-link')?.click();
}
});
// Pomijaj denerwujące confirm i beforeunload na czas testów
window.confirm = () => true;
window.alert = (msg) => console.log('[stłumiony alert]', msg);
window.onbeforeunload = null;
window.addEventListener('beforeunload', e => {
e.stopImmediatePropagation();
}, true);
// Pamiętaj - czysty CSS tego nie zrobi gdy rodzic ma display:none
window.addEventListener('load', () => {
const target = document.querySelector('.important-info');
const newParent = document.querySelector('.sidebar');
if (target && newParent) {
newParent.prepend(target);
}
});
// Pokaż wszystkie ukryte input type="hidden"
document.querySelectorAll('input[type="hidden"]').forEach(input => {
const wrapper = document.createElement('div');
wrapper.style.cssText = 'background:#fef3c7;padding:4px;font-size:11px;font-family:monospace;border:1px dashed #f59e0b;';
wrapper.innerHTML = `${input.name}: ${input.value}`;
input.parentNode.insertBefore(wrapper, input);
});
快捷标签:CLR 颜色:红色
document.querySelectorAll('input, textarea, select').forEach(el => {
if (el.type === 'hidden') return;
if (el.type === 'checkbox' || el.type === 'radio') {
el.checked = false;
} else {
el.value = '';
}
el.dispatchEvent(new Event('change', { bubbles: true }));
});
快捷标签:FILL 颜色:绿色
const data = {
email: 'test@example.com',
phone: '600000000',
firstName: 'Jan',
lastName: 'Testowy',
street: 'Testowa 1',
city: 'Warszawa',
zip: '00-001'
};
Object.keys(data).forEach(name => {
const el = document.querySelector(`[name="${name}"]`);
if (el) {
el.value = data[name];
el.dispatchEvent(new Event('input', { bubbles: true }));
el.dispatchEvent(new Event('change', { bubbles: true }));
}
});
快捷标签:CART 颜色:橙色
// Dla typowego sklepu — kliknij pierwszy "dodaj do koszyka"
const btn = document.querySelector('.add-to-cart, [data-action="add-to-cart"]');
if (btn) btn.click();
else alert('Nie znaleziono przycisku dodaj do koszyka');
快捷标签:COPY 颜色:紫色
navigator.clipboard.writeText(location.href).then(() => {
console.log('Skopiowano:', location.href);
});
快捷标签:TKN 颜色:黄色
// Wyciąga token JWT z localStorage / cookies dla debugowania
const token = localStorage.getItem('authToken')
|| document.cookie.match(/token=([^;]+)/)?.[1];
if (token) {
navigator.clipboard.writeText(token);
alert('Token skopiowany. Pierwsze znaki: ' + token.slice(0, 20) + '...');
} else {
alert('Brak tokena');
}
快捷标签:SQL 颜色:蓝色
// Przechwytuj wszystkie fetch i pokaż w konsoli
const origFetch = window.fetch;
window.fetch = async function(...args) {
console.log('%c[FETCH]', 'color:#2563eb', args[0]);
const res = await origFetch.apply(this, args);
return res;
};
console.log('Włączono logowanie fetch. Każde wywołanie pojawi się w konsoli.');
快捷标签:ENV 颜色:灰色
const info = {
url: location.href,
userAgent: navigator.userAgent.split(' ').pop(),
cookies: document.cookie.split(';').length,
localStorage: Object.keys(localStorage).length,
framework: window.React ? 'React' : window.Vue ? 'Vue' : window.jQuery ? 'jQuery' : 'unknown'
};
alert(JSON.stringify(info, null, 2));
每个项目有自己的目录,带自己的 URL 模式。你可以有目录:
https://dev.justzix.com/*,带红色「DEV」横幅在右侧面板上可以快速启用/禁用各个目录。单个目录导出让你能与团队共享配置。
在每个 dev/staging 上添加横幅和自动登录。一个 CSS 集合(横幅)和一个 JS(自动填充)。你为每个环境创建单独的目录,用简单的复选框集中起来。
带按钮的操作面板:FILL(测试数据)、CART(测试购买)、CLR(清空表单)、STATE(在 alert 中显示应用状态)。无需程序员、无需控制台,一键完成。
提升喜爱的博客/文档的可读性 —— 更大的容器、字体、深色模式。每个网站在单独的目录中,「激活」永久保持开启。
每个域名一个带捕获 dataLayer.push 和 gtag 的 JS 集合。当客户报告分析问题时启用它,无需触碰页面代码。
模式 *://*.justzix.com/admin/* 和改进表格、列表、表单的 CSS。加上「测试过滤器」操作,为典型工作流自动设置过滤器。
RO(read-only)操作注入隐藏所有「删除」「保存」「发送」按钮的 CSS —— 临时的「只读模式」以免出错。
// Ukryj groźne przyciski
document.querySelectorAll(
'button[type="submit"], .delete-btn, .danger-btn, [class*="delete"]'
).forEach(b => b.style.display = 'none');
console.warn('TRYB READ-ONLY włączony');
[JustZix] JS error!important 或更具特异性的 selector.css-1abcd 类型的类。使用属性([data-testid])或稳定的 selector扩展在 manifest 中有固定的 key —— 后续更新保留数据。如果数据仍然消失了:
chrome://extensions/ 中使用刷新按钮,不要删除并重新安装这是正常的 —— 位置是按浏览器窗口的,存储在会话内存中(chrome.storage.session)。关闭窗口后位置消失,在新窗口中你从默认值开始。位置在同一窗口内标签页间的导航中存活。
是的 —— 部分导出仅包含选定的目录和集合加上与它们相关的可见性设置。它不包含浮动面板的位置(它们是按窗口的)或其他全局偏好。要完整备份请使用 「全部」 模式。
「合并」模式按 ID 匹配目录。如果导入的文件有与现有目录冲突的 ID(如同一文件已被导入过一次),会出现 prompt:1 覆盖 / 2 副本(默认,安全)/ 取消。选择 2 你会得到带新 ID 和 folder 名称中 "(import)" 后缀的副本 —— 你不会丢失任何东西。
展开箭头仅在目录有集合时出现。空目录有一个变灰的圆点而非箭头。每个目录的展开状态记在 chrome.storage.local 中。
这些按钮在目录栏中(编辑区域顶部),紧挨「删除目录」按钮。不要与设置菜单中涉及整个设置的按钮混淆。
规则和操作的 JS 在页面上下文中通过分层策略执行,可抵御严格的 Content Security Policy 规则。大多数页面——包括 Facebook 等大型站点——无需任何配置即可立即工作。
CSP 极严格的页面(某些银行、企业站点)可能会阻止执行。要让 JS 在每个页面上都能工作,请为 JustZix 启用"允许用户脚本"选项:打开 chrome://extensions,进入 JustZix 详情并打开该开关(较旧的浏览器还需要开发者模式)。当页面阻止执行时,JavaScript 窗口 / JS 控制台会显示相应的提示。
JustZix — 使用手册