PushState 更改 - 相当于 Chrome 扩展 onHistoryStateUpdated

2023-12-04

我正在将 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);
    });
  }
});

该历史代码需要使用注入到选项卡中content script。现在,您的逻辑是当历史事件发生时,检查选项卡 URL 是否有效。

在 Firefox 中,逻辑则相反:打开选项卡时,检查其 URL 是否有效,如果有效,则向其附加一个脚本来监视历史事件。为此,您需要使用Page Mod.


编辑:所有代码

您缺少的一个关键概念是内容脚本和主/库脚本之间的区别。库脚本存储在lib并有权访问所有 SDK 模块,但无权访问 DOM、窗口对象……内容脚本存储在data,使用以下方式注入到页面中PageMod or tabs模块,可以访问 dom 和 window 对象,但无法访问任何 SDK 模块。内容脚本本质上类似于您附加标准 HTML 页面的页面脚本(带有<script></script>)但需要注意的是,它们不能与其他页面脚本共享变量,但它们can与主要脚本进行通信。

我提出这个问题的唯一原因是因为您最初的问题是尝试访问window来自主脚本的对象,你的小提琴中的问题是你试图访问tabs内容脚本内的模块。如果这仍然令人困惑,那么值得阅读此答案中最上面的链接。

main.js

const { PageMod } = require('sdk/page-mod');

var sendXHR = function(url) {
  // Do something with the new URL
  // See Request Module docs (below) for sending XHRs from main script.
}

const pageMod = PageMod({
  attachTo: 'top',
  include: '*',
  onAttach: function(worker) {
    worker.port.on('newURL', sendXHR);
  }
});

内容.js

var sendNewUrlToMain = function() {
  self.port.emit('newURL', location.href);
}

var pushState = window.history.pushState;
window.history.pushState = function(state) {
    if (typeof history.onpushstate == "function") {
        history.onpushstate({state: state});
    }
    sendNewUrlToMain();
    return pushState.apply(history, arguments);
}

window.addEventListener('hashchange', sendNewUrlToMain); 

这里有请求模块文档,用于制作 XHR。

注意:如果您不想使用请求模块(唯一的原因是您的 chrome 扩展已经有了标准 XHR 代码,并且不想花时间学习/重写该代码),您可以发送标准XHR来自content脚本,但这样做时,您可能会冒允许用户关闭选项卡的风险,从而在执行 XHR 回调之前销毁脚本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PushState 更改 - 相当于 Chrome 扩展 onHistoryStateUpdated 的相关文章

  • 从 Linux bash 解析 FB-Purity 的 Firefox idb(索引数据库 API)object_data blob

    我想从 Linux bash 脚本中读取由名为 FB Purity 的特定 Firefox 插件存储的结构化数据 我找到了一个名为 mozilla firefox b8eab5j0 default storage default moz e
  • 每次用户在地址栏中按 Enter 时,Firefox 插件都会执行某些操作

    我正在尝试编写一个扩展程序 用于监视每次有人在使用地址栏时按下回车键时的情况 步骤将类似于 用户在地址栏中输入一堆文本并按 Enter 键 我的插件启动并接收用户输入的内容 然后我的插件决定如何处理用户输入的字符串 我通过使用在步骤 2 中
  • Selenium Webdriver - Firefox 中元素不可点击错误

    通常在 Chrome 驱动程序中出现的元素不可点击错误也恰好在 Firefox 中出现 显示的错误消息 Exception in thread main org openqa selenium WebDriverException Elem
  • 如何指示 Applescript 打开带有链接的新 Firefox 窗口?

    我的代码看起来像这样 tell application Firefox open location http rubyquicktips tumblr com end tell 但如果我打开 Firefox 该链接将在新选项卡中打开 但我希
  • Firefox 上的 Angular JS 输入日期

    我有这些输入和这个模型
  • 将 FireBug 用于带有框架的网站

    我下载了 Firebug 并尝试使用它来调试使用框架的站点的 JS 我的理解是 当我进入 Firebug 中的 脚本 选项卡时 我会看到 aspx 上的 JS 函数以及包含的任何文件中的 JS 并且我将能够设置断点 然而 我在这个网站上看到
  • Firefox CSS 大纲错误?

    在 Chrome 和 IE9 上 我指定的 CSS 轮廓完全符合我的要求 并充当我正在设计的元素周围的第二个边框 但在 Firefox 上 轮廓会向外扩展 以便包含我生成的 after 伪元素以及主元素 这是一个错误 还是预期的 有什么好的
  • 元素不适应 Firefox 上的

    使用 ES6 ish D3js 模块运行 Angular 6 应用程序会导致 Firefox 出现问题 Chromium Chrome Safari 和 IE Edge 工作正常 伪代码看起来类似于 生产代码可以在下面找到
  • :target 伪类在 Firefox 中无法正常工作

    我正在使用 target 伪类制作一个具有 CSS 灯箱类型效果的页面 当您单击图像时 会弹出一个包含信息的框 当您单击任意位置时 该框会再次消失 它在 Chrome 和 IE 中运行良好 但在 Firefox 中存在一个奇怪的错误当您将鼠
  • 在 Firefox 中使用 Javascript 检测键盘布局

    有没有办法在 Firefox 中检测客户端的键盘布局 我知道 Chrome 的答案是肯定的 请参阅https developer mozilla org en US docs Web API Navigator keyboard https
  • 文本的彩虹色

    rainbowtext background image webkit gradient linear left top right top color stop 0 f22 color stop 0 15 f2f color stop 0
  • 哪个 Firefox 版本与 Selenium 2.48.0 兼容

    谁能帮我 哪个 Firefox 版本与 Selenium 2 48 0 兼容 Selenium WebDriver 2 48 支持到 firefox 41 0 版本 有关更多详细信息 请查看 selenium webdriver 的更新日志
  • 回到使用 ajax 的 PushState 条目

    我对以下情况有疑问 用户访问网站 用户点击使用history pushState的链接来更新url 通过ajax加载部分页面内容 使用jQuery 用户单击加载新页面的常规链接 用户点击返回返回到pushState条目 该页面现在仅显示通过
  • 使用 jQuery 选择具有数据属性的元素为其父元素分配一个 null ID

    这确实很奇怪 如果我使用 jQuery find 在滚动事件期间查找具有数据属性的子元素 然后滚动页面将重复添加和删除 IDparents这些元素 这很难描述 但这里有一个可重现的测试用例 http jsfiddle net 8fouvx9
  • Firefox 和 Safari 中的 MouseEvent.path 等效项

    我正在使用 Polymer 1 0 当点击 Chrome 中的按钮时MouseEvent被生成 这MouseEvent对象有一个path属性是单击按钮的父元素的有序数组 然而 在 Firefox 和 Safari 中 click生成的没有p
  • 在 Firefox 扩展中,如何将富文本/链接复制到剪贴板?

    具体来说 我想复制一个链接 带有文本和位置 然后能够将其粘贴到例如 Word 中作为链接 这是实际的代码 var richText a href gContextMenu linkText a var xfer Components cla
  • 如何在 Firefox 30 上调试 Greasemonkey 脚本?

    我一直在为 Youtube 开发一个 JavaScript 片段 它使用 Greasemonkey 并且还导入 Bootstrap 和 jQuery 库 该应用程序必须为每个搜索列表结果添加一个按钮 当用户单击该按钮时 它必须带出用户从其频
  • 仅适用于 Firefox 的不同字体大小

    我只是为我的网站添加一个帐户标题 仅显示玩家的用户名 我正在使用自定义字体 它在 Chrome 和 IE 上运行良好 但是对于 Firefox 它不显示自定义字体 只显示下一个可用字体 即 Verdana 我不介意 但我的问题是 Verda
  • 从画布保存/转换后文件质量下降的问题

    这是我正在使用的代码 代码位于这篇文章的底部 但这里是链接GitHubGist Noitidart ff addon snippet browseForBadgeThenCreateSaveAnApply js https gist git
  • 如何在 Linux/OS X 上温和地终止 Firefox 进程

    我正在使用 Firefox 进行一些自动化操作 尽管我可以从 shell 打开 Firefox 窗口 但我无法正确终止它 如果我kill火狐进程与kill 3 or kill 2当我下次打开新的 Firefox 窗口时 命令会询问我是否要在

随机推荐