Кубик Яваскрипт - запись данных в переменную БАС



  • Как реализовать, подскажите? Обычным образом как в блоке "Выполнить код" - не работает.

    [[THE_NAME]] = 'test'



  • @centerdevs said in Кубик Яваскрипт - запись данных в переменную БАС:

    Как реализовать, подскажите? Обычным образом как в блоке "Выполнить код" - не работает.

    [[THE_NAME]] = 'test'

    Должно работать, что у вас за js код?



  • @Fox

    let open = XMLHttpRequest.prototype.open; 
    
    // Overwrite the native method
    XMLHttpRequest.prototype.open = function() {
        // Assign an event listener
        this.addEventListener("load", function(){
            
            document.getElementById("demo3").innerHTML = 'some value';
    
            [[ANAME]] = 'some value';
            
        }, false);
        // Call the stored reference to the native method
        open.apply(this, arguments);
    };
    

    В итоге ANAME равен null. Естественно само событие я вызываю в браузере совершая ajax запрос, и убеждаюсь что всё прошло успешно по innerHTML



  • @centerdevs said in Кубик Яваскрипт - запись данных в переменную БАС:

    @Fox

    let open = XMLHttpRequest.prototype.open; 
    
    // Overwrite the native method
    XMLHttpRequest.prototype.open = function() {
        // Assign an event listener
        this.addEventListener("load", function(){
            
            document.getElementById("demo3").innerHTML = 'some value';
    
            [[ANAME]] = 'some value';
            
        }, false);
        // Call the stored reference to the native method
        open.apply(this, arguments);
    };
    

    В итоге ANAME равен null. Естественно само событие я вызываю в браузере совершая ajax запрос, и убеждаюсь что всё прошло успешно по innerHTML

    Добавьте ожидание через await



  • @Fox

    SyntaxError: await is only valid in async function
    

    А подскажите куда именно async распихать надо чтобы заработало? Добавляю в начале функций - не помогает.



  • @centerdevs said in Кубик Яваскрипт - запись данных в переменную БАС:

    @Fox

    SyntaxError: await is only valid in async function
    

    А подскажите куда именно async распихать надо чтобы заработало? Добавляю в начале функций - не помогает.

    Так, погодите, вы переопределяете метод open, вешаете обработчик и вызываете функцию. Зачем вы в обработчик помещаете этот код?:

    document.getElementById("demo3").innerHTML = 'some value';
    
    [[ANAME]] = 'some value';
    

    Судя по всему вы используете скрипт для прослушивания событий AJAX на глобальном уровне
    https://www.tutorialclues.com/topics/javascript/examples/listening-to-ajax-events-at-a-global-level

    // Store a reference to the native method
    let open = XMLHttpRequest.prototype.open; 
    
    // Overwrite the native method
    XMLHttpRequest.prototype.open = function() {
        // Assign an event listener
        this.addEventListener("load", event => console.log(XHR), false);
        // Call the stored reference to the native method
        open.apply(this, arguments);
    };
    

    Но к чему тогда изменять значение элемента по id? Какой результат вы хотите достичь?



  • @Fox Это просто для себя для отладки) Чтобы явно понимать когда событие отработало, так как запись в переменную мне пока что не далась.

    По самому скрипту и его назначению, всё правильно поняли. Я хочу ловить все события ajax в документе, и по окончанию загрузки записывать в переменные инфу.



  • @centerdevs said in Кубик Яваскрипт - запись данных в переменную БАС:

    @Fox Это просто для себя для отладки) Чтобы явно понимать когда событие отработало, так как запись в переменную мне пока что не далась.

    По самому скрипту и его назначению, всё правильно поняли. Я хочу ловить все события ajax в документе, и по окончанию загрузки записывать в переменные инфу.

    Эмм.. Вы же понимаете, что такое "обработчик событий"? Смотрите, ваш код при каждом ajax запросе регистрирует обработчик события "load", это событие происходит, когда ресурс завершил загрузку. При этом вы устанавливаете статичный способ проверки, то есть если, скажем сайт отправит 10 ajax запросов, то как только вернётся хотя бы один, то код

    document.getElementById("demo3").innerHTML = 'some value';
    

    сработает и вы уведите изменение. При этом остальные запросы могут висеть или завершится ошибкой.
    Я бы посоветовал использовать счётчик, сколько отправлено и сколько завершено запросов.


    Судя по вашим сообщениям в других темах, я так понимаю вы хотите создать универсальный инструмент ожидания загрузки страницы? В таком случае есть несколько моментов.

    Во первых почему именно ajax? Страница может загружать компоненты разными способами, ваш код не сработает если, например, загрузку компонентов прописали тегами и коде в html

    <script type="тип" src="URL"></script>
    

    также ajax запросы могут быть созданы без использования метода XMLHttpRequest, например через fetch

    fetch(
       'http://domain/service',
       { method: 'GET' }
     )
     .then( response => response.json() )
     .then( json => console.log(json) )
     .catch( error => console.error('error:', error) );
    


  • @Fox Всё верно на счёт задачи ( универсальный инструмент ожидания загрузки страницы ), а на счёт множества запросов... именно счётчик и планировал делать, а кидал в том виде просто как пример) На данный момент вижу более менее стабильную работу, за исключением ajax. А теперь оказалось что и fetch.

    Но уже глягул, можно так же "вклиниться" во все fetch запросы с помощью такого

    var oldFetch = fetch;  // must be on the global scope
    fetch = function(url, options) {
        var promise = oldFetch(url, options);
        // Do something with the promise
        return promise;
    }
    

    Вопрос с тем как прописывать в БАС переменные из этого кода еще не решил



  • @centerdevs said in Кубик Яваскрипт - запись данных в переменную БАС:

    @Fox Всё верно на счёт задачи ( универсальный инструмент ожидания загрузки страницы ), а на счёт множества запросов... именно счётчик и планировал делать, а кидал в том виде просто как пример) На данный момент вижу более менее стабильную работу, за исключением ajax. А теперь оказалось что и fetch.

    Но уже глягул, можно так же "вклиниться" во все fetch запросы с помощью такого

    var oldFetch = fetch;  // must be on the global scope
    fetch = function(url, options) {
        var promise = oldFetch(url, options);
        // Do something with the promise
        return promise;
    }
    

    Опять же, вы умеете работать с промисами? Плюс учтите, что вам это всё нужно использовать до загрузки страницы через действие "Выполнять при каждой загрузке страницы в браузере".

    Только всё это один фиг не поможет, данные можно загружать и через вебсокеты, или, например фреймы

    <iframe src="URL">...</iframe>
    

    Тут важно понимать конечную цель, что вы хотите сделать в итоге (в идеале)? Для чего?

    Определение "универсальный инструмент ожидания загрузки страницы" слишком расплывчатое, например при переходе на сайт видео-хостинга, нужно ли ждать завершения загрузки всего ролика до конца? Далеко не все мультимедиа компоненты являются обязательными для работы с сайтом.
    Или сайты с кучей рекламы, вы наверняка такие встречали, которые крутят рекламу по кругу, они ни когда не загрузятся до конца.



  • @centerdevs , может зарелизишь, как лайфхак. Возможно, кто-то ещё от себя добавит что-то в код.



  • @Fox С промисами умею работать совсем не много, но есть гугл и не должно быть проблемой. Конечная цель - получить более адекватный и быстрый ожидатель загрузки) Он не будет панацеей во всех случаях, но как минимум 99% моих требований закроет + будет иметь доп настройки чтобы можно было его немного подправлять в особых ситуациях.

    "Выполнять при каждой загрузке страницы в браузере" - естественно! :) Всё уже проверил, событие ловит)

    На счёт видео, скриптов и прочего - это уже частные случаи которые будут обрабатываться в частном порядке или настройками функции ожидателя.



  • @centerdevs said in Кубик Яваскрипт - запись данных в переменную БАС:

    @Fox С промисами умею работать совсем не много, но есть гугл и не должно быть проблемой. Конечная цель - получить более адекватный и быстрый ожидатель загрузки) Он не будет панацеей во всех случаях, но как минимум 99% моих требований закроет + будет иметь доп настройки чтобы можно было его немного подправлять в особых ситуациях.

    "Выполнять при каждой загрузке страницы в браузере" - естественно! :) Всё уже проверил, событие ловит)

    Все эти телодвижения уйдут лесом при простом востановлении объекта window

    var i = document.createElement('iframe');
    i.style.display = 'none';
    document.body.appendChild(i);
    window = i.contentWindow;
    i.parentNode.removeChild(i);
    


  • Придумал костыль на этот случай. Может кому пригодится.

    Использую обьект window.

    Например window.my_var_name = "blabla"

    А далее в другом месте проекта с помощью кубика яваскрипт привязываю значение из window.my_var_name в переменную баса.


Log in to reply