Firefox扩展开发:getSelection().toString()无法获取选中文本
Firefox扩展无法获取页面选中文本问题解决
问题描述
开发基础Firefox扩展,功能为获取页面选中文本并拼接进URL后在新标签页打开,但无法成功获取选中文本(测试对象为普通页面文本,已知textarea/input存在Firefox相关bug,暂不涉及)。
原manifest.json代码:
{ "manifest_version": 2, "name": "Send2search test", "version": "1.0", "permissions": ["menus"], "background": { "scripts": ["bg.js"] }, }
原bg.js代码:
browser.menus.create( { id: "gglSearch", title: "Search in new tab.", contexts: ["selection"], }, ); browser.menus.onClicked.addListener(async function (info, tab) { var selectedTxt = window.getSelection().toString(); if (info.menuItemId == "gglSearch") { var searchUrl = `https://www.google.com/search?q=${selectedTxt}`; let openNewTab = browser.tabs.create( { active: false, url: searchUrl, index: tab.index+1 } ); }; });
现象:每次打开空白Google搜索页,说明未获取到选中文本;尝试用content.getSelection().toString()替代后,新标签页无法打开。
问题原因
后台脚本(bg.js)运行在独立的后台页面环境中,window.getSelection()获取的是后台页面的选中内容(默认为空),而非当前用户操作的标签页中的选中文本。content.getSelection()的写法本身错误,后台脚本无法直接访问内容脚本的对象。
解决方案
- 利用
menus.onClicked回调的info参数:该参数自带selectionText属性,直接存储了用户选中的文本内容。 - 添加必要权限:操作标签页需补充
tabs权限到manifest.json中。 - URL编码处理:对选中文本进行URL编码,避免特殊字符导致URL无效。
修改后的代码
manifest.json
{ "manifest_version": 2, "name": "Send2search test", "version": "1.0", "permissions": ["menus", "tabs"], "background": { "scripts": ["bg.js"] } }
bg.js
browser.menus.create({ id: "gglSearch", title: "Search in new tab.", contexts: ["selection"], }); browser.menus.onClicked.addListener(async function (info, tab) { if (info.menuItemId === "gglSearch") { // 从info参数直接获取选中文本 const selectedTxt = info.selectionText; // 对文本进行URL编码,兼容特殊字符 const encodedTxt = encodeURIComponent(selectedTxt); const searchUrl = `https://www.google.com/search?q=${encodedTxt}`; await browser.tabs.create({ active: false, url: searchUrl, index: tab.index + 1 }); } });
内容的提问来源于stack exchange,提问作者TGD
相关产品推荐
相关产品推荐

