Пользовательский ввод и загрузка контента в JavaScript
Чтение данных в JavaScript
Основной метод: fetch для чтения данных с сервера
Современный способ получения данных с удаленного сервера - использовать функцию fetch. Она возвращает Promise, который разрешается в объект Response. Данные можно прочитать в разных форматах: JSON, текст, Blob, ArrayBuffer.
async function fetchData(url) {
try {
const response = await fetch(url);
if (!response.ok) throw new Error('HTTP error ' + response.status);
const json = await response.json();
console.log(json);
} catch (err) {
console.error('Ошибка при загрузке:', err);
}
}
fetchData('https://jsonplaceholder.typicode.com/posts/1');Js read (чтение данных в javascript)
{
"userId": 1,
"id": 1,
"title": "...",
"body": "..."
}
Типичные проблемы:
- CORS - если сервер не разрешает кросс-доменные запросы, fetch блокируется. Решение: настроить серверные заголовки или использовать прокси.
- Ошибка сети - отсутствие интернета. Обрабатывается блоком catch.
- Неверный формат ответа - если response.json() не может распарсить JSON, выбрасывается исключение. Проверяйте Content-Type.
Как получить ввод пользователя с клавиатуры?
Функция prompt() отображает диалоговое окно с полем ввода. Возвращает строку или null при отмене.
const userInput = prompt('Введите ваше имя:');
if (userInput !== null) {
console.log('Привет, ' + userInput);
} else {
console.log('Ввод отменен');
}
Проблемы:
- prompt блокирует выполнение скрипта до ответа пользователя.
- Возвращает строку, даже при вводе чисел - требуется преобразование.
- Отсутствие возможности стилизации окна.
Как извлечь данные из HTML-формы?
Для чтения данных из полей формы используется свойство value или объект FormData.
<form id='myForm'>
<input type='text' name='username' id='username' />
<input type='email' name='email' id='email' />
<button type='submit'>Отправить</button>
</form>
<script>
document.getElementById('myForm').addEventListener('submit', function(e) {
e.preventDefault();
const username = document.getElementById('username').value;
const email = document.getElementById('email').value;
console.log(username, email);
});
</script>
Ошибки:
- Забыли вызвать preventDefault() - страница перезагружается.
- Обращение к элементу до его загрузки - помещайте скрипт в конце body или используйте DOMContentLoaded.
Как загрузить файл с компьютера пользователя?
Используется элемент <input type='file'> и объект FileReader для чтения содержимого.
<input type='file' id='fileInput' />
<script>
document.getElementById('fileInput').addEventListener('change', function(e) {
const file = e.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = function(event) {
console.log('Содержимое файла:', event.target.result);
};
reader.readAsText(file);
});
</script>
Проблемы:
- Большие файлы могут замедлить работу - используйте readAsArrayBuffer для бинарных данных.
- Необходимость проверки типа файла (file.type).
- FileReader работает асинхронно, обработка в onload.
Как прочитать файл в среде Node.js?
В Node.js для чтения файлов используется модуль fs. Асинхронная версия readFile не блокирует цикл событий.
const fs = require('fs');
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) {
console.error('Ошибка чтения файла:', err);
return;
}
console.log('Данные из файла:', data);
});
Данные из файла: содержимое файла...
Ошибки:
- Файл не найден - err.code === 'ENOENT'. Обрабатывается в колбэке.
- Кодировка не указана - возвращается Buffer. Явно задавайте 'utf8' или другую.
- Синхронная версия readFileSync блокирует процесс, не рекомендуется для больших файлов.
Как выполнить запрос к серверу без fetch?
XMLHttpRequest - классический способ AJAX. Используется реже, но может потребоваться для поддержки старых браузеров.
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true);
xhr.onload = function() {
if (xhr.status === 200) {
console.log(JSON.parse(xhr.responseText));
} else {
console.error('Ошибка:', xhr.status);
}
};
xhr.onerror = function() {
console.error('Сетевая ошибка');
};
xhr.send();
Недостатки:
- Громоздкий API, много колбэков.
- Отсутствие встроенной поддержки Promise.
- Требуется вручную устанавливать заголовки для JSON.
Потоковое чтение данных с сервера с отслеживанием прогресса
Для больших файлов удобно читать данные по кускам, используя свойство body у Response и ReadableStream.
async function streamFetch(url) {
const response = await fetch(url);
const reader = response.body.getReader();
const decoder = new TextDecoder();
let total = 0;
while (true) {
const { done, value } = await reader.read();
if (done) break;
total += value.length;
console.log('Получено байт:', total);
const chunk = decoder.decode(value, { stream: true });
// Обработка chunk
}
console.log('Загрузка завершена');
}
streamFetch('https://example.com/largefile.json');
Результат:
Получено байт: 1024 Получено байт: 2048 ... Загрузка завершена
Чтение изображения и создание превью
Используется FileReader.readAsDataURL для превращения файла в base64 строку, которую можно подставить в src тега img.
document.getElementById('fileInput').addEventListener('change', function(e) {
const file = e.target.files[0];
if (!file || !file.type.startsWith('image/')) return;
const reader = new FileReader();
reader.onload = function(event) {
const img = document.createElement('img');
img.src = event.target.result;
document.body.appendChild(img);
};
reader.readAsDataURL(file);
});
Результат:
На странице появляется изображение.
Построчное чтение файла в Node.js с использованием readline
Модуль readline позволяет обрабатывать файл построчно, экономя память.
const readline = require('readline');
const fs = require('fs');
const rl = readline.createInterface({
input: fs.createReadStream('largefile.txt'),
output: process.stdout,
terminal: false
});
rl.on('line', (line) => {
console.log('Строка:', line);
});
rl.on('close', () => {
console.log('Файл прочитан полностью');
});
Результат:
Строка: первая строка Строка: вторая строка ... Файл прочитан полностью
Чтение всех JSON файлов из директории в Node.js
Комбинируется fs.readdir и fs.readFile (асинхронно через Promise.all).
const fs = require('fs').promises;
const path = require('path');
async function readAllJSON(dirPath) {
try {
const files = await fs.readdir(dirPath);
const jsonFiles = files.filter(f => f.endsWith('.json'));
const contents = await Promise.all(
jsonFiles.map(async (file) => {
const filePath = path.join(dirPath, file);
const data = await fs.readFile(filePath, 'utf8');
return { filename: file, data: JSON.parse(data) };
})
);
console.log(contents);
} catch (err) {
console.error('Ошибка:', err);
}
}
readAllJSON('./data');
Результат:
[
{ filename: 'config.json', data: { ... } },
...
]