使用第三方库

2024-01-11

我想集成一个Timeline http://visjs.org/docs/timeline/在我的镀铬扩展中。我已经下载了这个插件的js文件和css文件,并将它们放在我的chrome扩展的根目录中。

chrome 扩展本身只是向现有页面注入JS并修改html代码。但是,当我尝试使用该库时,我会收到错误消息:

Uncaught ReferenceError: vis is not defined
    at addTimeLine (ui.js:230)
    at createClientBox (ui.js:270)
    at ui.js:62

这是我的manifest.json:

  "content_scripts": [{
    "matches": ["https://web.whatsapp.com/*"],
    "css":["vis.min.css"],
    "js": ["content.js","jquery-3.2.1.min.js","vis.min.js"],
    "run_at": "document_end"
  }],
  "permissions": [
    "activeTab"
  ],

这里是 content.js:

function injectJs(link) {
        var scr = document.createElement("script");
        scr.type="text/javascript";
        scr.src=link;
        (document.head || document.body || document.documentElement).appendChild(scr);
}

//injectJs(chrome.extension.getURL("/vis.min.js"));
injectJs(chrome.extension.getURL("/ui.js"));

之后内容.js被执行的是ui.js 注入成功到页面,我在页面上看到我添加的按钮。现在,当我想像这样使用该库时:

    var addTimeLine = function () {
        var visualization = document.createElement('div');
        visualization.id = 'visualization';
        // Get the conatiner where the timeline should be displayed
        var container = document.getElementById('visualization');

        // Create a DataSet (allows two way data-binding)
        var items = new vis.DataSet([{
                id: 1,
                content: 'item 1',
                start: '2013-04-20'
            },
            {
                id: 2,
                content: 'item 2',
                start: '2013-04-14'
            },
            {
                id: 3,
                content: 'item 3',
                start: '2013-04-18'
            },
            {
                id: 4,
                content: 'item 4',
                start: '2013-04-16',
                end: '2013-04-19'
            },
            {
                id: 5,
                content: 'item 5',
                start: '2013-04-25'
            },
            {
                id: 6,
                content: 'item 6',
                start: '2013-04-27'
            }
        ]);

        // Configuration for the Timeline
        var options = {};

        // Create a Timeline
        var timeline = new vis.Timeline(container, items, options);
    };

    addTimeLine();

我会收到上面的错误消息。

为了在 Chrome 扩展中成功使用第三方库,我缺少哪一点?


你没有抓住要点孤立的背景 https://developer.chrome.com/extensions/content_scripts#execution-environment以及它如何与动态交互<script>元素。

每个页面都包含一个 DOM 结构和它自己的 JavaScript 执行上下文,即“页面”上下文。

当扩展程序向页面添加内容脚本时,它会创建一个separateJavaScript 上下文,附加到同一个 DOM。这两个上下文不会互相看到:如果一个变量在一个上下文中,则它不会出现在另一个上下文中。这包括全局对象,例如window:每个上下文都有自己的副本。

这种隔离的主要原因是:

  • 安全性:页面不能干扰更高权限的内容脚本上下文,也不能直接检测其存在。
  • 方便:页面上下文和扩展可以使用不同的不兼容的库;页面上下文可以使用任何名称而不会发生冲突; ETC。

您的代码创建内容脚本上下文并添加content.js, jquery-3.2.1.min.js and vis.min.js(按照特定的顺序,如果 content.js 需要任何库,这本身可能就是一个问题)。

但接下来会发生的是,您创建一个新的 DOM 脚本节点并在其中添加脚本。这将被执行相反,在页面上下文中.

所以,按照你的情况,ui.js加载某处vis.min.js未加载,导致错误;同样,如果您尝试使用ui.js从内容脚本上下文中,它不会被加载到那里。

如果您最初试图解决的问题是动态内容脚本注入,您有 2 个选择:

  1. 使用一个后台页面,可以执行chrome.tabs.executeScript根据要求从content.js- 这增加了相同的上下文。
  2. (核选项)获取脚本的内容并eval()它们,在内容脚本中是允许的(但可能会在发布时导致审核问题)。

如果您需要从页面上下文访问数据,您will需要跨越边界 https://stackoverflow.com/questions/9515704/insert-code-into-the-page-context-using-a-content-script,但您需要了解这一点以及如何通过它传递消息 https://stackoverflow.com/a/26141393/934239.

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

使用第三方库 的相关文章

随机推荐

  • PSQL:如何防止命令行上出现任何输出?

    我的问题 我尝试通过批处理文件在命令行运行数据库生成脚本 作为 TFS 构建过程的一部分 以启用对已知数据集的夜间测试 我们运行的脚本在命令行上输出通知 警告和一些错误 我想至少抑制通知和警告 如果可能的话 抑制错误 因为它们似乎不会对脚本
  • 使用 PHP 识别数字

    我正在尝试从图片中提取一些范围从 1 到 99 的数字 我已经尝试了几种使用 PHP 的 OCR 方法 但最终我的脚本会失败 因为数字偶尔会向左或向右旋转 5 这使得图片无法识别 我现在已经安装了 Ocropushttp code goog
  • 如何捕获通过管道传输到 Rust 程序的进程的输出?

    我知道如何读取命令行参数 但我在读取管道的命令输出时遇到困难 使用管道连接一个将数据输出到我的 Rust 程序的程序 A A R 程序应该逐行消耗数据 pwd cargo run应该打印pwd output OR find cargo ru
  • Haskell:具有 O(1) 附加和 O(1) 索引的数据结构?

    我正在 Haskell 中寻找一种支持快速索引和快速追加的数据结构 这是针对递归引起的记忆问题 从向量在 C 中的工作方式 它们是可变的 但这在本例中并不重要 看来 具有 摊销 O 1 附加和 O 1 索引的不可变向量应该是可能的 好吧 这
  • 当我使用提交哈希时,为什么 git revert 告诉我“错误的修订”?

    我试图恢复到较早的 git 提交 但收到错误 错误修订 为什么 以下是文字记录 已删除作者姓名 Ellen ELLEN PC c Users Susan Mills git hello github master git status On
  • 在 kubernetes statefulset 中的 elasticsearch 数据目录上 chown 时权限被拒绝

    希望有人可以帮助我解决似乎是权限错误的问题 我正在尝试使用官方的elasticsearch docker 镜像启动一个3节点的elasticsearch集群 当容器启动时 我在 usr share elasticsearch data no
  • 如何使用 python pandas 基于特定(字符串)列对数据框进行排序?

    我的 Pandas 数据框包含以下数据 product values a1 10 a5 20 a10 15 a2 45 a3 12 a6 67 我必须根据产品列对该数据框进行排序 因此 我想得到以下输出 product values a10
  • 无法使用 mongodb+srv 将 Mongo shell 连接到 Mongo Atlas M0

    我正在尝试通过以下方式连接到我的 MongoDB Atlas Cloud 集群mongo srv像这样连接 mongo mongodb srv cluster0 mhzdc mongodb net test username myuser
  • 自动筛选 Excel VBA 后删除隐藏/不可见行

    我想这很简单 但由于某种原因 它似乎对我不起作用 我有以下代码 它根据我指定的条件自动过滤数据 Dim lastrow As Long lastrow Sheet2 Cells Sheet2 Rows Count A End xlUp Ro
  • 在 TypeScript 中调用泛型类的静态函数

    给定一个泛型类Foo
  • 如何使用 PHP 打开新的 CMD 窗口

    在过去的几天里 我正在用 PHP 编写一些代码来弹出一个CMD窗户和这个CMDwindows有一个像 ping google com 并处理它我不需要 PHP 代码来读取结果 我只希望它运行它 我尝试过类似的东西
  • 如何在 Javascript 中比较日期?

    我有以下情况 我有一个运行循环并执行某些操作的函数 错误条件可能会使其退出该循环 我希望能够检查循环是否仍在运行 为此 我正在为每个循环运行执行以下操作 LastTimeIDidTheLoop new Date 在另一个每 30 秒运行一次
  • IIS 8.5应用程序初始化和Windows身份验证

    我正在尝试使用 IIS 8 5 上的应用程序初始化模块来预热 Intranet 应用程序 设置正确并且预热有效 但是一旦我禁用匿名身份验证 应用程序就不再预加载 内存使用量仅为 20mb 而初始化访问站点时内存使用量约为 200mb 由于这
  • Node.js:高效读取一系列行

    我目前正在使用 Node js 并且想知道如何从大型文本文件中读取一系列行 一个明显的解决方案如下所示 var fs require fs fs readFile file function err data var lines data
  • Javascript 数字和货币本地化 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在 JavaScript 中遇到了数字和货币本地化问题 我需要的是一个方便的library为了那个原
  • Spark BlockManager 在本地主机上运行

    我有一个简单的脚本文件 我试图在模仿教程的 Spark Shell 中执行here https spark apache org examples html import org apache spark SparkConf import
  • 为什么要用“FragmentDefinition”包装“Dialog”?

    UI5 对话框可以直接定义为Dialog
  • Gmail、Yahoo、Facebook、Twitter 联系人 PHP 中的导入器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • iOS:在后台更新媒体信息

    我目前在我的应用程序中使用 MPNowPlayingInfoCenter 来显示正在播放哪首歌曲 但我希望将 HTTP Live Streaming 合并到我的应用程序中 该应用程序将在后台出现任意数量的不同曲目 有没有办法在应用程序处于后
  • 使用第三方库

    我想集成一个Timeline http visjs org docs timeline 在我的镀铬扩展中 我已经下载了这个插件的js文件和css文件 并将它们放在我的chrome扩展的根目录中 chrome 扩展本身只是向现有页面注入JS并