2014-09-19 541 views
2

我刚刚开始构建chrome扩展,并且因为我需要仅为特定网址显示其图标,所以我使用了page_action。 我也是使用的事件监听如果该URL的变化和这种方式来显示图标符合我的模式:如何在chrome.declarativeContent.PageStateMatcher中使用UrlFilter过滤网址(#)(哈希标签)

chrome.declarativeContent.onPageChanged.addRules([ 
{ 
    conditions: [ 
     new chrome.declarativeContent.PageStateMatcher({ 
      pageUrl: { urlContains: 'https://mysite.com/mypage.html' } 
     }) 
    ], 
    actions: [ new chrome.declarativeContent.ShowPageAction() ] 
} 
]); 

它工作正常,但是当我要添加查询的第一个字符的过滤器,它失败。 URL模式我想过滤的样子: https://mysite.com/mypage.html#e123456789

我尝试以下,但它并没有帮助:

pageUrl: { urlContains: 'https://mysite.com/mypage.html#e' } 
pageUrl: { urlContains: 'https://mysite.com/mypage.html', queryPrefix: '#e' } 
pageUrl: { urlContains: 'https://mysite.com/mypage.html', queryPrefix: 'e' } 

我认为,这个问题来自于哈希标签。

任何想法的解决方法?

+0

尝试'pathContains'代替。如果它有效,我会将其作为答案。 – Xan 2014-09-19 08:16:04

+0

嗨Xan,感谢您的快速回答,但由于某些原因,它既不工作也不工作。它看起来不能检查哈希标记后面的内容。 – Surreal 2014-09-19 08:27:40

+0

这有点奇怪。我会在https://crbug.com上提交功能请求,看看他们有什么要说的。 – Xan 2014-09-19 08:29:42

回答

1

URL的#...部分称为“参考片段”(俗称“散列”)。

URLFilters当前不支持参考片段,此功能已有一个错误报告:Issue 84024: targetUrlPatterns and URL search/hash component

如果您确实想根据参考片段的状态显示页面操作,那么您可以使用chrome.webNavigation.onReferenceFragmentUpdated事件而不是declarativeContent API。例如(摘自我的回答How to show Chrome Extension on certain domains?;看到这个问题的答案为manifest.json用于测试):

function onWebNav(details) { 
    var refIndex = details.url.indexOf('#'); 
    var ref = refIndex >= 0 ? details.url.slice(refIndex+1) : ''; 
    if (ref.indexOf('e') == 0) { // Starts with e? show page action 
     chrome.pageAction.show(details.tabId); 
    } else { 
     chrome.pageAction.hide(details.tabId); 
    } 
} 
// Base filter 
var filter = { 
    url: [{ 
     hostEquals: 'example.com' 
    }] 
}; 
chrome.webNavigation.onCommitted.addListener(onWebNav, filter); 
chrome.webNavigation.onHistoryStateUpdated.addListener(onWebNav, filter); 
chrome.webNavigation.onReferenceFragmentUpdated.addListener(onWebNav, filter); 
+0

有什么办法可以避免在页面上单击#链接时触发操作? (这是我找到的唯一相关答案)。我正在用'PageStateMatcher'测试'rule',其中包含'pathEquals:'/ menu''。内部页面链接修改URL(例如:/ menu#settings),这会导致我的脚本再次被注入。 – IvanRF 2017-06-07 00:00:15

+0

@IvanRF在你的脚本中,在继续之前检查一个全局变量是否存在,然后设置这个全局变量以确保脚本运行一次。 – 2017-06-07 08:16:21

+0

谢谢,我看到[这里]选项[https://stackoverflow.com/a/18423519/1718678],但我想知道如果我错过了关于'rules'的一些东西:) – IvanRF 2017-06-07 13:49:47