使用第三方库

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(使用前将#替换为@)

使用第三方库 的相关文章

  • Google App Engine:修改云运行环境

    我正在尝试部署一个使用自定义 Node js 服务器的 Next js 应用程序 我想将自定义构建变量注入应用程序 next config js const NODE ENV process env NODE ENV const envTy
  • Javascript正则表达式用于字母字符和空格? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要一个
  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • 标签获取 href 值

    我有以下 html div class threeimages a img alt Australia src Images Services 20button tcm7 9688 gif a div class text h2 a hre
  • jquery.validate 中是否有一个函数可以像重置表单一样重置单个字段?

    我想调用 jquery 函数来手动删除单个字段中的错误并重置错误标记 是否有一个函数可以执行此操作 类似于 resetForm 函数 您可以执行以下操作来验证单个字段 your field valid 也许它会对某人有所帮助 Thanks
  • 音频 blob 的 URL.createObjectURL 在 Firefox 中给出 TypeError

    我正在尝试从创建的音频 blob 创建对象 URLgetUserMedia 该代码在 Chrome 中可以运行 但在 Firefox 中存在问题 错误 当我打电话时stopAudioRecorder 它停在audio player src
  • jQuery Mobile 表单验证

    我有一个移动网站 除了验证之外一切都工作正常 基本上我希望从用户那里获取值 然后在单独的页面 process php 上处理它们 但是 在这样做之前 我需要检查以确保字段已填充 我已经研究了几种方法来做到这一点 但似乎没有一种有效 我现在有
  • 在javascript中解析json - 长数字被四舍五入

    我需要解析一个包含长数字的 json 在 java servlet 中生成 问题是长数字被四舍五入 当执行这段代码时 var s x 6855337641038665531 var obj JSON parse s alert obj x
  • 动态地将工具提示文本设置为 div 元素

    我正在尝试动态地将工具提示文本设置为容器 div 并对我刚刚添加到有序列表的每个 div 元素 elem Alias Status 使用 jQuery function addNewElement elem var li li li li
  • 将div设置为隐藏,延时后可见

    我试图在 X 时间后 也许甚至在随机时间之后 但现在我们只做固定时间 在黑色背景上出现一个黄色方块 function initialSetup if document getElementById yellow null document
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • 如何在react-native中获取Text组件的onPress值

    我是一名新的 React Native 开发人员 我想使用 onPress 获取 Text 组件的值并将其传递给函数
  • 如何使用tampermonkey模拟react应用程序中的点击?

    我正在尝试使用 Tampermonkey 脚本模拟对 React 元素的点击 不幸的是 由于 React 有自己的影子 DOM 所以天真的方法使用document querySelector 不工作 我遇到了一些需要修改 React 组件本
  • 我可以使用 jQuery 打开下拉列表吗

    对于 HTML 中的下拉列表
  • 条件在反应本机生产中失败,但在开发中有效

    我创建了一个反应本机应用程序 我需要通过它进行比较 如果属实 就会执行死刑 问题是 该条件适用于 React Native 开发模式 而不适用于 React Native 生产版本 我使用 firebase 作为数据库 也使用 redux
  • Jquery 验证不能正确验证数字?

    我在使用 jquery 非侵入式验证验证数字时遇到问题 我使用的版本是 ASP NET MVC 3 jQuery 1 9 1 jQuery 用户界面 1 10 1 JQuery 验证 1 11 0 我试图验证的输入是
  • 在 React.js 中编辑丰富的数据结构

    我正在尝试为数据结构创建一个简单的基于网格的编辑器 但我在使用 React js 时遇到了一些概念问题 他们的文档对此没有太大帮助 所以我希望这里有人可以提供帮助 首先 将状态从外部组件传输到内部组件的正确方法是什么 是否有可能将内部组件中
  • Javascript/Jquery:确定用户是否使用鼠标滚轮、滚动条或键盘滚动

    我正在尝试让用户界面正常工作 如果他们使用鼠标滚轮 我需要让它以一种方式滚动 如果他们使用滚动条 我需要让它以另一种方式滚动 如果他们使用键盘 我需要让它以另一种方式滚动 我相信滚轮和滚动条都充当鼠标事件 但是当单击滚动条时我无法让 jav
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp
  • fullCalendar 未显示正确的结束日期

    我正在看调试页面 http jsbin com wukofacaxu edit js outputFullCalendar 官方网站的 我想安排一个活动时间为 22 09 2015 至 30 09 2015 dd mm yyyy 但它只显示

随机推荐

  • 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并