Загружать JSON во время выполнения, а не динамически через AJAX

Не думаю, что это можно сделать «чисто», но все равно спрошу.

У меня есть система, которой необходимо получить ресурс JSON с помощью вызова REST GET для инициализации. В настоящий момент система ожидает события onLoad и запускает запрос ajax для извлечения ресурса, что я не думаю, что это лучший способ сделать это, поскольку ресурс необходим во время выполнения.

Я бы хотел как-то загрузить ресурс во время выполнения внутри тега HTML, а затем оценить его содержимое. Но я работаю над API, который будет использоваться другими, поэтому я хотел бы достичь этого логичным и основанным на стандартах способом.

Так есть ли какой-нибудь ярлык, который соответствует всем требованиям? Тег, который можно разместить в заголовке документа, чтобы я мог читать и оценивать содержимое во время выполнения?

С уважением,

Крис

В настоящее время я смотрю на тег ссылки - <link type = "application / json" href = "my.json" /> и задаюсь вопросом, как я могу заставить это работать.

ChrisInCambo 28.12.2008 08:14
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
4 433
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Сам по себе JSON ничего не делает; вы не можете просто использовать <script> для его включения, потому что он создаст объект, который будет назначен ... никуда. Вам нужно будет изменить его - либо вставьте его в строку JS для синтаксического анализа, либо вставьте перед ним «var foo =».

Спасибо за ваш вклад, но я не могу этого сделать, изменение ресурса не вариант. Мне нужно найти способ справиться с JSON. Как я уже сказал, у меня есть ощущение, что мой текущий метод через AJAX - единственный чистый путь здесь.

ChrisInCambo 28.12.2008 08:23

Будет ли для вас проблемой отсутствие кэширования CDN (Akamai и т. д.)? Если нет, вы можете поместить тег скрипта на страницу, указать атрибут src на серверный скрипт, который возвращает контент с mime-типом javascript и содержит запрошенный вами JS-объект. Это было бы похоже на включение внешнего скрипта, только динамически сгенерированного.

Бывший:

В голове есть что-то вроде:

<script src = "/js/loadjs.php?id=123"></script>

И пусть loadjs.php вернет что-то вроде:

var MyApp.initData = { id: 123, setting1: "xyz" };

Обратной стороной является то, что вы не сможете кэшировать его через CDN. Я думаю, что кеширование браузера все равно будет работать, если вам нужно.

Как я сказал в комментарии к Ant P. У меня нет контроля над сервером, я должен получить доступ к этой веб-службе REST как есть. Он возвращает просто JSON (mime-type = application / json), а не JavaScript или JSON, присвоенный переменной.

ChrisInCambo 28.12.2008 10:37

Может, я не понимаю, но не могли бы вы просто:

<?php
$json_data = json_encode($your_data);
?>

<script>
var data = <?= $json_data ?>;
</script>
Ответ принят как подходящий

Я думал поместить его в iframe, но потом понял, что у вас проблема с типом содержимого application / json. Когда я тестировал FF, IE и Chrome пытались загрузить файл и спрашивали пользователя, где его хранить (Opera отображала файл)

Помещение его в ССЫЛКУ не поможет вам, поскольку браузер не будет пытаться получить документ (он выбирает только известные ресурсы, такие как таблица стилей)

Мне кажется, что вам нужно использовать AJAX. Не могли бы вы объяснить, почему это проблема?

Я много искал и думаю, что то, что я пытаюсь сделать, в принципе невозможно, поэтому, как вы говорите, лучше всего придерживаться моего текущего решения AJAX.

ChrisInCambo 28.12.2008 17:41

У вас есть контроль над каким-либо сервером? Потому что, если да, вы можете использовать свой сервер для прокси-сервера службы и обернуть ответ JSON соответствующим оператором «var».

В качестве альтернативы, я считаю, что это сработает (я не тестировал это, и я всегда неправильно пишу "innerHtml"), хотя IMO это не очень чисто:

<script id = "data" src = "http://someotherserver.com/json.js"></script>
<script type = "text/javascript">
    var dataElem = document.getElementById("data");
    if (dataElem)
    {
        var myData = eval(dataElem.innerHtml);
    }
</script>

Предупреждение главного хирурга: оценка результатов с сервера, который вы не контролируете, - плохая идея.

Обычно я бы занижал такой ответ. Вы понимаете, что тег сценария не имеет innerHTML !, или каких-либо других простых средств доступа к данным удаленного сценария. Это причина успеха AJAX = XHR.

Lorenz Lo Sauer 15.09.2011 16:16

@Lo - по крайней мере, в Firefox и Chrome тег скрипта определенно имеет innerHTML; Я не пробовал IE

kdgregory 18.09.2011 19:04

Другие вопросы по теме