【发布时间】:2014-09-26 20:45:19
【问题描述】:
我正在将 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 扩展做同样的事情,但我没有找到任何好的答案。我试过做这里提到的答案:How to get notified about changes of the history via 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 部分
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);
});
}
});
【问题讨论】:
-
让我知道答案是否有帮助或者您是否有任何问题。
标签: firefox firefox-addon firefox-addon-sdk pushstate