2014-05-14 36 views
0

我正在尝试编写一个扩展功能,可以弹出并弹出侧栏类型视图,以便快速管理我们的HR帮助中心。铬扩展命令(热键)

无论如何,我采取了一些现有的东西,并修改它做我想做的。我打算对它进行修改,甚至超过我目前的修改,但是,在我去找我的老板并说LOOK之前,我想确保其功能在那里。看到!

我已经基本了解如何使用Chrome中的浏览器操作图标。那里没有问题。当我尝试启用也会打开扩展名的热键时,主要问题就出现了。它不会工作,我已经把我的头撞到了我的桌子上,而且我需要一些外部帮助。

无论如何,这里是我处理热键的清单部分。

清单

"commands": { 
    "toggle-feature": { 
     "suggested_key": { 
      "default": "Ctrl+Shift+0", 
      "mac": "Command+Shift+0" 
     }, 
     "description": "Toggle the helpcenter screen", 
     "global": true 
    }, 
    "_execute_browser_action": { 
     "suggested_key": { 
      "windows": "Ctrl+Shift+9", 
      "mac": "Command+Shift+9", 
      "chromeos": "Ctrl+Shift+9", 
      "linux": "Ctrl+Shift+9" 
     } 
    } 

正如你可以看到我很失望,并在网络上添加快捷键为每一个系统,并试图在他们的所有。

background.js

chrome.browserAction.onClicked.addListener(function(tab) { 
    chrome.tabs.sendMessage(tab.id, { action: "toggleSidebar" }); 
}); 

chrome.commands.onCommand.addListener(function(tabh) { 
     chrome.tabs.sendMessage(tabh.id, { action: "toggleSidebarhkey" }); 
}); 

第二行可能是完全不正确的,我搞砸与它这么多次试图将信息传递给扩展。第一行正确处理扩展的一半工作。

content.js

var sidebarURL = "help center server"; 

var isSidebarOpen = false; 
var sidebar = createSidebar(); 

/* Create a pop-out */ 
function createSidebar() { 
    var sb = document.createElement("iframe"); 
    sb.id = "mySidebar"; 
    sb.src = sidebarURL; 
    sb.style.cssText = "" 
     + "border: 3px groove;\n" 
     + "width: 50%;\n" 
     + "height: 100%;\n" 
     + "position: fixed;\n" 
     + "top:  0px;\n" 
     + "left:  0px;\n" 
     + "z-index: 9999;\n" 
     + ""; 
    return sb; 
} 

/* Show/Hide the pop-out */ 
function toggleSidebar() { 
    if (isSidebarOpen) { 
     document.body.removeChild(sidebar); 
    } else { 
     document.body.appendChild(sidebar); 
    } 
    isSidebarOpen = !isSidebarOpen; 
} 

**这里是我遇到麻烦** 我复制并粘贴低于上述代码,并添加从background.js屏幕标识符。剩下的就剩下了,因为它应该使用当前值来决定是否要关闭它或打开它。


/* Show/Hide the pop-out via hotkey */ 
function toggleSidebarhkey() { 
    if (isSidebarOpen) { 
     document.body.removeChild(sidebar); 
    } else { 
     document.body.appendChild(sidebar); 
    } 
    isSidebarOpen = !isSidebarOpen; 
} 

/* Listen for message from the background-page and toggle the SideBar */ 
    chrome.runtime.onMessage.addListener(function(msg) { 
    if (msg.action && (msg.action == "toggleSidebar")) { 
     toggleSidebar(); 
    } 
}); 

** HOT键侦听器** 再次这一部分可能是错误的,因为地狱,但我已经有这么多尝试,使其工作,我怀疑任何部分搞砸它是正确的。


/* Listen for message from the background-page and toggle the SideBar via hotkey */ 
chrome.runtime.onMessage.addListener(function(msg) { 
    if (msg.action && (msg.action == "toggleSidebarhkey")) { 
     toggleSidebarhkey(); 
    } 
}); 

说实话,我完全卡住,我猜想你们中间很多人都在思考,“走的想法,因为它是老板!”和“你的老板不会知道!”但我想要额外的酷炫因素,无需搜索按钮并轻松访问帮助中心门户中的人力资源。一旦我获得了“嘿看!!”的基本功能那么我会扩展,可能会添加一个面板,而不是弹出窗口(如谷歌保留或环聊)谁知道,但我首先需要一个概念证明,我讨厌以这种方式未完成的事情。

+0

欢迎SO!我提交了一个编辑您的修补程序块代码格式(它不是代码块的反色,但4空格缩进)。如果你还可以编辑你的帖子来删除/减少背景故事(这不是很有用),这将是很好的。 – Xan

+0

1.你只需要一个onMessage监听器......它可以处理所有传入的消息2. onCommand监听器回调函数没有tab作为参数,而是命令(就像你的情况下的'toggle-feature') – devnull69

+0

@ devnull69避免在评论中回答问题。 – Xan

回答

1

正如docs on chrome.command所解释的那样,onMessage侦听器的回调获取该命令作为参数,而不是Tab对象。

因此,回调里面,你需要弄清楚哪些选项卡被激活:

chrome.commands.onCommand.addListener(function(command) { 
    if(command === "toggle-feature"){ 
     chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
      chrome.tabs.sendMessage(tabs[0].id, { action: "toggleSidebarhkey" }); 
     }); 
    } 
}); 
+0

有趣的是,在阅读文档时,我一定错过了该部分。谢谢 – user3637006

+0

好吧,没有代码错误,并且所有内容似乎都可以正确编译并加载到幕后,但当我点击热键时仍然无法加载弹出窗口。我会一直用棍子戳它,我敢肯定,你已经指出了我正确的方向。如果我知道了,我会在明天(或更早)报告。 – user3637006

+0

正如[这里](http://stackoverflow.com/questions/18132873/chrome-commands-keyboard-shortcuts-not-working-for-me)所述,尝试卸载/安装您的扩展,而不是只是重新加载,以正确地注册热键。另外,请仔细阅读有关'_execute_browser_action'命令的信息。它将打开弹出窗口(如果存在),并且不会触发'chrome.browserAction.onClicked'。 – Xan