Como incluir arquivo ou biblioteca JavaScript no console do Chrome?

221

Existe uma maneira mais simples (nativa, talvez?) De incluir um arquivo de script externo no navegador Google Chrome?

Atualmente estou fazendo assim:

document.head.innerHTML += '<script src="http://example.com/file.js"></script>';
technocake
fonte
6
Quer dizer que você deseja que uma solução rápida inclua um arquivo em uma página da web aleatória em que você abriu as Ferramentas do desenvolvedor?
Christian Tellnes
7
Eu fiz um complemento para fazer isso: baixar da google store
w00d 19/10/12
2
possível duplicata de carga javascript via Firebug consola
gak
Eu uso isso para carregar nocaute no console document.write ("<script src = ' cdnjs.cloudflare.com/ajax/libs/knockout/3.5.0/… )
Deepak Vishwakarma
Infelizmente, não há como carregar um arquivo javascript local no console, o Chrome não permitirá que arquivos locais sejam usados.
Shayan

Respostas:

243

appendChild() é uma maneira mais nativa:

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'script.js';
document.head.appendChild(script);
Harmen
fonte
15
Para estender a resposta de Harman, envolvi-a em uma função JS e usei-a da seguinte forma ... var _loadScript = function (path) {var script = document.createElement ('script'); script.type = 'text / javascript'; script.src = caminho; document.head.appendChild (script); } _loadScript (' documentcloud.github.com/underscore/underscore-min.js' ); _loadScript (' backbonejs.org/backbone-min.js' );
precisa saber é o seguinte
Eu tenho:TypeError: Property 'appendChild' of object #<HTMLHeadElement> is not a function
Muhammad Hewedy 31/08
1
Ajay, obrigado, mas você tem alguns erros de sintaxe. copie / cole o texto abaixo para ter sublinhado no console. Ou substitua por outra lib var _loadScript = function (caminho) {var script = document.createElement ('script'); script.type = 'text / javascript'; script.src = caminho; document.head.appendChild (script); }; _loadScript (' underscorejs.org/underscore-min.js' );
TPAKTOPA
Obrigado! Eu usei script.innerHTML = javascript_code</code> para injetar código javascript direto
Jonathan_Ng
91

Você usa alguma estrutura AJAX? Usando jQuery, seria:

$.getScript('script.js');

Se você não estiver usando nenhuma estrutura, veja a resposta de Harmen.

(Talvez não valha a pena usar o jQuery apenas para fazer uma coisa simples ( ou talvez seja ), mas se você já o carregou, também pode usá-lo. Vi sites que têm o jQuery carregado, por exemplo, com o Bootstrap, mas ainda assim use a API DOM diretamente de uma maneira que nem sempre é portátil, em vez de usar o jQuery já carregado para isso, e muitas pessoas não sabem que nem sequer getElementById()funciona de maneira consistente em todos os navegadores - consulte esta resposta para obter detalhes. )

ATUALIZAR:

Faz anos desde que escrevi esta resposta e acho que vale a pena destacar aqui que hoje você pode usar:

carregar scripts dinamicamente. Isso pode ser relevante para as pessoas que estão lendo esta pergunta.

Veja também: A conversa fluente de 2014 de Guy Bedford: Fluxos de trabalho práticos para os módulos ES6 .

rsp
fonte
De qual pasta ele carregará o script?
Qwerty
4
Se você usá-lo como ele é $.getScript('script.js');ou $.getScript('../scripts/script.js');então relativo ao documento, mas também pode carregar URLs absolutos, por exemplo. $.getScript('https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.6.0/underscore.js');
Rsp
se estiver usando jQuery, então você poderia fazer um bookmarklet para instalar jquery na página, superuser.com/questions/1460015/...
barlop
38

Nos navegadores modernos, você pode usar a busca para baixar o recurso ( Mozilla docs ) e depois avaliar para executá-lo.

Por exemplo, para baixar o Angular1, você precisa digitar:

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
fonte
1
O Chrome mais recente não permite o uso de eval, com a seguinte mensagem: 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 11/11
2
@Vassilis Eu verifiquei isso e o snippet ainda funciona no Chrome Canary (64.0.3241.0).
Maciej Bukowski
2
Acho que o problema do Vassilis é porque existe uma política de segurança de conteúdo no aplicativo que ele está usando. O Chrome também funciona para mim.
Solomons_Ecclesiastes
1
@Vassilis usar minha resposta abaixo ( stackoverflow.com/a/57814219/6553339 ) para evitar esse erro
Shmulik Friedman
16

No chrome, sua melhor opção pode ser a guia Snippets em Origens nas Ferramentas do desenvolvedor.

Isso permitirá que você escreva e execute o código, por exemplo, em uma página em branco about:.

Mais informações aqui: https://developers.google.com/web/tools/chrome-devtools/debug/snippets/?hl=en

atirado
fonte
6
Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
Enamul Hassan 23/08/16
2
Eu pensei que minhas duas primeiras linhas eram a parte essencial da resposta. Eles descrevem exatamente como acessar os Snippets no Chrome. Então eu complementei com a documentação do Google.
Atirado
Sim, pessoalmente, acho que essa é a melhor resposta, pois também mostra os desenvolvedores e a maneira fácil de salvar e executar qualquer javascript na página atual ... legal!
Brad Parks
16

Como acompanhamento da resposta de @ maciej-bukowski acima ^^^ , nos navegadores modernos a partir de agora (primavera de 2017) que suportam async / wait, você pode carregar da seguinte maneira. Neste exemplo, carregamos a biblioteca 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);

Se você executar o snippet e abrir o console do navegador, deverá ver a função html2canvas () agora definida.

jbustamovej
fonte
2
A política de segurança impede que isso funcione, pelo menos na página da nova guia do Chrome, a partir da versão 66. EvalError não detectado: recusou-se a avaliar uma sequência como JavaScript porque 'unsafe-eval' não é uma fonte de script permitida a seguir Diretiva de política de segurança de conteúdo: "script-src 'strict-dynamic' ..."
Tatsh
@Tatsh usar a minha resposta para evitar o seu erro ( 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 啸
fonte
4

Se alguém falhar ao carregar porque o script hes viola o script-src "Política de segurança de conteúdo" ou "porque a segurança não é permitida", aconselharei o uso do meu injetor de módulo muito pequeno como um snippet de ferramentas de desenvolvimento, então você poderá carregar assim:

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>

esta solução funciona porque:

  1. Carrega a biblioteca no xhr - o que permite o CORS do console e evita a política script-src.
  2. Ele usa a opção síncrona do xhr, que permite que você permaneça no contexto do console / snippet, assim você terá a permissão para avaliar o script e não ser tratado como uma avaliação insegura.
shmulik friedman
fonte
Ele não funciona para mim: recusou-se a carregar o script ' raw.githack.com/shmuelf/PowerJS/master/src/… ' porque viola a seguinte diretiva de política de segurança de conteúdo: "script-src ...
ThomasRones
1

Eu uso isso para carregar o objeto nocaute ko no console

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

ou hospede localmente

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

Instale tampermonkey e adicione o seguinte UserScript a um (ou mais) @matchURL de página específico (ou a uma correspondência de todas as páginas :), https://*por exemplo:

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

})();

Sempre que você precisar da biblioteca no console ou em um snippet, ative o UserScript específico e atualize.

Esta solução evita a poluição do espaço para nome . Você pode usar espaços para nome personalizados para evitar a substituição acidental de variáveis ​​globais existentes na página.

Jannis Ioannou
fonte