Javascript 从页面操作获取选项卡URL(WebExtensions,Android)

Javascript 从页面操作获取选项卡URL(WebExtensions,Android),javascript,android,google-chrome-extension,tabs,firefox-addon-webextensions,Javascript,Android,Google Chrome Extension,Tabs,Firefox Addon Webextensions,我想在页面操作弹出窗口中获取当前选项卡的URL。 一开始似乎很明显:只需使用API即可。但是,如果我正确解读文档,Android上似乎无法实现这一点。所以我一直在寻找其他东西,并找到了pageAction API的事件 似乎与Android兼容,onClicked事件标记为受支持。这意味着它实际上会返回一个tabs.Tab对象。但真的吗?有人试过吗 检索URL的最佳方式是什么?我知道我可以只使用一个内容脚本,让它在每个选项卡中运行,并创建一个长期消息连接,以便在请求时将URL发送到页面操作弹出窗

我想在页面操作弹出窗口中获取当前选项卡的URL。
一开始似乎很明显:只需使用API即可。但是,如果我正确解读文档,Android上似乎无法实现这一点。所以我一直在寻找其他东西,并找到了pageAction API的事件

似乎与Android兼容,onClicked事件标记为受支持。这意味着它实际上会返回一个tabs.Tab对象。但真的吗?有人试过吗

检索URL的最佳方式是什么?我知道我可以只使用一个内容脚本,让它在每个选项卡中运行,并创建一个长期消息连接,以便在请求时将URL发送到页面操作弹出窗口。但与使用tabsapi相比,这将是非常低效的,并且使代码变得异常复杂

还有什么我可以做的吗?

Current(Firefox 54及更高版本) 从Firefox 54开始,Android版Firefox中提供了。这意味着您可以使用桌面Firefox可用的常规方法。明确地但是,您需要在应用程序中使用
activeTab
和/或
tabs

chrome.tabs.query

chrome.tabs.query({active:true,currentWindow:true},function(tabs){
    //'tabs' will be an array with only one element: an Object describing the active tab
    //  in the current window.
    var currentTabUrl = tabs[0].url;
});
browser.tabs.query({active:true,currentWindow:true}).then(function(tabs){
    //'tabs' will be an array with only one element: an Object describing the active tab
    //  in the current window.
    var currentTabUrl = tabs[0].url;
});
browser.tabs.query

chrome.tabs.query({active:true,currentWindow:true},function(tabs){
    //'tabs' will be an array with only one element: an Object describing the active tab
    //  in the current window.
    var currentTabUrl = tabs[0].url;
});
browser.tabs.query({active:true,currentWindow:true}).then(function(tabs){
    //'tabs' will be an array with only one element: an Object describing the active tab
    //  in the current window.
    var currentTabUrl = tabs[0].url;
});
在Firefox54之前 如果已定义页面/浏览器操作弹出窗口 如果为页面/浏览器操作定义了弹出窗口,则不会触发
onClicked
事件。创建/显示弹出窗口时,不会向您传递任何信息。因此,您将不会收到对象。获取选项卡信息的正常方式是从中获取,正如您已经确定的,在Firefox for Android中还没有

这是非常有限的。对于您想要做的事情,使用事件来记录每个选项卡的第0帧URL将比在每个页面中使用内容脚本更有效。您可以根据需要使用或事件。您需要假设当前窗口的活动选项卡是最近发生
webNavigation
事件的选项卡,或者您也可以监视事件。但是,无论您以何种方式进行操作,您假设哪个选项卡是当前选项卡都只是一种假设,在某些情况下是不准确的

更准确的URL(和活动选项卡确定)需要使用内容脚本 如果正在访问的页面通过某种不触发导航的方法更改选项卡的URL,则使用
webNavigation
事件将不会为您提供更新的URL。如您所知,如果没有
选项卡
API,当您定义一个实际的页面/浏览器操作弹出窗口(因此不会得到
选项卡.选项卡
对象)时,确保您拥有该选项卡的实际当前URL的唯一方法是在每个页面中插入一个内容脚本。您可能需要内容脚本来不断更新URL,或者正在侦听来自后台/弹出脚本的信息请求。从后台/弹出脚本到内容脚本的通信必须通过
存储
API完成,因为没有
选项卡
API(即否)

使用页面/浏览器操作
onClicked
我还没有在Android上的Firefox上尝试过的另一种方法是不定义实际的页面/浏览器操作弹出窗口。如果未定义实际的弹出窗口,则会收到
onClicked
事件(获取带有活动选项卡ID和URL的
tabs.Tab
对象),然后可以1



一,。在我的链接答案中打开一个伪弹出窗口的实现使用了和API,这两个API目前都不适用于Firefox for Android。可以重新编写以使用上述
webNavigation
listener跟踪选项卡URL,并使用
window.open()
打开用于伪弹出窗口的窗口。再说一次,我还没有在Android上用Firefox测试过它,以确定它是否真的有效。

你可以通过webextensions获得它。请注意,如果要调试弹出窗口,必须“防止关闭弹出窗口”(浏览器工具箱右上角的4个正方形图标)


我希望这将对您有所帮助,

听起来您已经在编写代码,基本上已经具备了测试
pageAction.onClicked
事件是否提供了
tab.Tabs
对象所需的一切。为什么你问有没有人试过而不是自己试过?因为我现在没有安卓手机。Firefox什么时候会触发webNavigation事件?我是否真的能够在导航栏中的URL发生变化时找到答案?该计划似乎没有得到充分实施。我特别担心像YouTube这样的网站会使用一些黑魔法来更改URL。请注意,Android对tabs API的支持即将登陆,应该在Firefox 54中。看见