- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想集成一个 Timeline在我的 chrome 扩展中。我已经下载了这个插件的 js 文件和 css 文件,并将它们放在我的 chrome 扩展程序的根目录中。
chrome 扩展本身只是将 JS 注入(inject)现有页面并修改 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"));
content.js 执行后,ui.js 成功注入(inject) 到页面,我在页面上看到我添加的按钮。现在,当我想像这样使用库时:
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 扩展中成功使用第三方库,我错过了什么?
最佳答案
您错过了 isolated contexts 的重点以及它如何与动态交互 <script>
元素。
每个页面都包含一个 DOM 结构和它自己的 JavaScript 执行上下文,即“页面”上下文。
当扩展将内容脚本添加到页面时,它会创建一个单独的 JavaScript 上下文,附加到相同的 DOM。这两个上下文看不到对方:如果你在一个中有一个变量,它不存在于另一个中。这包括全局对象,例如 window
: 每个上下文都有自己的副本。
造成这种隔离的主要原因是:
您的代码创建内容脚本上下文并添加 content.js
, jquery-3.2.1.min.js
和 vis.min.js
到它(按照特定的顺序,如果 content.js 需要任何库,这本身可能是一个问题)。
但接下来发生的是您创建一个新的 DOM 脚本节点并在其中添加您的脚本。这将在页面上下文中执行。
因此,在您的情况下,ui.js
在某处加载 vis.min.js
未加载,导致错误;同样,如果您尝试使用 ui.js
从内容脚本上下文中,它不会加载到那里。
如果您最初尝试解决的问题是动态内容脚本注入(inject),您有 2 个选择:
chrome.tabs.executeScript
按需来自 content.js
- 这增加了相同的上下文。eval()
它们,这在内容脚本中是允许的(但可能会在发布时导致审核问题)。如果您需要从页面上下文访问数据,您将需要cross the boundary ,但您需要了解它以及如何pass messages through it .
关于javascript - 使用第三方库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47792273/
我有 asp.net mvc 2 应用程序。 现在我正在重新实现它以使用 Ninject .除了一件事,一切都很好:我应该在哪里存储 Ninject.dll ?? 我创建了 lib我的 appdir
我有一个使用第三方 FTP 库的类 http://ftps.codeplex.com/我想模拟它,这样我就可以只测试那个类而不是 FTP 库。我已经做到了,但对我来说感觉很乱。详细地说,该类使用 Al
我正在尝试关注 Ilya Grigoric's performance best practices通过内联关键的 css 和 js 并在以后异步加载所有其余部分。 我的问题是当我的页面需要第 3 方
我正在开发聊天应用程序。我有像 Skype 这样的聊天同步选项。假设我登录了设备 A,并且已经通过该设备进行了聊天。现在,当我当时登录设备 B 时,所有聊天记录都会同步到设备 B。 XMPP 问题 我
我在 VS2010 上有两个项目的解决方案。 主工程引用并依赖第二个,构建为静态库。第二个使用未在解决方案中构建的静态第三方库,但仅在第二个项目的链接器设置中引用。 如果我尝试生成解决方案,VS失败,
我想跟踪从另一个第 3 方库发出的对某些第 3 方库的调用。 示例:我想跟踪对库 A 的调用。我的应用程序静态链接库 B,而库 B 又静态链接到库 A。所以基本上我拥有的是 libAB.a 在动态链接
代码显示使用 -cp 触发器编译但未运行。显然,它找不到 HashMultimap。类路径问题? $ javac -cp google-collect-1.0.jar MultiThing.java
我所拥有的:我的代码(简单的 main.cpp)、第 3 方库的 header (EnvVar TPLIB_INCLUDE)、二进制库(TPLIB_BINARY_PATH 中的几个 .a 文件)和以下
我是 ionic 的新手,需要一些帮助: 我已经通过 here 中的教程实现了 chart.js 之类的东西,我真的很喜欢这个结果。 但我尝试用来自 processing 的 p5.js 做同样的事情
是否可以在 MonoTouch 中使用用 C# 编写的第 3 方库?例如,如果我需要进行图像处理并需要使用图像处理库... 或者重新表述问题:有人可以向我解释一下用 Objective-C 或 C#
我目前正在努力将一组 C++ 二进制文件升级为基于 Autotools 的更现代的东西,每个文件都使用自己的 Makefile 集。但是我不知道如何将第三方库(例如 Oracle Instant Cl
在过去的几个月里,我的学习速度一直很慢,并且很好奇 C++ 标准是否使用第 3 方库。我问这个的原因是因为 C++20 说可能的库更改将包括我被告知在 Boost ASIO 之后需要的网络。 Boos
我正在尝试开始使用 angular 2 cli。 我想在我的项目中使用 momentjs,所以这是我所做的: 1. 使用angular cli创建项目。 2. 运行 npm install --sav
我的配置如下: OCaml 由 Homebrew 根据其默认配方安装。它住在 /usr/local/Cellar/objective-caml/3.12.0/[bin,lib,share] ,其内容被
这个问题在这里已经有了答案: 9年前关闭。 Possible Duplicate: Managing 3rd party sources and binaries used by code under
所以我在项目中使用专有的 java 库,我无法访问源代码。 它抛出一个Message对象,显然我不能实现Serializable。它在整个运行时生成。 我有哪些选择?有没有办法将 Message 对象
我正在尝试使用以下方法将 Google Plus 身份验证引入 CodeIgniter: https://code.google.com/p/google-api-php-client/ 我已经把这些
我的配置中有以下内容: const viewerConfigProdWeb = merge(common.commonWebConfig, { output: { path: outputPa
在生产项目中使用 3rd 方库/组件时,您是否严格要求仅使用所述库的已发布版本? 您什么时候考虑使用库的预发布或测试版(在开发中?在生产中,在某些情况下)? 如果您遇到库的错误或缺点并且您已经 pro
我正在尝试将 qpOASES c++ 库包含在我在 RStudio 中构建的 Rcpp 项目中。 我浏览了编写 R 包和各种 Rcpp 小插图。我找到了这个 post其中引用 this存档对话。按照我
我是一名优秀的程序员,十分优秀!