如何在Chrome控制台中包含JavaScript文件或库?


221

有没有更简单的方法(也许是本机?)在Google Chrome浏览器中包含外部脚本文件?

目前,我正在这样做:

document.head.innerHTML += '<script src="http://example.com/file.js"></script>';

6
您的意思是您想要一种快速的解决方案,在打开了开发人员工具的随机网页上包含一个文件?
Christian Tellnes 2011年

7
我做了一个附加操作:从Google商店下载
w00d 2012年


我使用它在控制台document.write(“ <script src =' cdnjs.cloudflare.com/ajax/libs/knockout/3.5.0/…)中加载淘汰赛
Deepak Vishwakarma

不幸的是,无法将本地javascript文件加载到控制台,Chrome不允许使用本地文件。
莎妍

Answers:


242

appendChild() 是更原生的方式:

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'script.js';
document.head.appendChild(script);

15
为了扩展Harman的答案,我将其包装在JS函数周围,并按如下方式使用它:var _loadScript = function(path){var script = document.createElement('script'); script.type ='文本/ javascript'; script.src =路径; document.head.appendChild(script); } _loadScript(' documentcloud.github.com/underscore/underscore-min.js'); _loadScript(' 骨架 js.org/backbone-min.js ');
Ajay Bhosale 2012年

我得到了:TypeError: Property 'appendChild' of object #<HTMLHeadElement> is not a function
穆罕默德·休伊迪

1
Ajay,谢谢,但是您几乎没有语法错误。复制/粘贴以下文本,以便在控制台中添加下划线。或替换其他库 var _loadScript = function(path){var script = document.createElement('script'); script.type ='文本/ javascript'; script.src =路径; document.head.appendChild(script); }; _loadScript(' underscorejs.org/underscore-min.js');
TPAKTOPA 2015年

谢谢!我使用script.innerHTML = javascript_code</ code>注入直接的JavaScript代码
Jonathan_Ng,

91

您是否使用一些AJAX框架?使用jQuery,它将是:

$.getScript('script.js');

如果您不使用任何框架,请参阅Harmen的答案。

(也许仅仅为了做一件简单的事情就不值得使用jQuery(或者也许是),但是如果您已经加载了jQuery,那么您也可以使用它。直接以不总是可移植的方式使用DOM API,而不是为此使用已加载的jQuery,而且许多人并不知道甚至getElementById()在所有浏览器上都无法正常工作的事实- 有关详细信息,请参见此答案。 )

更新:

自从我写了这个答案已经有好几年了,在这里值得指出的是,今天您可以使用:

动态加载脚本。这些可能与阅读此问题的人有关。

另请参见:Guy Bedford的Fluent 2014演讲:ES6模块的实际工作流程


它将从哪个文件夹加载脚本?
Qwerty 2014年

4
如果您以类似方式使用它$.getScript('script.js');$.getScript('../scripts/script.js');则它是相对于文档的,但是它也可以加载绝对URL,例如。$.getScript('https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.6.0/underscore.js');
rsp 2014年

如果使用jquery,则可以制作一个bookmarklet在页面上安装jquery,superuser.com
questions/1460015/…

38

在现代的浏览器中,您可以使用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 */ })

1
最新的Chrome浏览器不允许使用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:".
Vassilis's

2
@Vassilis我检查了一下,该代码段仍在Chrome Canary(64.0.3241.0)中有效。
Maciej Bukowski

2
我认为Vassilis的问题是因为他正在使用的应用程序上制定了内容安全策略。Chrome也适用于我。
所罗门语传道书

1
@Vassilis使用我的波纹管(stackoverflow.com/a/57814219/6553339)避免此错误
shmulik Friedman

16

在chrome中,最好的选择可能是开发人员工具中“源”下的“片段”标签。

例如,它将允许您在about:blank页面中编写和运行代码。

此处提供更多信息:https : //developers.google.com/web/tools/chrome-devtools/debug/snippets/?hl=zh-CN


6
虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
Enamul Hassan

2
我认为我的前两行是答案的必要部分。他们准确地描述了如何在Chrome中访问代码段。然后,我补充了Google文档。
atirado

是的,我个人认为这是最好的答案,因为它还显示了针对当前页面保存和运行任何JavaScript的开发人员和简便方法...不错!
布莱德·帕克斯

16

作为^^^上方 @ 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()。


2
安全政策至少在66版以上的Chrome新标签页上阻止了此操作。未捕获(承诺)EvalError:拒绝将字符串评估为JavaScript,因为在以下情况中不允许使用'unsafe-eval'脚本源内容安全政策指令:“ script-
src'strict

@Tatsh使用我的回答避免你的错误(stackoverflow.com/a/57814219/6553339
shmulik弗里德曼

6
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);

4

如果有人因为脚本违反了脚本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>

该解决方案之所以有效,是因为:

  1. 它在xhr中加载库-允许从控制台进行CORS,并避免使用script-src策略。
  2. 它使用xhr 的同步选项,该选项允许您停留在控制台/摘录的上下文中,因此您将有权评估脚本,而不会被视为不安全评估。

它对我不起作用:拒绝加载脚本raw.githack.com/shmuelf/PowerJS/master/src/…,因为它违反了以下内容安全策略指令:“ script-src ...
ThomasRones

1

我用它在控制台中加载ko基因敲除对象

document.write("<script src='https://cdnjs.cloudflare.com/ajax/libs/knockout/3.5.0/knockout-3.5.0.debug.js'></script>");

或在本地托管

document.write("<script src='http://localhost/js/knockout-3.5.0.debug.js'></script>");

0

安装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并刷新。

此解决方案可防止名称空间污染。您可以使用自定义名称空间来避免意外覆盖页面上现有的全局变量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.