как получить содержимое файла JavaScript и проанализировать его, чтобы использовать его переменные - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь получить этот файл javascript

https://eloquentjavascript.net/code/journal.js

с помощью собственной команды извлечения, например

fetch('https://eloquentjavascript.net/code/journal.js').then(v => {
  //do something here
})

Если вышеуказанный файл journal.js объявляетпеременная внутри него - как я могу использовать эту переменную в моей текущей области.

Если я console.log (v) - тогда нет доступа к переменной - поскольку chrome показывает:

enter image description here

Есть ли способ извлечь файл javascript (как текст), а затем проанализировать его, чтобы мы могли использовать объекты и метод импортированного файла в моей текущей области ??

Содержимое этого файла объявляет переменную, такую ​​как:

var JOURNAL = [{"events":["carrot","exercise","weekend"],"squirrel":false},{"events":["bread","pudding","brushed teeth","weekend","touched tree"],"squirrel":false}]

Ответы [ 2 ]

1 голос
/ 14 марта 2019

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

// The script will try to access global in your current environnement
// So we define it and add it to our scope
let wrapped = window.global = {};

// Add the script to the page
$.getScript("https://eloquentjavascript.net/code/journal.js", function(){
  // wrapped now contains the wanted data !
  document.write(JSON.stringify(wrapped));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

Альтернатива без jQuery:

function getScript(source, callback) {
    var script = document.createElement('script');
    var prior = document.getElementsByTagName('script')[0];
    script.async = 1;

    script.onload = script.onreadystatechange = function( _, isAbort ) {
        if(isAbort || !script.readyState || /loaded|complete/.test(script.readyState) ) {
            script.onload = script.onreadystatechange = null;
            script = undefined;

            if(!isAbort) { if(callback) callback(); }
        }
    };

    script.src = source;
    prior.parentNode.insertBefore(script, prior);
}
0 голосов
/ 14 марта 2019

Использование eval :

fetch('https://eloquentjavascript.net/code/journal.js').then(v => {
  v.text().then(txt => {
    eval(txt)
    console.log(JOURNAL)
  })
})
...