有没有更简单的方法(也许是本机?)在Google Chrome浏览器中包含外部脚本文件?
目前,我正在这样做:
document.head.innerHTML += '<script src="http://example.com/file.js"></script>';
有没有更简单的方法(也许是本机?)在Google Chrome浏览器中包含外部脚本文件?
目前,我正在这样做:
document.head.innerHTML += '<script src="http://example.com/file.js"></script>';
Answers:
appendChild()
是更原生的方式:
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'script.js';
document.head.appendChild(script);
TypeError: Property 'appendChild' of object #<HTMLHeadElement> is not a function
javascript_code
</ code>注入直接的JavaScript代码
您是否使用一些AJAX框架?使用jQuery,它将是:
$.getScript('script.js');
如果您不使用任何框架,请参阅Harmen的答案。
(也许仅仅为了做一件简单的事情就不值得使用jQuery(或者也许是),但是如果您已经加载了jQuery,那么您也可以使用它。直接以不总是可移植的方式使用DOM API,而不是为此使用已加载的jQuery,而且许多人并不知道甚至getElementById()
在所有浏览器上都无法正常工作的事实- 有关详细信息,请参见此答案。 )
自从我写了这个答案已经有好几年了,在这里值得指出的是,今天您可以使用:
动态加载脚本。这些可能与阅读此问题的人有关。
$.getScript('script.js');
,$.getScript('../scripts/script.js');
则它是相对于文档的,但是它也可以加载绝对URL,例如。$.getScript('https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.6.0/underscore.js');
在现代的浏览器中,您可以使用fetch下载资源(Mozilla docs),然后评估执行该资源。
例如,要下载Angular1,您需要输入:
fetch('https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js')
.then(response => response.text())
.then(text => eval(text))
.then(() => { /* now you can use your library */ })
eval
,并显示以下消息: VM1929:11 Uncaught (in promise) EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'self' blob: filesystem: chrome-extension-resource:".
在chrome中,最好的选择可能是开发人员工具中“源”下的“片段”标签。
例如,它将允许您在about:blank页面中编写和运行代码。
此处提供更多信息:https : //developers.google.com/web/tools/chrome-devtools/debug/snippets/?hl=zh-CN
作为^^^上方 @ maciej-bukowski的回答的后续部分,截至目前(2017年春季)的现代浏览器(支持async / await)可以按如下方式加载。在此示例中,我们加载html2canvas库:
async function loadScript(url) {
let response = await fetch(url);
let script = await response.text();
eval(script);
}
let scriptUrl = 'https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js'
loadScript(scriptUrl);
如果运行该代码段,然后打开浏览器的控制台,则应该看到现在已定义函数html2canvas()。
var el = document.createElement("script"),
loaded = false;
el.onload = el.onreadystatechange = function () {
if ((el.readyState && el.readyState !== "complete" && el.readyState !== "loaded") || loaded) {
return false;
}
el.onload = el.onreadystatechange = null;
loaded = true;
// done!
};
el.async = true;
el.src = path;
var hhead = document.getElementsByTagName('head')[0];
hhead.insertBefore(el, hhead.firstChild);
如果有人因为脚本违反了脚本src“内容安全策略”或“因为不允许使用unsafe-eval”而无法加载,我建议使用我的小型模块注入器作为开发工具代码段,那么您就可以像这样加载:
imports('https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js')
.then(()=>alert(`today is ${moment().format('dddd')}`));
<script src="https://raw.githack.com/shmuelf/PowerJS/master/src/power-moduleInjector.js"></script>
该解决方案之所以有效,是因为:
安装tampermonkey并添加以下用户脚本以及一个(或多个)@match
具有特定页面网址(或所有页面的匹配项:)的示例,https://*
例如:
// ==UserScript==
// @name inject-rx
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Inject rx library on the page
// @author Me
// @match https://www.some-website.com/*
// @require https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.4/rxjs.umd.min.js
// @grant none
// ==/UserScript==
(function() {
'use strict';
window.injectedRx = rxjs;
//Or even: window.rxjs = rxjs;
})();
每当您需要在控制台或代码段上使用该库时,请启用特定的UserScript并刷新。
此解决方案可防止名称空间污染。您可以使用自定义名称空间来避免意外覆盖页面上现有的全局变量。