我正在将 Chrome 扩展程序移植到 Firefox 扩展程序,由于其运行的网站的性质,我需要监视pushState
.
Chrome 扩展有一个方便的方法来处理这个问题:chrome.webNavigation.onHistoryStateUpdated
。我在Chrome扩展中的使用方式如下:
chrome.webNavigation.onHistoryStateUpdated.addListener(function(details) {
var tabUrl = details.url;
if (isTabUrlValid(tabUrl)) {
$.get(tabUrl, function(data) {
var videoUrl = $(data).find('meta[itemprop=contentURL]').prop('content');
videoUrl = validateUrl(videoUrl);
videoUrl5k = make5kUrl(videoUrl);
});
}
});
我需要对 Firefox 扩展执行同样的操作,但我还没有找到任何好的答案。我尝试过做这里提到的答案:如何通过history.pushState获得有关历史记录更改的通知?
(function(history) {
var pushState = history.pushState;
history.pushState = function(state) {
if (typeof history.onpushstate == "function") {
history.onpushstate({state: state});
}
var tabUrl = tabs.activeTab.url;
console.log("UPDATED TAB URL: " + tabUrl);
if (isTabUrlValid(tabUrl)) {
$.get(tabUrl, function(data) {
var videoUrl = $(data).find('meta[itemprop=contentURL]').prop('content');
videoUrl = validateUrl(videoUrl);
videoUrl5k = make5kUrl(videoUrl);
});
}
return pushState.apply(history, arguments);
};
})(window.history);
问题是当我这样做时cfx run
它抱怨说history/window is undefined
因此永远不会被发现。我认为这是由于它位于 SDK 内,但我不知道有什么好的解决方法。
有什么想法吗?
编辑:我看了下面 @willma 的答案,我认为这对我不起作用。问题是 URL 是通过以下方式更新的pushState
并且 DOM 不是...有什么好的方法可以复制我在 chrome 扩展中所做的事情吗?
编辑:这是pageMod
portion
pageMod.PageMod({
attachTo: 'top', // Don't attach to iFrames --> http://goo.gl/b6b1Iv
include: [URLs],
contentScriptFile: [data.url("jquery-2.1.1.min.js"),
data.url("csScript.js")],
onAttach: function(worker) {
worker.port.on('url', function(url) {
var videoUrl = validateUrl(url);
videoUrl5k = make5kUrl(videoUrl);
console.log("--5K URL--: " + videoUrl5k);
});
}
});