Làm cách nào để bao gồm tệp JavaScript hoặc thư viện trong bảng điều khiển Chrome?


221

Có cách nào đơn giản hơn (có lẽ là bản địa?) Để đưa tệp tập lệnh bên ngoài vào trình duyệt Google Chrome không?

Hiện tại tôi đang làm như thế này:

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

6
Bạn có nghĩa là bạn muốn một giải pháp nhanh chóng để bao gồm một tệp trên một trang web ngẫu nhiên nơi bạn đã mở Công cụ dành cho nhà phát triển?
Christian Tellnes

7
Tôi đã tạo một tiện ích bổ sung để thực hiện việc này: tải xuống từ cửa hàng google
w00d

2
bản sao có thể tải
Fireorms

Tôi sử dụng điều này để tải loại trực tiếp trong console document.write ("<script src = ' cdnjs.cloudflare.com/ajax/libs/knockout/3.5.0/ .)
Deepak Vishwakarma

Thật không may, không có cách nào để tải tệp javascript cục bộ vào bảng điều khiển, Chrome sẽ không cho phép các tệp cục bộ được sử dụng.
Shaya

Câu trả lời:


243

appendChild() là một cách bản địa hơn:

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

15
Để mở rộng câu trả lời của Harman, tôi đã bọc nó xung quanh một hàm JS và sử dụng nó như sau ... var _loadScript = function (path) {var script = document.createEuity ('script'); script.type = 'văn bản / javascript'; script.src = đường dẫn; document.head.appendChild (script); } _loadScript (' documentcloud.github.com/underscore/underscore-min.js' ); _loadScript (' backbonejs.org/backbone-min.js' );
Ajay Bhosale

Tôi đã nhận:TypeError: Property 'appendChild' of object #<HTMLHeadElement> is not a function
Muhammad Hewedy

1
Ajay, cảm ơn, nhưng bạn có một vài lỗi cú pháp. sao chép / dán văn bản dưới đây, để có dấu gạch dưới trong bảng điều khiển. Hoặc thay thế cho lib var _loadScript = function (path) {var script = document.createEuity ('script') khác; script.type = 'văn bản / javascript'; script.src = đường dẫn; document.head.appendChild (script); }; _loadScript (' underscorejs.org/underscore-min.js' );
TPAKTOPA

Cảm ơn! Tôi đã sử dụng script.innerHTML = javascript_code</ code> để tiêm mã javascript trực tiếp
Jonathan_Ng

91

Bạn có sử dụng một số khung AJAX không? Sử dụng jQuery nó sẽ là:

$.getScript('script.js');

Nếu bạn không sử dụng bất kỳ khuôn khổ nào thì hãy xem câu trả lời của Harmen.

(Có thể không đáng để sử dụng jQuery chỉ để làm điều đơn giản này ( hoặc có thể là vậy ) nhưng nếu bạn đã tải nó rồi thì bạn cũng có thể sử dụng nó. Tôi đã thấy các trang web đã tải jQuery, ví dụ như với Bootstrap nhưng vẫn sử dụng API DOM trực tiếp theo cách không phải lúc nào cũng có thể mang theo được, thay vì sử dụng jQuery đã được tải cho điều đó và nhiều người không biết thực tế là thậm chí getElementById()không hoạt động ổn định trên tất cả các trình duyệt - xem chi tiết câu trả lời này . )

CẬP NHẬT:

Đã nhiều năm kể từ khi tôi viết câu trả lời này và tôi nghĩ rằng đáng để chỉ ra ở đây rằng ngày nay bạn có thể sử dụng:

để tải động các tập lệnh. Những người có thể có liên quan đến những người đọc câu hỏi này.

Xem thêm: Cuộc nói chuyện trôi chảy năm 2014 của Guy Bedford: Quy trình làm việc thực tế cho các Mô-đun ES6 .


Thư mục nào nó sẽ tải tập lệnh từ?
Qwerty

4
Nếu bạn sử dụng nó như thế $.getScript('script.js');hoặc $.getScript('../scripts/script.js');sau đó nó liên quan đến tài liệu nhưng nó cũng có thể tải các url tuyệt đối, vd. $.getScript('https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.6.0/underscore.js');
rsp

nếu sử dụng jquery, thì bạn có thể tạo bookmarklet để cài đặt jquery trên trang, superuser.com/questions/1460015/iêu
barlop 27/07/19

38

Trong các trình duyệt hiện đại, bạn có thể sử dụng tìm nạp để tải xuống tài nguyên ( tài liệu Mozilla ) và sau đó eval để thực thi nó.

Ví dụ để tải xuống Angular1, bạn cần gõ:

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 mới nhất không cho phép sử dụng eval, với thông báo sau: 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 Tôi đã kiểm tra điều này và đoạn trích vẫn hoạt động trong Chrome Canary (64.0.3241.0).
Maciej Bukowski

2
Tôi nghĩ vấn đề của Vassilis là do có chính sách bảo mật nội dung trên ứng dụng mà anh ta đang sử dụng. Chrome cũng hoạt động với tôi.
Solomons_Ecclesiastes

1
@Vassilis sử dụng câu trả lời của tôi dưới đây ( stackoverflow.com/a/57814219/6553339 ) để tránh lỗi này
shmulik Friedman

16

Trong chrome, tùy chọn tốt nhất của bạn có thể là tab Snippets bên dưới Nguồn trong Công cụ dành cho nhà phát triển.

Nó sẽ cho phép bạn viết và chạy mã, ví dụ, trong một trang about: blank.

Thêm thông tin tại đây: https://developers.google.com/web/tools/chrome-devtools/debug/snippets/?hl=vi


6
Trong khi điều này về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
Menul Hassan

2
Tôi nghĩ rằng hai dòng đầu tiên của tôi là phần thiết yếu của câu trả lời. Họ mô tả chính xác cách truy cập Snippets trong Chrome. Sau đó, tôi bổ sung với các tài liệu Google.
atirado

Vâng cá nhân, tôi nghĩ rằng đây là câu trả lời tốt nhất, vì nó cũng cho thấy các nhà phát triển và cách dễ dàng để lưu và chạy bất kỳ javascript nào trên trang hiện tại ... thật tuyệt!
Brad park

16

Theo dõi câu trả lời của @ maciej-bukowski ở trên ^^ ^ , trong các trình duyệt hiện đại tính đến thời điểm hiện tại (mùa xuân 2017) hỗ trợ async / await bạn có thể tải như sau. Trong ví dụ này, chúng tôi tải thư viện html2canvas tải:

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

Nếu bạn chạy đoạn mã và sau đó mở bảng điều khiển của trình duyệt, bạn sẽ thấy hàm html2canvas () hiện được xác định.


2
Chính sách bảo mật ngăn điều này hoạt động, ít nhất là trên trang tab mới của Chrome kể từ phiên bản 66. Uncaught (trong lời hứa) EvalError: Từ chối đánh giá một chuỗi là JavaScript vì 'không an toàn' không phải là nguồn kịch bản được phép trong phần sau Chỉ thị chính sách bảo mật nội dung: "script-
src'rict

@Tatsh sử dụng câu trả lời của tôi để tránh lỗi của bạn ( 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);

4

Nếu bất cứ ai, không tải được vì tập lệnh ngần ngại vi phạm "Chính sách bảo mật nội dung" hoặc "vì không an toàn" không được phép ", tôi sẽ tư vấn sử dụng trình tiêm mô-đun khá nhỏ của tôi làm đoạn trích công cụ dev, sau đó bạn sẽ có thể tải như thế này:

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>

giải pháp này hoạt động vì:

  1. Nó tải thư viện trong xhr - cho phép CORS từ bàn điều khiển và tránh chính sách script-src.
  2. Nó sử dụng tùy chọn đồng bộ của xhr cho phép bạn ở trong bối cảnh của bàn điều khiển / đoạn trích, vì vậy bạn sẽ có quyền để từ chối tập lệnh và không bị coi là không an toàn.

Nó không hoạt động đối với tôi: Từ chối tải tập lệnh ' raw.githack.com/shmuelf/PowerJS/master/src/ trộm ' vì nó vi phạm chỉ thị Chính sách bảo mật nội dung sau: "script-src ...
ThomasRones

1

Tôi sử dụng điều này để tải ko đối tượng loại trực tiếp trong giao diện điều khiển

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

hoặc lưu trữ tại địa phương

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

0

Cài đặt tampermonkey và thêm UserScript sau bằng một (hoặc nhiều hơn) @matchvới url trang cụ thể (hoặc khớp với tất cả các trang https://*:) ví dụ:

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

})();

Bất cứ khi nào bạn cần thư viện trên bảng điều khiển hoặc trên đoạn trích, hãy bật UserScript cụ thể và làm mới.

Giải pháp này ngăn ngừa ô nhiễm không gian tên . Bạn có thể sử dụng các không gian tên tùy chỉnh để tránh ghi đè ngẫu nhiên các biến toàn cục hiện có trên trang.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.