Подтвердить что ты не робот

HTML/Javascript: как получить доступ к данным JSON, загруженным в тег script с помощью набора src

У меня есть этот файл JSON, который я генерирую на сервере, который я хочу сделать доступным на клиенте, так как страница доступна для просмотра. В основном то, что я хочу достичь, это:

У меня есть следующий тег, объявленный в моем HTML-документе:

<script id="test" type="application/json" src="http://myresources/stuf.json">

Файл, указанный в его источнике, содержит данные JSON. Как я уже видел, данные были загружены, как это происходит со сценариями.

Теперь, как мне получить к нему доступ в Javascript? Я пытался получить доступ к тегу скрипта с jQuery и без него, используя множество методов для получения моих данных JSON, но почему-то это не сработало. Получение его innerHTML работало бы, если бы в сценарии были записаны данные json. Чего не было и чего я не пытаюсь достичь.

Удаленный запрос JSON после загрузки страницы также не вариант, если вы хотите это предложить.

4b9b3361

Ответ 1

Вы не можете загрузить JSON, извините.

Я знаю, что вы думаете: "Почему я не могу просто использовать src здесь? Я видел такие вещи...":

<script id="myJson" type="application/json">
 { 
   name: 'Foo' 
 }
</script>

<script type="text/javascript">
    $(function() {
        var x = JSON.parse($('#myJson').html());
        alert(x.name); //Foo
     });
</script>

... Проще говоря, это был тег script, который "злоупотреблял" как держатель данных. Вы можете сделать это со всеми видами данных. Например, множество шаблонов шаблонов используют теги script для хранения шаблонов.

У вас есть короткий список параметров для загрузки JSON из удаленного файла:

  • Используйте $.get('your.json') или какой-либо другой такой метод AJAX.
  • Напишите файл, который устанавливает глобальную переменную в ваш json. (кажется, hokey).
  • Потяните его в невидимый iframe, затем очистите содержимое этого после его загрузки (я называю этот режим "1997" )
  • Обратитесь к священнику из вуду.

Конечная точка:

Удаленный запрос JSON после загрузки страницы также не является вариантом, если вы хотите предложить это.

... это не имеет смысла. Разница между запросом AJAX и запросом, отправленным браузером при обработке вашего <script src="">, по существу, ничто. Они оба будут делать GET на ресурсе. HTTP не заботит, было ли это сделано из-за тега script или вызова AJAX, и ни один из них не будет работать на вашем сервере.

Ответ 2

Другим решением было бы использовать серверный язык сценариев и просто включать встроенные json-данные. Вот пример, который использует PHP:

<script id="data" type="application/json"><?php include('stuff.json'); ?></script>
<script>
var jsonData = JSON.parse(document.getElementById('data').textContent)
</script>

В приведенном выше примере используется дополнительный тег script с типом application/json. Еще более простым решением является включение JSON непосредственно в JavaScript:

<script>var jsonData = <?php include('stuff.json');?>;</script>

Преимущество решения с дополнительным тегом заключается в том, что код JavaScript и данные JSON хранятся отдельно друг от друга.

Ответ 3

Казалось бы, это невозможно или, по крайней мере, не поддерживается.

Из спецификации HTML5:

При использовании для включения блоков данных (в отличие от сценариев) данные должны быть встроены в строку, формат данных должен быть задан с использованием атрибута type, атрибут src не должен указываться, а содержимое элемента script должно соответствовать к требованиям, определенным для используемого формата.

Ответ 4

Хотя это в настоящее время невозможно с тегом script, это возможно с iframe если он из того же домена.

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

<script>
    function someCallback(data){
        /** do something with data */
        console.log(data);

    }
    function jsonOnLoad(callback){
        const raw = this.contentWindow.document.body.textContent.trim();
        try {
          const data = JSON.parse(raw);
          /** do something with data */
          callback(data);
        }catch(e){
          console.warn(e.message);
        }
        this.remove();
    }
</script>
<!-- I frame with src pointing to json file on server, onload we apply "this" to have the iframe context, display none as we don't want to show the iframe -->
<iframe src="your/link/to/some.json" onload="jsonOnLoad.apply(this, someCallback)" style="display: none;"></iframe>

Проверено в Chrome и должно работать в Firefox. Не уверен насчет IE или Safari.

Ответ 6

Отметьте этот ответ: fooobar.com/questions/33495/...

$.getJSON("test.json", function(json) {
    console.log(json); // this will show the info it in firebug console
});

Ответ 7

Я согласен с Беном. Вы не можете загрузить/импортировать простой файл JSON.

Но если вы абсолютно хотите это сделать и можете гибко обновлять файл json, вы можете

мой-json.js

   var myJSON = {
      id: "12ws",
      name: "smith"
    }

index.html

<head>
  <script src="my-json.js"></script>
</head>
<body onload="document.getElementById('json-holder').innerHTML = JSON.stringify(myJSON);">
  <div id="json-holder"></div>
</body>

Ответ 8

Еще одна альтернатива, чтобы использовать точный JSON в JavaScript. Поскольку это нотация объектов Javascript, вы можете просто создать свой объект непосредственно с помощью нотации json. Если вы храните это в файле .js, вы можете использовать объект в вашем приложении. Это был полезный вариант для меня, когда у меня были статические данные json, которые я хотел кэшировать в файле отдельно от остальной части моего приложения.

    //Just hard code json directly within JS
    //here I create an object CLC that represents the json!
    $scope.CLC = {
        "ContentLayouts": [
            {
                "ContentLayoutID": 1,
                "ContentLayoutTitle": "Right",
                "ContentLayoutImageUrl": "/Wasabi/Common/gfx/layout/right.png",
                "ContentLayoutIndex": 0,
                "IsDefault": true
            },
            {
                "ContentLayoutID": 2,
                "ContentLayoutTitle": "Bottom",
                "ContentLayoutImageUrl": "/Wasabi/Common/gfx/layout/bottom.png",
                "ContentLayoutIndex": 1,
                "IsDefault": false
            },
            {
                "ContentLayoutID": 3,
                "ContentLayoutTitle": "Top",
                "ContentLayoutImageUrl": "/Wasabi/Common/gfx/layout/top.png",
                "ContentLayoutIndex": 2,
                "IsDefault": false
            }
        ]
    };

Ответ 9

поместите что-то подобное в ваш файл скрипта json-content.js

var mainjson = { your json data}

затем вызвать его из тега скрипта

<script src="json-content.js"></script>

тогда вы можете использовать его в следующем скрипте

<script>
console.log(mainjson)
</script>