2014-09-19 116 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