XMLHttpRequest прототипы JavaScript не работает - PullRequest
0 голосов
/ 02 октября 2018

Мы пытаемся включить наш веб-сайт с помощью функции w3-include-html на другом веб-сайте, после чего следуют некоторые xmlhttprequests для файлов * .js.

function loadJS(url,onDone,onError){
var xhr=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");
xhr.onreadystatechange=function(){
    if(xhr.readyState==4){
        if(xhr.status==200||xhr.status==0){
            setTimeout(function(){
                try{
                    eval(xhr.responseText);
                }catch(e){
                }
                onDone();
            }.bind(this),1);
        }else{
        }
    }
}.bind(this);
try{
    xhr.open("GET",url,true);
    xhr.send();
}catch(e){
}};

Это похоже на работу, только вызов функции из другого .js-файла останавливает выполнение.Вызов функции из консоли браузера вручную
Uncaught ReferenceError: splash не определен в: 1: 1
Это происходит только для функций, которые также являются прототипами.

Firstфайл .js:

var eless = function () {
this.$body = $('body');
var self = this;
window.dataLayer = window.dataLayer || [];

this.init();
this.loop();
console.log("before");
new splash();
console.log("after");

второй файл .js:

var splash = function() {
console.log('after after');
console.log(this.init);
this.init();
console.log("after after after");
};
splash.prototype = {
init: function () {
    var self = this;
[...]

1 Ответ

0 голосов
/ 02 октября 2018

eval работает в локальной области, поэтому ваш

eval(xhr.responseText);

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

Если вы хотите оценить код в глобальной области видимости, вы можете использовать "косвенный eval" трюк:

(0, eval)(xhr.responseText);

Но , я настоятельно рекомендую отступить и пересмотреть то, что вы делаете.Используя XHR для запроса кода сценария, вы eval отключаетесь.Вместо этого вы можете просто добавить элемент script на страницу.

...