Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171

Простой ajax запрос на чистом XMLHttpRequest

19.09.2021, 23:55. Показов 1518. Ответов 1

Студворк — интернет-сервис помощи студентам
Приветствую Знатоки! Попробовал написать простой ajax запрос без использования промисов, fetch и jquery, скрипт работает но вот на глобальную переменную count глаз дергатся начинает , как можно это все поправить? Для наглядности как работает скрипт welcome https://codepen.io/sirius100/pen/ExXEdwK

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// запрос на сервер
 
const xhr = new XMLHttpRequest();
 
xhr.open(
  'get',
  'https://jsonplaceholder.typicode.com/photos/',
  true, );
xhr.responseType = 'json';
xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
xhr.addEventListener( 'load',  () => getData( xhr.response )  );
xhr.addEventListener( 'abort', () => console.log( 'progress onabort' ));
xhr.addEventListener( 'error', () => console.log( 'progress onerror' ));
xhr.onprogress = function(event) { // запускается периодически
  // event.loaded - количество загруженных байт
  // event.lengthComputable = равно true, если сервер присылает заголовок Content-Length
  // event.total - количество байт всего (только если lengthComputable равно true)
  console.log(`Загружено ${event.loaded} из ${event.total}`);
 
  if (xhr.status === 200 ) {
    // count = new Set(xhr.response).size;
    // console.log( 'count = ' ,new Set(xhr.response).size );
    // console.log( xhr.response);
  } else {
    console.log('err', xhr.responseText)
  }
}
xhr.send();
 
var count =  undefined; // эта переменная глобальная и это мне не нравится !
 
function getData( data ) {
  return count = data['length'];// узнаю общее количество файлов (например фото) для счетчика запросов ajax
}
 
function nextRequest(){
  count;
  const wrapper = document.querySelector( '.wrapper' )
 
  return function () {
    let div_wrapper = document.createElement( 'div' )
    div_wrapper.classList.add( 'wrapper_ajax' );
 
    let panel = document.createElement( 'p' );
    panel.innerText = 'Описание фото'
 
    let request_img = document.createElement( 'div' );
    request_img.classList.add( 'request_img' );
    request_img.style.background = `url(${xhr.response[count-1].url})`; // url файла для подгрузки ajax-ом
    request_img.style.backgroundSize = "100% 100%";
    request_img.style.backgroundRepeat = "no-repeat";
 
    div_wrapper.appendChild( panel );
    div_wrapper.appendChild( request_img )
    wrapper.appendChild( div_wrapper )
 
    count--; // уменьшаю счетчик
  }
}
 
const newRequest = nextRequest();
 
const btn_ajax_request = document.querySelector( '.ajax' )
btn_ajax_request.addEventListener( 'click', () => newRequest() );
Добавлено через 46 минут
Всем спасибо Знатоки я сам оперативно разобрался! коллбеки затащили ! код с изменениями ниже.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/ запрос на сервер
 
const xhr = new XMLHttpRequest();
 
xhr.open(
  'get',
  'https://jsonplaceholder.typicode.com/photos/',
  true, );
xhr.responseType = 'json';
xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
xhr.addEventListener( 'load',  () => getData( xhr.response, nextRequest )  );
xhr.addEventListener( 'abort', () => console.log( 'progress onabort' ));
xhr.addEventListener( 'error', () => console.log( 'progress onerror' ));
xhr.onprogress = function(event) { // запускается периодически
  // event.loaded - количество загруженных байт
  // event.lengthComputable = равно true, если сервер присылает заголовок Content-Length
  // event.total - количество байт всего (только если lengthComputable равно true)
  console.log(`Загружено ${event.loaded} из ${event.total}`);
 
  if (xhr.status === 200 ) {
    // count = new Set(xhr.response).size;
    // console.log( 'count = ' ,new Set(xhr.response).size );
    // console.log( xhr.response);
  } else {
    console.log('err', xhr.responseText)
  }
}
xhr.send();
 
 
function getData( data, f ) {
  let count = data['length'];// узнаю общее количество файлов (например фото) для счетчика запросов ajax
  console.log('count = ', count)
  return f(count);
}
 
function nextRequest(count){
  console.log('count from nextRequest = ', count)
  const btn_ajax_request = document.querySelector( '.ajax' )
  const wrapper = document.querySelector( '.wrapper' )
 
  return btn_ajax_request.addEventListener( 'click', () => {
    console.log('count from addEventListener = ', count)
    let div_wrapper = document.createElement( 'div' )
    div_wrapper.classList.add( 'wrapper_ajax' );
 
    let panel = document.createElement( 'p' );
    panel.innerText = 'Описание фото'
 
    let request_img = document.createElement( 'div' );
    request_img.classList.add( 'request_img' );
    request_img.style.background = `url( ${xhr.response[count-1].url} )`; // url файла для подгрузки ajax-ом
    request_img.style.backgroundSize = "100% 100%";
    request_img.style.backgroundRepeat = "no-repeat";
 
    div_wrapper.appendChild( panel );
    div_wrapper.appendChild( request_img )
    wrapper.appendChild( div_wrapper )
 
    count--; // уменьшаю счетчик
  });
}
2
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.09.2021, 23:55
Ответы с готовыми решениями:

Выполнить ajax запрос, гет, на чистом js
var oXmlHttp = createXMLHttp(); oXmlHttp.open('GET', '/ajax.php', true); oXmlHttp.setRequestHeader('Content-Type',...

Как локализовать: get-запрос через AJAX очищает страницу, и данные размещаются уже на чистом листе
EcmaScript 6, jQuery 3.1.0 Делаю фотоархив. Есть страничка, на ней какие-то заголовки, что-то есть. И по клике на плюсик появляется...

Простой ajax запрос
Добрый день всем, недавно начал изучать фреймворк yii2, и веб программирование в целом, и возникла небольшая проблема, я хочу после нажатия...

1
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
18.12.2021, 21:23  [ТС]
Привет Модератор! Пометьте эту тему решенной!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.12.2021, 21:23
Помогаю со студенческими работами здесь

Простой Ajax запрос
Здравствуйте! Суть задачи: У меня есть фон - это просто обычный цвет. Есть скрипт который добавляет к цвету шум. В танце...

Простой запрос через AJAX
Помогите сделать задачку. С AJAX вообще разобраться не получается( Технология AJAX. Объект XMLHttpRequest. С использованием Ajax написать...

не работает простой AJAX запрос
Помогите, очень нужно! Не работает простой Аякс запрос с учебника, уже все перепробовал. Использую его в шаблоне ВордПресс <div...

AJAX внутри AJAX на чистом JS
Вся эта красота(ниже) подгружает php файл. Как подгрузить, например, тоже самое из подгруженного файла? КАК? :wall: ...

Ajax (XMLHttpRequest) + SSL
как можно с помощю аякс отправлять зашифрованные SSL(Https) запросы на сервер и принимать от сервера ответы


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru