Как включить файл JavaScript или библиотеку в консоль Chrome?

221

Есть ли более простой (возможно, нативный) способ включить внешний файл сценария в браузер Google Chrome?

В настоящее время я делаю это так:

document.head.innerHTML += '<script src="http://example.com/file.js"></script>';
technocake
источник
6
Вы имеете в виду, что вы хотите быстрое решение включить файл на случайную веб-страницу, где вы открыли Инструменты разработчика?
Кристиан Теллн
7
Я сделал дополнение для этого: скачать из магазина Google
w00d
2
возможный дубликат загрузки javascript через консоль Firebug
gak
Я использую это для загрузки нокаута в консоль document.write ("<script src = ' cdnjs.cloudflare.com/ajax/libs/knockout/3.5.0/… )
Дипак Вишвакарма,
К сожалению, нет возможности загрузить локальный файл JavaScript в консоль, Chrome не позволяет использовать локальные файлы.
Шаян

Ответы:

243

appendChild() это более родной способ:

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'script.js';
document.head.appendChild(script);
Harmen
источник
15
Чтобы расширить ответ Хармана, я обернул его вокруг функции JS и использовал его следующим образом: var _loadScript = function (path) {var script = document.createElement ('script'); script.type = 'text / javascript'; script.src = путь; document.head.appendChild (сценарий); } _loadScript (' documentcloud.github.com/underscore/underscore-min.js' ); _loadScript (' backbonejs.org/backbone-min.js' );
Ajay Bhosale
Я получил:TypeError: Property 'appendChild' of object #<HTMLHeadElement> is not a function
Мухаммед Хьюди
1
Ajay, спасибо, но у вас есть несколько синтаксических ошибок. Скопируйте / вставьте текст ниже, чтобы подчеркнуть в консоли. Или замените на другую lib var _loadScript = function (path) {var script = document.createElement ('script'); script.type = 'text / javascript'; script.src = путь; document.head.appendChild (сценарий); }; _loadScript (' underscorejs.org/underscore-min.js' );
TPAKTOPA
Спасибо! Я использовал script.innerHTML = javascript_code</ code> для вставки прямого кода JavaScript
Jonathan_Ng
91

Используете ли вы некоторые AJAX Framework? Используя jQuery это было бы:

$.getScript('script.js');

Если вы не используете какие-либо рамки, то посмотрите ответ Хармена.

(Может быть, не стоит использовать jQuery только для того, чтобы сделать эту простую вещь ( или, может быть, так и есть ), но если вы уже загрузили его, то вы можете также использовать его. Я видел сайты, на которых загружен jQuery, например, с помощью Bootstrap, но все еще используйте DOM API напрямую, причем не всегда переносимым способом, вместо того, чтобы использовать для этого уже загруженный jQuery, и многие люди не осознают тот факт, что даже getElementById()он не работает согласованно во всех браузерах - см. этот ответ . )

ОБНОВИТЬ:

Прошло много лет с тех пор, как я написал этот ответ, и я думаю, что здесь стоит указать, что сегодня вы можете использовать:

динамически загружать скрипты. Они могут быть актуальны для людей, читающих этот вопрос.

См. Также: выступление Ги Бедфорда «Fluent 2014»: практические рабочие процессы для модулей ES6 .

RSP
источник
Из какой папки будет загружен скрипт?
Qwerty
4
Если вы используете его как $.getScript('script.js');или $.getScript('../scripts/script.js');тогда, это относительно документа, но он также может загружать абсолютные URL, например. $.getScript('https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.6.0/underscore.js');
RSP
если вы используете jquery, вы можете создать букмарклет для установки jquery на страницу, superuser.com/questions/1460015/…
barlop
38

В современных браузерах вы можете использовать fetch для загрузки ресурса ( документы Mozilla ) и затем eval для его запуска.

Например, чтобы скачать 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
2
@Vassilis Я проверил это, и фрагмент все еще работает в Chrome Canary (64.0.3241.0).
Мацей Буковски
2
Я думаю, что проблема Вассилиса в том, что в приложении, которое он использует, существует политика безопасности контента. Хром у меня тоже работает.
Solomons_Ecclesiastes
1
@Vassilis используйте мой ответ ниже ( stackoverflow.com/a/57814219/6553339 ), чтобы избежать этой ошибки
Шмулик Фридман
16

В Chrome лучшим вариантом может быть вкладка «Фрагменты кода» в разделе «Источники» в инструментах разработчика.

Это позволит вам писать и запускать код, например, на пустой странице about :.

Дополнительная информация здесь: https://developers.google.com/web/tools/chrome-devtools/debug/snippets/?hl=ru.

atirado
источник
6
Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить сюда основные части ответа и предоставить ссылку для справки.
Энамул Хасан
2
Я думал, что мои первые две строки были неотъемлемой частью ответа. Они точно описывают, как добраться до Snippets в Chrome. Затем я дополнил документацию Google.
Атирадо
Да, лично я думаю, что это лучший ответ, так как он также показывает разработчиков и простой способ сохранить и запустить любой javascript для текущей страницы ... приятно!
Брэд Паркс
16

Как продолжение ответа @ maciej-bukowski выше ^^^ , в современных браузерах (весна 2017 г.), которые поддерживают async / await, вы можете загрузить следующим образом. В этом примере мы загружаем библиотеку load 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 ().

jbustamovej
источник
2
Политика безопасности не позволяет этому работать, по крайней мере, на новой вкладке Chrome начиная с версии 66. Uncaught (в обещании) EvalError: Отказался оценивать строку как JavaScript, поскольку unsafe-eval не является допустимым источником сценария в следующих Директива политики безопасности контента: "script-src 'строгий-динамический' ...
Татш
@ Тэтш, используй мой ответ, чтобы избежать твоей ошибки ( stackoverflow.com/a/57814219/6553339 )
Шмулик Фридман
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

Если кому-то не удастся загрузить, потому что hes script нарушает script-src «Content Security Policy» или «unsafe-eval» не разрешен », я посоветую использовать мой довольно маленький модуль-инжектор в качестве фрагмента dev-tools, тогда вы сможете загрузить так:

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

Я использую это , чтобы загрузить объект нокаута в консоли

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с определенным URL-адресом страницы (или соответствием всех страниц :),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;

})();

Всякий раз, когда вам нужна библиотека на консоли или во фрагменте, включите определенный код пользователя и обновите.

Это решение предотвращает загрязнение пространства имен . Вы можете использовать пользовательские пространства имен, чтобы избежать случайного перезаписи существующих глобальных переменных на странице.

Яннис Иоанну
источник