Ich habe diese JSON-Datei, die ich auf dem Server generiere, den ich auf dem Client zugänglich machen möchte, da die Seite sichtbar ist. Grundsätzlich möchte ich erreichen:
Ich habe das folgende Tag in meinem HTML-Dokument deklariert:
<script id="test" type="application/json" src="http://myresources/stuf.json">
Die in der Quelle angegebene Datei enthält JSON-Daten. Wie ich gesehen habe, wurden Daten heruntergeladen, genau wie bei den Skripten.
Nun, wie kann ich mit Javascript darauf zugreifen? Ich habe versucht, mit und ohne jQuery auf das Skript-Tag zuzugreifen. Dabei habe ich mit einer Vielzahl von Methoden versucht, meine JSON-Daten abzurufen, aber irgendwie funktioniert das nicht. Die innerHTML
zu bekommen, hätte funktioniert, wenn die Json-Daten in das Skript geschrieben worden wären. Was es nicht war und was ich nicht erreichen möchte.
Eine Remote-JSON-Anforderung nach dem Laden einer Seite ist ebenfalls keine Option, falls Sie dies vorschlagen möchten.
Sie können JSON nicht so laden, sorry.
Ich weiß, dass du denkst "Warum kann ich hier nicht einfach src
verwenden? Ich habe solche Sachen gesehen ...":
<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>
... um es einfach auszudrücken, das war nur das Script-Tag, das als Datenhalter "missbraucht" wurde. Das können Sie mit allen Arten von Daten machen. Beispielsweise nutzen viele Template-Engines Skript-Tags, um Vorlagen zu speichern .
Sie haben eine kurze Liste von Optionen, um Ihre JSON aus einer Remote-Datei zu laden:
$.get('your.json')
oder eine andere solche Methode AJAX.Schlusspunkt:
Eine Remote-JSON-Anforderung nach dem Laden einer Seite ist ebenfalls keine Option, falls Sie dies vorschlagen möchten.
... das macht keinen Sinn. Der Unterschied zwischen einer AJAX - Anforderung und einer vom Browser während der Verarbeitung Ihres <script src="">
gesendeten Anforderung ist im Wesentlichen nichts. Sie werden beide ein GET für die Ressource durchführen. HTTP kümmert sich nicht darum, ob dies aufgrund eines Skript-Tags oder eines AJAX -Aufrufs erfolgt. Dies gilt auch für Ihren Server.
Eine andere Lösung wäre die Verwendung einer serverseitigen Skriptsprache und die einfache Einbindung von Json-Daten. Hier ist ein Beispiel, das PHP verwendet:
<script id="data" type="application/json"><?php include('stuff.json'); ?></script>
<script>
var jsonData = JSON.parse(document.getElementById('data').textContent)
</script>
Das obige Beispiel verwendet ein zusätzliches Skripttag mit dem Typ application/json
. Eine noch einfachere Lösung besteht darin, JSON direkt in JavaScript einzubinden:
<script>var jsonData = <?php include('stuff.json');?>;</script>
Der Vorteil der Lösung mit dem zusätzlichen Tag besteht darin, dass JavaScript-Code und JSON-Daten voneinander getrennt bleiben.
Es scheint, dass dies nicht möglich ist oder zumindest nicht unterstützt wird.
Aus der HTML5-Spezifikation :
Bei der Verwendung von data blocks (im Gegensatz zu Scripts) müssen die Daten inline eingebettet werden, das Format der Daten muss mit dem type-Attribut angegeben werden, das src-Attribut darf nicht angegeben werden und der Inhalt des Skriptelements muss den für das verwendete Format festgelegten Anforderungen entsprechen.
Wenn Sie JSON von einer anderen Domäne laden müssen: http://en.wikipedia.org/wiki/JSONP
Beachten Sie jedoch mögliche XSSI-Angriffe: https://www.scip.ch/de/?labs.20160414
Wenn es sich um dieselbe Domäne handelt, verwenden Sie einfach Ajax.
Überprüfen Sie diese Antwort: https://stackoverflow.com/a/7346598/1764509
$.getJSON("test.json", function(json) {
console.log(json); // this will show the info it in firebug console
});
Mit dem Tag script
ist dies derzeit nicht möglich, mit einer iframe
jedoch, wenn sie aus derselben Domäne stammt.
Ich habe das aus Spaß gemacht und gezeigt, dass es "möglich" ist, aber ich - nicht empfehle, dass es verwendet wird.
<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>
In Chrom getestet und sollte in Firefox funktionieren. Unsicher über IE oder Safari.
platziere so etwas in deiner Skriptdatei json-content.js
var mainjson = { your json data}
rufen Sie es dann über das Skript-Tag auf
<script src="json-content.js"></script>
dann können Sie es im nächsten Skript verwenden
<script>
console.log(mainjson)
</script>
Ich stimme Ben zu. Sie können die einfache JSON-Datei nicht laden/importieren.
Wenn Sie dies unbedingt tun möchten und die Json-Datei flexibel aktualisieren können, können Sie dies tun
meine-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>
Eine weitere Alternative, um den genauen Json in Javascript zu verwenden. Da es sich um eine JavaScript-Objektnotation handelt, können Sie Ihr Objekt direkt mit der Json-Notation erstellen. Wenn Sie dies in einer .js-Datei speichern, können Sie das Objekt in Ihrer Anwendung verwenden. Dies war eine nützliche Option für mich, wenn ich statische Json-Daten hatte, die ich in einer Datei getrennt von dem Rest meiner App cachen wollte.
//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
}
]
};