Bagaimana cara memasukkan file JavaScript atau perpustakaan di konsol Chrome?

221

Apakah ada cara (mungkin asli?) Yang lebih sederhana untuk memasukkan file skrip eksternal dalam browser Google Chrome?

Saat ini saya melakukannya seperti ini:

document.head.innerHTML += '<script src="http://example.com/file.js"></script>';
teknokrake
sumber
6
Maksud Anda, Anda ingin solusi cepat untuk memasukkan file pada halaman web acak di mana Anda telah membuka Alat Pengembang?
Christian Tellnes
7
Saya membuat add-on untuk melakukan ini: unduh dari google store
w00d
2
kemungkinan duplikat Muat javascript melalui Firebug console
gak
Saya menggunakan ini untuk memuat sistem gugur di console document.write ("<script src = ' cdnjs.cloudflare.com/ajax/libs/knockout/3.5.0/… )
Deepak Vishwakarma
Sayangnya tidak ada cara untuk memuat file javascript lokal ke konsol, Chrome tidak akan mengizinkan file lokal untuk digunakan.
Shayan

Jawaban:

243

appendChild() adalah cara yang lebih asli:

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'script.js';
document.head.appendChild(script);
Harmen
sumber
15
Untuk memperluas jawaban Harman, saya membungkusnya di sekitar fungsi JS dan menggunakannya sebagai berikut ... var _loadScript = function (path) {var script = document.createElement ('script'); script.type = 'teks / javascript'; script.src = path; document.head.appendChild (script); } _loadScript (' documentcloud.github.com/underscore/underscore-min.js' ); _loadScript (' backbonejs.org/backbone-min.js' );
Ajay Bhosale
Saya mendapat:TypeError: Property 'appendChild' of object #<HTMLHeadElement> is not a function
Muhammad Hewedy
1
Ajay, terima kasih, tetapi Anda memiliki beberapa kesalahan sintaksis. salin / tempel teks di bawah ini, untuk memiliki garis bawah di konsol. Atau ganti dengan lib var lain _loadScript = fungsi (path) {var script = document.createElement ('script'); script.type = 'teks / javascript'; script.src = path; document.head.appendChild (script); }; _loadScript (' underscorejs.org/underscore-min.js' );
TPAKTOPA
Terima kasih! Saya menggunakan script.innerHTML = javascript_code</code> untuk menyuntikkan kode javascript langsung
Jonathan_Ng
91

Apakah Anda menggunakan kerangka kerja AJAX? Menggunakan jQuery akan menjadi:

$.getScript('script.js');

Jika Anda tidak menggunakan kerangka kerja apa pun maka lihat jawabannya oleh Harmen.

(Mungkin tidak layak menggunakan jQuery hanya untuk melakukan satu hal sederhana ini ( atau mungkin itu ) tetapi jika Anda sudah memilikinya dimuat maka Anda mungkin juga menggunakannya. Saya telah melihat situs web yang memuat jQuery misalnya dengan Bootstrap tetapi masih gunakan DOM API secara langsung dengan cara yang tidak selalu portabel, alih-alih menggunakan jQuery yang sudah dimuat untuk itu, dan banyak orang tidak menyadari fakta bahwa bahkan getElementById()tidak bekerja secara konsisten di semua browser - lihat jawaban ini untuk detailnya. )

MEMPERBARUI:

Sudah bertahun-tahun sejak saya menulis jawaban ini dan saya pikir ada baiknya menunjukkan di sini bahwa hari ini Anda dapat menggunakan:

untuk memuat skrip secara dinamis. Itu mungkin relevan bagi orang yang membaca pertanyaan ini.

Lihat juga: Pembicaraan Fluent 2014 oleh Guy Bedford: Alur Kerja Praktis untuk Modul ES6 .

rsp
sumber
Folder apa yang akan memuat skrip?
Qwerty
4
Jika Anda suka $.getScript('script.js');atau $.getScript('../scripts/script.js');kemudian itu relatif terhadap dokumen tetapi dapat memuat url absolut juga, misalnya. $.getScript('https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.6.0/underscore.js');
rsp
jika menggunakan jquery, maka Anda dapat membuat bookmarklet untuk menginstal jquery pada halaman, superuser.com/questions/1460015/…
barlop
38

Di browser modern, Anda dapat menggunakan fetch untuk mengunduh sumber daya ( Mozilla docs ) dan kemudian mengevaluasi untuk mengeksekusinya.

Misalnya untuk mengunduh Angular1, Anda perlu mengetik:

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 */ })
Maciej Bukowski
sumber
1
Chrome terbaru melarang penggunaan eval, dengan pesan berikut: 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 Saya memeriksa ini dan cuplikan masih berfungsi di Chrome Canary (64.0.3241.0).
Maciej Bukowski
2
Saya pikir masalah Vassilis adalah karena ada kebijakan keamanan konten pada aplikasi yang dia gunakan. Chrome juga berfungsi untuk saya.
Solomons_Ecclesiastes
1
@Vassilis menggunakan jawaban saya di bawah ( stackoverflow.com/a/57814219/6553339 ) untuk menghindari kesalahan ini
shmulik friedman
16

Di chrome, opsi terbaik Anda mungkin adalah tab Cuplikan di bawah Sumber di Alat Pengembang.

Ini akan memungkinkan Anda untuk menulis dan menjalankan kode, misalnya, di halaman about: blank.

Informasi lebih lanjut di sini: https://developers.google.com/web/tools/chrome-devtools/debug/snippets/?hl=id

atirado
sumber
6
Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
Enamul Hassan
2
Saya pikir dua baris pertama saya adalah bagian penting dari jawabannya. Mereka menjelaskan dengan tepat bagaimana cara mendapatkan Snippets di Chrome. Kemudian saya dilengkapi dengan dokumentasi Google.
atirado
Ya secara pribadi, saya pikir ini adalah jawaban terbaik, karena ia juga menunjukkan devs dan cara mudah untuk menyimpan dan menjalankan javascript terhadap halaman saat ini ... bagus!
Taman Brad
16

Sebagai tindak lanjut dari jawaban @ maciej-bukowski di atas ^^^ , di peramban modern seperti yang sekarang (musim semi 2017) yang mendukung async / menunggu Anda dapat memuat sebagai berikut. Dalam contoh ini kita memuat pustaka 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);

Jika Anda menjalankan cuplikan dan kemudian membuka konsol peramban, Anda akan melihat fungsi html2canvas () sekarang telah ditentukan.

jbustamovej
sumber
2
Kebijakan keamanan mencegah ini agar tidak berfungsi, setidaknya di laman tab baru Chrome pada versi 66. Tidak tertangkap (dalam janji) EvalError: Menolak untuk mengevaluasi string sebagai JavaScript karena 'tidak aman-eval' bukan sumber naskah yang diizinkan dalam mengikuti Arahan Kebijakan Keamanan Konten: "script-src 'strict-dynamic' ...
Tatsh
@Tatsh menggunakan jawaban saya untuk menghindari kesalahan Anda ( stackoverflow.com/a/57814219/6553339 )
shmulik friedman
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);
xiao 啸
sumber
4

Jika ada yang gagal memuat karena skrip hes melanggar skrip-src "Kebijakan Keamanan Konten" atau "karena tidak aman-eval 'tidak diizinkan", saya akan menyarankan menggunakan modul-injektor saya yang sangat kecil sebagai cuplikan dev-tools, maka Anda akan dapat memuat seperti ini:

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>

solusi ini berfungsi karena:

  1. Ini memuat perpustakaan di xhr - yang memungkinkan CORS dari konsol, dan menghindari kebijakan script-src.
  2. Ia menggunakan opsi sinkron xhr yang memungkinkan Anda untuk tetap pada konteks konsol / snippet, sehingga Anda akan memiliki izin untuk membuat skrip, dan tidak diperlakukan sebagai eval-tidak aman.
tukang goreng shmulik
sumber
Ini tidak berfungsi untuk saya: Menolak memuat skrip ' raw.githack.com/shmuelf/PowerJS/master/src/… ' karena melanggar arahan Kebijakan Keamanan Konten berikut: "script-src ...
ThomasRones
1

Saya menggunakan ini untuk memuat objek KO ko di konsol

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

atau tuan rumah secara lokal

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

Instal tampermonkey dan tambahkan UserScript berikut dengan satu (atau lebih) @matchdengan url halaman tertentu (atau kecocokan semua halaman :)https://* misalnya:

// ==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;

})();

Setiap kali Anda membutuhkan pustaka di konsol, atau pada cuplikan, aktifkan UserScript khusus dan segarkan.

Solusi ini mencegah polusi namespace . Anda dapat menggunakan ruang nama khusus untuk menghindari penimpaan variabel global yang ada di halaman secara tidak disengaja.

Jannis Ioannou
sumber