จะรวมไฟล์ JavaScript หรือไลบรารีในคอนโซล Chrome ได้อย่างไร


221

มีวิธีที่ง่ายกว่า (เนทีฟหรือไม่) ในการรวมไฟล์สคริปต์ภายนอกในเบราว์เซอร์ Google Chrome หรือไม่?

ขณะนี้ฉันทำเช่นนี้:

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

6
คุณหมายถึงคุณต้องการทางออกที่รวดเร็วในการรวมไฟล์ไว้ในหน้าเว็บแบบสุ่มที่คุณได้เปิดเครื่องมือสำหรับนักพัฒนาหรือไม่?
Christian Tellnes

7
ฉันทำ Add-on เพื่อทำสิ่งนี้: ดาวน์โหลดจาก google store
w00d


ฉันใช้สิ่งนี้เพื่อโหลดสิ่งที่น่าพิศวงใน console document.write ("<script src = ' cdnjs.cloudflare.com/ajax/libs/knockout/3.5.0/ … )
Deepak Vishwakarma

น่าเสียดายที่ไม่มีวิธีการโหลดไฟล์จาวาสคริปต์ในคอนโซลคอนโซล Chrome จะไม่อนุญาตให้ใช้ไฟล์ในเครื่อง
Shayan

คำตอบ:


243

appendChild() เป็นวิธีพื้นเมืองมากขึ้น:

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

15
เพื่อขยายคำตอบของ Harman ฉันได้ล้อมรอบฟังก์ชัน JS และใช้ดังต่อไปนี้ ... var _loadScript = ฟังก์ชัน (เส้นทาง) {var script = document.createElement ('script'); script.type = 'text / javascript'; script.src = path; 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
ใช่ขอบคุณ แต่คุณมีข้อผิดพลาดทางไวยากรณ์น้อย คัดลอก / วางข้อความด้านล่างเพื่อขีดล่างในคอนโซล หรือแทนที่ lib อื่น ๆ _loadScript = ฟังก์ชัน (เส้นทาง) {var script = document.createElement ('script'); script.type = 'text / javascript'; script.src = path; document.head.appendChild (สคริปต์); }; _loadScript (' underscorejs.org/underscore-min.js' );
TPAKTOPA

ขอบคุณ! ฉันใช้ script.innerHTML = javascript_code</code> เพื่อฉีดรหัสจาวาสคริปต์โดยตรง
Jonathan_Ng

91

คุณใช้เฟรมเวิร์ก AJAX หรือไม่? ใช้ jQuery มันจะเป็น:

$.getScript('script.js');

หากคุณไม่ได้ใช้กรอบงานใด ๆ ให้ดูคำตอบของ Harmen

(อาจจะไม่คุ้มค่าที่จะใช้ jQuery เพียงทำสิ่งนี้ง่ายๆ ( หรืออาจจะเป็น ) แต่ถ้าคุณมีมันโหลดอยู่แล้วคุณก็อาจใช้มันเช่นกันฉันเคยเห็นเว็บไซต์ที่โหลด jQuery เช่น Bootstrap แต่ก็ยัง ใช้ DOM API โดยตรงในลักษณะที่ไม่สามารถพกพาได้เสมอแทนที่จะใช้ jQuery ที่โหลดไปแล้วและหลายคนไม่ทราบว่าแม้getElementById()จะใช้งานไม่ได้กับเบราว์เซอร์ทั้งหมด - ดูคำตอบนี้สำหรับรายละเอียด )

UPDATE:

เป็นเวลาหลายปีแล้วที่ฉันเขียนคำตอบนี้และฉันคิดว่ามันคุ้มค่าที่จะชี้ให้เห็นว่าวันนี้คุณสามารถใช้:

เพื่อโหลดสคริปต์แบบไดนามิก สิ่งเหล่านี้อาจเกี่ยวข้องกับคนที่อ่านคำถามนี้

ดูเพิ่มเติม: Fluent 2014 พูดคุยโดย Guy ฟอร์ด: เวิร์กโฟลว์การปฏิบัติสำหรับ ES6 โมดูล


มันจะโหลดโฟลเดอร์จากอะไร
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 คุณสามารถสร้าง bookmarklet เพื่อติดตั้ง jquery บนหน้าเว็บsuperuser.com/questions/1460015/…
barlop

38

ในเบราว์เซอร์สมัยใหม่คุณสามารถใช้การดึงข้อมูลเพื่อดาวน์โหลดทรัพยากร ( Mozilla docs ) จากนั้น 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
@Vililis ฉันตรวจสอบเรื่องนี้แล้วและข้อมูลโค้ดยังคงใช้ได้ใน Chrome Canary (64.0.3241.0)
Maciej Bukowski

2
ฉันคิดว่าปัญหา Vassilis เป็นเพราะมีนโยบายความปลอดภัยของเนื้อหาในแอพที่เขาใช้ Chrome ใช้งานได้สำหรับฉันเช่นกัน
Solomons_Ecclesiastes

1
@Vililis ใช้คำตอบการร้องของฉัน ( stackoverflow.com/a/57814219/6553339 ) เพื่อหลีกเลี่ยงข้อผิดพลาดนี้
shmulik คนทอดตัว

16

ใน Chrome ตัวเลือกที่ดีที่สุดของคุณอาจเป็นแท็บตัวอย่างภายใต้แหล่งที่มาในเครื่องมือสำหรับนักพัฒนา

มันจะช่วยให้คุณสามารถเขียนและเรียกใช้โค้ดตัวอย่างเช่นในหน้า about: blank

ข้อมูลเพิ่มเติมที่นี่: https://developers.google.com/web/tools/chrome-devtools/debug/snippets/?hl=th


6
ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
Enamul Hassan

2
ฉันคิดว่าสองบรรทัดแรกของฉันคือส่วนสำคัญของคำตอบ พวกเขาอธิบายอย่างชัดเจนถึงวิธีไปที่ตัวอย่างใน Chrome จากนั้นฉันก็เสริมด้วยเอกสารของ Google
atirado

ใช่โดยส่วนตัวแล้วฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดเพราะมันยังแสดง devs และวิธีที่ง่ายในการบันทึกและเรียกใช้จาวาสคริปต์ใด ๆ กับหน้าปัจจุบัน ... ดี!
Brad Parks

16

ตามคำตอบของ @ maciej-bukowski ด้านบน ^^^ในเบราว์เซอร์ที่ทันสมัย ​​ณ ตอนนี้ (ฤดูใบไม้ผลิ 2017) ที่รองรับ async / รอคุณสามารถโหลดได้ดังนี้ ในตัวอย่างนี้เราโหลดไลบรารีโหลด 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
นโยบายความปลอดภัยป้องกันไม่ให้สิ่งนี้ทำงานอย่างน้อยในหน้าแท็บใหม่ของ Chrome เมื่อเป็นรุ่น 66 ไม่ได้รับการรับรอง EvalError ปฏิเสธที่จะประเมินสตริงเป็น JavaScript เนื่องจาก 'unsafe-eval' ไม่ได้รับอนุญาตให้ใช้สคริปต์ต่อไปนี้ คำสั่งนโยบายความปลอดภัยของเนื้อหา: "script-src 'เข้มงวดแบบไดนามิก' ...
Tatsh

@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

หากใครก็ตามไม่สามารถโหลดได้เพราะสคริปต์ของ HES ละเมิดนโยบายความปลอดภัยของเนื้อหา "หรือ" เพราะไม่ปลอดภัย - ไม่ได้รับอนุญาต "ฉันจะแนะนำให้ใช้โมดูลฉีดขนาดเล็กของฉันในฐานะเครื่องมือตัวอย่างเครื่องมือ จากนั้นคุณจะสามารถโหลดดังนี้:

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 จากคอนโซลและหลีกเลี่ยงนโยบายสคริปต์-rr
  2. มันใช้ตัวเลือกแบบซิงโครนัสของ xhr ซึ่งช่วยให้คุณสามารถอยู่ในบริบทของคอนโซล / ตัวอย่างดังนั้นคุณจะได้รับอนุญาตให้ Eval สคริปต์และไม่ได้รับการปฏิบัติในลักษณะที่ไม่ปลอดภัย

มันใช้งานไม่ได้สำหรับฉัน: ปฏิเสธที่จะโหลดสคริปต์ ' 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และเพิ่ม UserScript ต่อไปนี้ด้วยหนึ่ง (หรือมากกว่า) @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;

})();

เมื่อใดก็ตามที่คุณต้องการห้องสมุดบนคอนโซลหรือในส่วนย่อยจะเปิดใช้งาน UserScript และรีเฟรชเฉพาะ

การแก้ปัญหามลพิษ namespace ป้องกัน คุณสามารถใช้เนมสเปซที่กำหนดเองเพื่อหลีกเลี่ยงการเขียนทับตัวแปรโกลบอลที่มีอยู่ในหน้าโดยไม่ได้ตั้งใจ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.