javascript 如何为特定页面显示 page_action?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9244748/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do I make page_action appear for specific pages?
提问by Treferwynd
I was playing around with some chrome extensions and I found this example:http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/pageAction/pageaction_by_url/
我正在玩一些 chrome 扩展,我发现了这个例子:http: //src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/pageAction/pageaction_by_url/
Everything works fine, but I want to create my own extension and I want to see the page_action Icon on a specific site, not ones with 'g' in their urls. So I tried simply to change the script from this:
一切正常,但我想创建自己的扩展程序,我想在特定站点上查看 page_action 图标,而不是在其 url 中带有“g”的图标。所以我试着简单地改变脚本:
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Called when the url of a tab changes.
function checkForValidUrl(tabId, changeInfo, tab) {
// If the letter 'g' is found in the tab's URL...
if (tab.url.indexOf('g') > -1) {
// ... show the page action.
chrome.pageAction.show(tabId);
}
};
// Listen for any changes to the URL of any tab.
chrome.tabs.onUpdated.addListener(checkForValidUrl);
Into this:
进入这个:
chrome.pageAction.show(tabId);
But now it doesn't work... I don't get it. Obviously I can use a workaround, but that's not the point... First of all, must I create a background page to do this? I think yes but I can't see why, and why the .show method doesn't work alone? I tried to search in the google documentation and stuff, but I couldn't find anything useful I'm no expert and this has been my first afternoon spent on google extension, but how should I know that the "chrome.page.show(tabId)" must go in a background page if it's not written anywhere? No intent to criticize, but how the hell did you guys find out? All chrome methods must go in a background page? Well, definitely much more questions then what its legit. Hope you can give me at least one answer!
但现在它不起作用......我不明白。显然我可以使用一种解决方法,但这不是重点...首先,我必须创建一个背景页面来执行此操作吗?我想是的,但我不明白为什么,为什么 .show 方法不能单独工作?我试图在谷歌文档和东西中搜索,但我找不到任何有用的东西我不是专家,这是我在谷歌扩展程序上度过的第一个下午,但我怎么知道“chrome.page.show( tabId)”如果没有写在任何地方,就必须进入后台页面吗?无意批评,但你们到底是怎么发现的?所有 chrome 方法都必须放在后台页面中?那么,肯定有更多的问题那么它的合法性。希望你能给我至少一个答案!
回答by PAEz
http://code.google.com/chrome/extensions/pageAction.html
...says...
http://code.google.com/chrome/extensions/pageAction.html
...说...
By default, a page action is hidden. When you show it, you specify the tab in which the icon should appear. The icon remains visible until the tab is closed or starts displaying a different URL (because the user clicks a link, for example).
默认情况下,页面操作是隐藏的。当你显示它时,你指定图标应该出现的选项卡。该图标一直可见,直到选项卡关闭或开始显示不同的 URL(例如,因为用户单击了链接)。
So even if your tabid was valid it would dissapear pretty quick as your only running chrome.pageAction.show(tabId);
once when the background page first gets run.
You need to check for changes to tabs in the background constantly because pageactions dont have matches/exclude_matches settings in the manifest like content scripts do (pity). So you have to check yourself and respond to changes.
If you want it to work for a specific site just change it to something like...
所以即使你的 tabid 是有效的,它也会很快消失,因为chrome.pageAction.show(tabId);
当后台页面第一次运行时你只运行一次。
您需要不断检查后台选项卡的更改,因为页面操作在清单中没有匹配/排除匹配设置,就像内容脚本那样(可惜)。因此,您必须检查自己并应对变化。
如果您希望它适用于特定站点,只需将其更改为...
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Called when the url of a tab changes.
function checkForValidUrl(tabId, changeInfo, tab) {
// If the tabs url starts with "http://specificsite.com"...
if (tab.url.indexOf('http://specificsite.com') == 0) {
// ... show the page action.
chrome.pageAction.show(tabId);
}
};
// Listen for any changes to the URL of any tab.
chrome.tabs.onUpdated.addListener(checkForValidUrl);
回答by Chris - Jr
For those looking for a way to handle subdomains, if you have a site with a subdomain such as blog.specificsite.com, or need to use wildcards, you can also use regex in this format
对于那些正在寻找处理子域的方法的人,如果您有一个带有子域的站点,例如blog.specificsite.com,或者需要使用通配符,您也可以使用这种格式的正则表达式
function checkForValidUrl(tabId, changeInfo, tab)
{
if(typeof tab != "undefined" && typeof tab != "null" )
{
// If the tabs URL contains "specificsite.com"...
//This would work in the same way as *specificsite.com*, with 0 or more characters surrounding the URL.
if (/specificsite[.]com/.test(tab.url))
{
// ... show the page action.
chrome.pageAction.show(tabId);
}
}
};
// Listen for any changes to the URL of any tab.
chrome.tabs.onUpdated.addListener(checkForValidUrl);
to match the substring within the URL. It also helps with computation to do a null/undefined check to avoid additional exception handling.
匹配 URL 中的子字符串。它还有助于计算进行空/未定义检查以避免额外的异常处理。