Учебник по JS

ГЛАВНАЯ JS Введение JS Куда Вывод JS Заявления JS JS-синтаксис JS-комментарии JS-переменные JS Пусть Константа JS JS-операторы JS-арифметика Назначение JS JS-типы данных JS-функции JS-объекты JS-события JS-строки Строковые методы JS Поиск строки JS Шаблоны строк JS JS-номера Методы номеров JS JS-массивы Методы массива JS Сортировка массива JS Итерация массива JS Константа массива JS JS-даты Форматы даты JS Методы получения даты JS Методы установки даты JS JS-математика JS Случайный JS Булевы значения Сравнение JS JS-условия JS-переключатель JS цикл для Цикл JS для входа Цикл JS для Цикл JS во время Перерыв JS JS-итерации JS-наборы JS-карты JS Typeof Преобразование типов JS JS побитовый JS регулярное выражение JS-ошибки Область JS JS-подъем Строгий режим JS JS это ключевое слово Функция стрелки JS JS-классы JS JSON JS-отладка Руководство по стилю JS Лучшие практики JS JS-ошибки JS-производительность Зарезервированные слова JS

JS-версии

JS-версии JS 2009 (ES5) JS 2015 (ES6) JS 2016 JS 2017 JS 2018 JS IE/пограничный История JS

JS-объекты

Определения объектов Свойства объекта Методы объекта Отображение объекта Средства доступа к объектам Конструкторы объектов Прототипы объектов Итерации объектов Наборы объектов Карты объектов Ссылка на объект

JS-функции

Определения функций Параметры функции Вызов функции Вызов функции Функция Применить Закрытие функций

JS-классы

Введение в класс Наследование классов Статический класс

JS асинхронный

Обратные вызовы JS JS асинхронный JS-обещания JS асинхронный/ожидание

JS HTML DOM

Дом Введение DOM-методы Документ DOM DOM-элементы DOM HTML DOM-формы ДОМ CSS DOM-анимации События ДОМ Слушатель событий DOM DOM-навигация DOM-узлы Коллекции DOM Списки узлов DOM

Спецификация браузера JS

JS-окно JS-экран Местоположение JS История JS JS-навигатор Всплывающее оповещение JS JS Тайминг JS-куки

JS-веб-API

Введение в веб-API API веб-форм API истории веб-поиска API веб-хранилища API веб-работника API веб-выборки API веб-геолокации

JS АЯКС

Введение в АЯКС AJAX XMLHttp АЯКС-запрос AJAX-ответ XML-файл AJAX АЯКС PHP АЯКС АСП База данных AJAX AJAX-приложения Примеры AJAX

JS JSON

Введение в JSON Синтаксис JSON JSON против XML Типы данных JSON Анализ JSON Строковая JSON JSON-объекты JSON-массивы JSON-сервер JSON PHP JSON HTML JSON JSONP

JS против JQuery

Селекторы jQuery JQuery HTML jQuery CSS JQuery DOM

JS-графика

JS-графика JS Холст JS сюжет JS Chart.js JS Google Диаграмма JS D3.js

JS-примеры

JS-примеры JS HTML DOM JS HTML-ввод HTML-объекты JS HTML-события JS JS-браузер JS-редактор JS-упражнения JS-викторина JS-сертификат

JS-ссылки

Объекты JavaScript HTML DOM-объекты


JSONP


JSONP — это метод отправки данных JSON, не беспокоясь о междоменных проблемах.

JSONP не использует XMLHttpRequestобъект.

Вместо этого JSONP использует этот <script>тег.


Введение в JSONP

JSONP означает JSON с дополнением.

Запрос файла из другого домена может вызвать проблемы из-за междоменной политики.

Запрос внешнего скрипта из другого домена не имеет этой проблемы.

JSONP использует это преимущество и запрашивает файлы, используя тег скрипта вместо XMLHttpRequestобъекта.

<script src="demo_jsonp.php">

Файл сервера

Файл на сервере оборачивает результат внутри вызова функции:

Пример

<?php
$myJSON = '{ "name":"John", "age":30, "city":"New York" }';

echo "myFunc(".$myJSON.");";
?>

Результат возвращает вызов функции с именем «myFunc» с данными JSON в качестве параметра.

Убедитесь, что функция существует на клиенте.

Функция JavaScript

Функция с именем «myFunc» находится на клиенте и готова обрабатывать данные JSON:

Пример

function myFunc(myObj) {
  document.getElementById("demo").innerHTML = myObj.name;
}


Создание тега динамического скрипта

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

Тег script следует создавать только при необходимости:

Пример

Создайте и вставьте тег <script> при нажатии кнопки:

function clickButton() {
  let s = document.createElement("script");
  s.src = "demo_jsonp.php";
  document.body.appendChild(s);
}

Динамический результат JSONP

Приведенные выше примеры все еще очень статичны.

Сделайте пример динамическим, отправив JSON в php-файл, и пусть php-файл возвращает объект JSON на основе полученной информации.

PHP-файл

<?php
header("Content-Type: application/json; charset=UTF-8");
$obj = json_decode($_GET["x"], false);

$conn = new mysqli("myServer", "myUser", "myPassword", "Northwind");
$result = $conn->query("SELECT name FROM ".$obj->$table." LIMIT ".$obj->$limit);
$outp = array();
$outp = $result->fetch_all(MYSQLI_ASSOC);

echo "myFunc(".json_encode($outp).")";
?>

Объяснение файла PHP:

  • Преобразуйте запрос в объект, используя функцию PHP json_decode() .
  • Получите доступ к базе данных и заполните массив запрошенными данными.
  • Добавьте массив к объекту.
  • Преобразуйте массив в JSON с помощью функции json_encode() .
  • Оберните "myFunc()" вокруг возвращаемого объекта.

Пример JavaScript

Функция «myFunc» будет вызываться из файла php:

const obj = { table: "products", limit: 10 };
let s = document.createElement("script");
s.src = "jsonp_demo_db.php?x=" + JSON.stringify(obj);
document.body.appendChild(s);

function myFunc(myObj) {
  let txt = "";
  for (let x in myObj) {
    txt += myObj[x].name + "<br>";
  }
  document.getElementById("demo").innerHTML = txt;
}

Функция обратного вызова

Когда у вас нет контроля над файлом сервера, как заставить файл сервера вызывать правильную функцию?

Иногда файл сервера предлагает функцию обратного вызова в качестве параметра:

Пример

Файл php будет вызывать функцию, которую вы передаете в качестве параметра обратного вызова:

let s = document.createElement("script");
s.src = "jsonp_demo_db.php?callback=myDisplayFunction";
document.body.appendChild(s);