Chrome 扩展中的选择和站点搜索

2023-12-03

我正在尝试编写接受用户选择的单词和用户定义的谷歌浏览器扩展 网站并在该网站上搜索这个词(通过 Google 和上下文菜单)。选项页面中有一个表单。 用户在表单字段中输入站点(字段/站点的数量可变 - 用户指定 哪些站点以及多少个)。所有站点都保存到数组中。数组保存到 localStorage["arr"]。所有这些都在 options.html 中。

在 bg.html 上(背景页面) 首先,我从 localStorage 获取数组(现在一切都很好)。然后我在循环中创建上下文菜单项。我只有一个 onclick 事件处理程序用于所有上下文菜单项。 在事件处理程序内部,我试图获取正确的数组元素(在哪个站点上搜索) 和选择文本(搜索内容),然后打开一个包含谷歌搜索结果的新选项卡。
我最大的问题: 1)我根本无法获取数组元素(在事件处理程序中)!(在哪个站点上搜索未定义)。 2)onclick 事件仅适用于上下文菜单项之一。 3)有时,创建了上下文菜单项,但单击根本不起作用!

我的代码: 清单.json

{
  "name": "Context Site Search",
  "version" : "0.0.0.1",
  "background_page" : "bg.html",
  "options_page": "options.html",
  "permissions" : [
    "tabs",
    "contextMenus",
    "http://www.google.com"
    ]
}

bg.html:

<script type="text/javascript">

var ar = localStorage.getItem("arr").split(",");//getting array from localStorage 

for (var i=0;i<ar.length;i++){ // creating contextmenu items in a loop

chrome.contextMenus.create({
    "title": "find ' %s' в "+ ar[i],
    "contexts": [ "selection"],
    "onclick" : clickhandler
});
}

var clickhandler = function(e,ar){
var baseUrl = "http://www.google.com/search?q=site%3A";

if (e.selectionText){
baseUrl += ar[i]+ "&q="+ encodeURI(e.selectionText);
chrome.tabs.create(
{"url": baseUrl}

);

 }

}

</script>

请帮忙!我究竟做错了什么??如何解决这个问题? 任何帮助表示赞赏。

提前致谢!!

更新:感谢 serg,我终于得到了一些东西..但是有新问题: 1)在选项页面输入的上下文菜单项的数量神秘地增加了一倍(甚至五倍!!)。 2)单击“保存”按钮不会立即用新菜单项替换旧菜单项。(重新加载 显然需要扩展)。 我怀疑,我错误地编写了保存函数,该函数在单击保存按钮时运行... 这是代码:

var arr = [];
function save() {
localStorage.clear();

var nodes = document.querySelectorAll("input[type=text]");
for (var i=0; i<nodes.length; i++){
    if (nodes[i].value == "" ){
        alert('Enter Data!');return false;
} else {
 arr.push( nodes[i].value);


   }}

localStorage['arr'] =  JSON.stringify(arr);

}


</script>

UPDATE2:

我想出了加倍/五倍的事情。这取决于用户单击“保存”按钮的次数。 1)有机会阻止这种情况吗?例如多次单击仅将一组值添加到数组? 2)上下文菜单项仍然没有改变。它们仅在重新加载扩展后才会更改..:(( 重新加载扩展和更改 localStorage 有什么区别?


当您将函数分配给onclick财产不会立即评估。当它被评估时,你的循环早已结束并且ar[i]不包含您所期望的内容。

这是一个经典的 javascript 问题,可以通过闭包解决:

chrome.contextMenus.create({
    "title": "find ' %s' в "+ ar[i],
    "contexts": [ "selection"],
    "onclick" : (function(element) {
                    return function(info, tab) {
                        var baseUrl = "http://www.google.com/search?q=site%3A";

                        if (info.selectionText) {
                            baseUrl += element + "&q="+ encodeURI(info.selectionText);
                            chrome.tabs.create({"url": baseUrl});
                        }
                    }
                })(ar[i])
});

我们创建了匿名函数,该函数立即进行评估并返回一个真实的事件处理程序。诀窍是当前ar[i]值现在将始终可用element闭包内的变量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Chrome 扩展中的选择和站点搜索 的相关文章

  • 如何让 Google Apps 脚本进行 SHA-256 加密?

    我需要使用文本输入 1 轮 十六进制输出 SHA 256 加密来加密字符串 这应该是一个长度为 64 的字符串 我在 Google Apps 脚本文档中尝试过的每个 SHA 256 加密模块都会返回一组数字 例如 function SHA2
  • 使用 Javascript 实现 Tinder 风格的拖放手势?

    我正在尝试找出哪些库可以用于仅使用 Javascript 的 Tinder 风格拖放手势 需要创建一个响应拖动手势的 HTML 元素 触摸并按住时 允许元素跟随用户的手指移动 当用户移开手指时 该元素会 动画回到原来的位置 如果元素在释放时
  • 如何使用jquery格式化数字

    我正在尝试删除 之后的数字 然后我想格式化数字 16810900 211233 喜欢这个 16 810 900 但我不知道该怎么做 这是我的 html 是这样的 div class main p class active 10200 00
  • 整个页面都是玻璃板

    有没有一种简单的方法可以在整个 HTML 页面上拥有一个 玻璃窗格 而不管缩放 幻灯片事件 平台 浏览器 移动 桌面 我所说的 简单 是指纯 CSS 支持 而不是插件 后备 插件建议也可能有用 Thanks 如果您只是指所有内容之上的一层
  • 将图像缩略图上传到服务器,而不上传整个图像

    据我所知 我在这里问的是不可能的 但我想无论如何我都会问 以防我遗漏了什么 假设您想让用户上传 JPG 图像 并且这些图像被缩放为较小的图标 并且原始图像始终被丢弃并且不再需要 有没有什么方法可以在大多数现代浏览器中普遍使用 让用户选择硬盘
  • 方向改变后的javascript最大视口高度Android和iOS

    目标 查找设备的最大视口高度 包括设备的空间address bar这样我们就可以动态调整 min body 的大小并将内容向上推 问题 移动浏览器处理方向状态的方式不同 方向变化时更新 DOM 属性的方式也不同 使用 JavaScript
  • Javascript 自时间戳以来经过的时间

    我试图通过将其存储在变量中来 缓存 一些信息 如果 2 分钟过去了 我想获取 实时 值 调用 url 如果 2 分钟还没有过去 我想从变量中获取数据 我基本上想要的是 if time passed is less than 2 minute
  • 如何根据另一个动态下拉列表的值创建动态下拉列表?

    我有一个下拉菜单 当我选择一个选项时 它会创建一个动态下拉菜单 到目前为止 一切都很好 但我想创建另一个动态下拉列表 现在基于另一个动态下拉列表的值 我该怎么做 第一个动态下拉列表有效 我猜第二个无效 因为动态变量 div 没有静态 ID
  • 如何在Javascript中声明静态变量[重复]

    这个问题在这里已经有答案了 在下面的代码中 我希望有一个计数器来跟踪创建的 Person 对象的数量 这段代码没有这样做 我该如何实现呢 function Person this name Peter this counter this c
  • 如何获得相对于特定父级的偏移量?

    我想获取元素相对于的偏移量特定的父母不是直接的 也不是文档 我在互联网上查找并找到了offset http api jquery com offset and position http api jquery com position jQ
  • 强制执行 show.bind

    我有一个包含数据的表 当从另一个视图触发事件时 我希望视图检查 show bind 语句 问题是该事件没有更改当前视图中的任何数据 foo html tr p canBeRemoved p tr 我正在使用 EventAggregator
  • 我什么时候应该使用内联和外部 Javascript?

    我想知道什么时候应该包含外部脚本或将它们与 html 代码内联编写 就性能和易于维护而言 这方面的一般做法是什么 真实场景 我有几个需要客户端表单验证的 html 页面 为此 我使用了一个包含在所有这些页面上的 jQuery 插件 但问题是
  • 标记内的值发生变化时调用函数

    JavaScript 有没有什么方法可以在段落标记的值更改时调用函数 概述 HTML p 00 00 p
  • 如何更改 Vuetify 日历日期格式

    我正在尝试在以下 Vuetify 日历上启用输入事件 https github com vuetifyjs vuetify blob master packages docs src examples calendars complex e
  • 根据数据更改图例颜色高图表

    我可以根据数据动态设置列的颜色 但无法弄清楚如何更改图例中的颜色 请注意 jsfiddle 最新的条形图是绿色的 但图例是蓝色的 有没有办法改变列颜色也会改变图例颜色 这是我用于列颜色的代码 jsfiddle http jsfiddle n
  • 谷歌浏览器如何启动桌面应用程序?

    我真的不知道术语 所以我将从一个例子开始 如果我点击磁力链接 Google Chrome 会询问我是否要启动 torrent 客户端 我单击 确定 chrome 启动该应用程序 该应用程序根据链接执行一些操作 现在有办法查看应用程序如何从
  • jQuery 单击附加元素不起作用

    我有一个数组 我正在从 Array 获取数据并在 jQuery Append to list 中使用它 但是当我单击列表项时 它只显示最后一个元素 var array 1 2 7 3 4 8 5 6 9 for var i 0 i lt a
  • onClick 事件适用于触摸屏设备上的触摸吗?

    我用过onclick我的网站上的活动 但是 当我在谷歌浏览器的开发人员模式移动视图中打开它时 触摸使用鼠标单击的元素没有任何反应 所以我的问题是 我还必须添加吗ontouch事件连同onclick事件或 onClick 事件适用于所有触摸屏
  • python 函数返回 javascript date.getTime()

    我正在尝试创建一个简单的 python 函数 它将返回与 javascript 相同的值new Date getTime 方法 如所写here http www w3schools com js js dates asp javascrip
  • 在 Map() 的条目上使用 Promise.all

    我正在使用 Map 来表示一些键 值对 let myMap new Map myMap set foo bar myMap set foo2 bar42 对于每个 Map 条目 我执行一个返回 Promise 的函数 所有这些 Promis

随机推荐

  • 如何添加“再玩一次”? java 的功能

    我正在为我的班级制作一个猜谜游戏 当您猜到正确的数字时 我需要一些帮助来在游戏结束时添加 再玩一次 功能 public class GuessingGame public static void main String args Scann
  • 插入转义字符

    我想用转义字符值替换并插入转义字符序列 同时考虑到 会使转义字符无效 例如 This is a n test Here is a n which represents a newline 在 Ruby 中实现这一目标的最简单方法是什么 我假
  • 为什么聚焦时 QLineEdit 样式不改变?

    我正在使用 Qt 及其样式表开发 GUI 在主窗口样式表上 我放置了以下样式 QLineEdit focus border 2px solid 006080 但当我使用它时 风格并没有像我预期的那样真正改变 但是 如果我将相同的样式表直接放
  • 将命令输出保存到变量

    在批处理文件中 我尝试获取命令的输出并将其保存到变量中 我的命令的目标是计算某个文件夹中的文件夹数量 我无法使用中提供的技巧this接受答案 因为我必须这样做cd path to my folder进入当前目录 不幸的是 我无法执行此命令
  • 如何判断 ALL_TAB_COLS 中哪些列未使用?

    当您在 Oracle 9i 上查询 ALL TAB COLS 视图时 它会列出标记为 UNUSED 的列以及 活动 表列 似乎没有一个字段明确说明某列是否未使用 也没有我可以加入的任何视图列出表中未使用的列 如何轻松找出哪些是未使用的列 以
  • 如何从给定的子键中查找数组的所有父键?

    假设我有以下嵌套 多维数组 array World gt array Asia gt array Japan gt array City gt Tokyo 我希望能够找到当前城市层次结构中的所有父母 例如 对于城市 响应应该是包含以下内容的
  • 使用 openMP 进行多核处理与多线程处理

    这个问题听起来可能很基本 但是我找不到任何具体的答案 现在假设我们有一个多核处理器 例如 corei5 680 2 个物理核心和支持 HT 的 4 个操作系统可用核心 我的问题是 openMP 到底适合什么情况 1 当我们说使用 openM
  • ASP.NET MVC 中的“请等待”页面

    一个页面执行多个任务 处理时间较长 我们希望在每项任务完成时向用户提供反馈 在 ASP NET Webforms 中我们使用Response Flush 在 ASP NET MVC 中您会采取什么方式解决这个问题 您仍然可以使用 Respo
  • 使用自定义删除器增强智能指针

    我可以理解boost shared ptr不验证NULL在调用自定义删除器函数之前 但我该如何实现这一点呢 这将帮助我避免编写愚蠢的包装器fclose或任何未 正确 指定行为的函数 我的提升 define BOOST VERSION 104
  • Django 注册激活重定向与 django.contrib.messages

    我正在尝试设置我的 django 注册激活工作流程 以便当用户点击激活链接时 它会使用 django 消息框架将他们重定向到登录页面 并显示一条漂亮的小消息django contrib messages 现在 我已经成功使用以下命令将用户发
  • 在共享首选项中设置默认值

    有没有一种方法可以在共享首选项中设置默认值 这是我的加载首选项代码 public void LoadPreferences SharedPreferences sharedPreferences getSharedPreferences v
  • 是否可以在 Git 中只拉取一个文件?

    我正在开发一个有一些损坏测试的 Git 分支 我想从另一个已经修复的分支中提取 合并更改 而不仅仅是覆盖 这些测试 我知道我能做到 git pull origin that other branch 但这将尝试合并许多其他文件 因为我还没有
  • 如何根据列值将 CSV 文件拆分为多个文件

    我有 CSV 文件 可能如下所示 name1 1 11880 name2 1 260 483 name3 1 3355 82 name4 1 4179 48 name1 2 10740 4 name2 2 1868 69 name3 2 3
  • 求解线性方程

    我需要以编程方式求解 C Objective C 或 如果需要 C 中的线性方程组 以下是方程式的示例 44 3940 a 50 0 b 37 0 tx 45 3049 a 43 0 b 39 0 tx 44 9594 a 52 0 b 4
  • 将数组的内容添加到组合框

    我有一个数组 在另一个类中 其中有 10 个值 我想将此数组的值添加到组合框中 这可能吗 谢谢 是的 一般来说 你可以这样做 JComboBox b new JComboBox new String String1 String2 是 有一
  • 适用于桌面客户端的 Gmail IMAP OAuth

    最近 Google 宣布他们支持 Gmail IMAP SMTP 的 OAUth 我浏览了他们的多个文档 但我仍然对他们是否支持已安装应用程序的 OAuth 感到困惑 1 In 本文档他们说 注意 虽然OAuth协议 支持桌面 安装 应用程
  • 在 IIS 7 中使用会话时出错

    将我的网站部署到 IIS 后 我在尝试访问会话时收到以下错误消息 会话状态只能在以下情况下使用 enableSessionState 设置为 true 在配置文件中或在 页面指 令 还请使 确定 System Web SessionStat
  • 填充 Internet Explorer 输入框

    我读了很多关于我的问题的答案 但不知何故 如果我尝试 模仿 我所看到的 我仍然无法做我需要的事情 问题很简单 在打开的 IE 页面上填写一个输入框 结果 代码卡在了线上getelementbyid显示运行时错误 424 需要对象 Priva
  • 编程珍珠:在 40 亿个整数的文件中查找丢失的整数

    Question 输入位于顺序文件上 该文件最多包含 40 亿个整数 找出缺失的整数 Solution据我的理解 制作两个临时文件 一个以 0 开头 另一个以 1 开头 两羽鸽子 4 3B 鸽子和 4B 鸽子 之一必须低于 2B 选择文件并
  • Chrome 扩展中的选择和站点搜索

    我正在尝试编写接受用户选择的单词和用户定义的谷歌浏览器扩展 网站并在该网站上搜索这个词 通过 Google 和上下文菜单 选项页面中有一个表单 用户在表单字段中输入站点 字段 站点的数量可变 用户指定 哪些站点以及多少个 所有站点都保存到数