Detaillierte Interpretation der JSONP-Prinzipien
Der unten stehende Herausgeber empfiehlt eine auf JSONP-Prinzipien basierende Analyse, die einen guten Referenzwert hat und ich hoffe, dass sie für alle hilfreich sein wird. Folgen wir dem Herausgeber und werfen wir einen Blick darauf.
Vorwort
Das erste Projekt, mit dem ich seit Beginn meiner Arbeit in Berührung kam, ist die Front- End- und Back-End-Trennung, und das Front-End ist statisch. Die Datei verfügt über einen eigenen unabhängigen Domänennamen, und Daten werden über die Schnittstelle für Rendering und andere Vorgänge abgerufen.
Es besteht keine Notwendigkeit, näher auf domänenübergreifende Methoden einzugehen. Suchen Sie einfach und es wird viele geben, aber die am häufigsten verwendeten Methoden sind JSONP und CORS. JSONP konzentriert sich auf das Front-End, was als Front-End-Hack-Fähigkeiten angesehen werden kann, die wichtiger sind als das Back-End, und der Server muss stärker konfiguriert werden.
Dieser Artikel analysiert das Implementierungsprinzip von JSONP.
Grundprinzip
Das Grundprinzip ist leicht zu erklären. Es gibt einige Tags in HTML-Seiten, die es nicht sind Domain-Einschränkungen wie IMG, Skript, Link usw. dürfen überschritten werden. Wenn wir die benötigten Daten in eine js-Datei einfügen, können wir die Same-Origin-Beschränkung des Browsers durchbrechen.
Skript-Tag erstellen
Dynamische Skriptelemente werden in „High Performance JavaScript“ erwähnt. Der Autor schreibt:
Die Datei befindet sich hier Element Beim Hinzufügen zur Seite mit dem Herunterladen beginnen. Der entscheidende Punkt dieser Technologie besteht darin, dass bei jedem initiierten Download der Download und die Ausführung der Datei andere Prozesse auf der Seite nicht blockieren.
2. Wenn Sie dynamische Skriptknoten zum Herunterladen von Dateien verwenden, wird der zurückgegebene Code normalerweise sofort ausgeführt (mit Ausnahme von Firefox und Oprea, die darauf warten, dass alle vorherigen dynamischen Skriptknoten die Ausführung abschließen). selbst, dieser Mechanismus Es funktioniert gut.
Zitat 1 stellt sicher, dass der Hauptthread nicht blockiert wird, wenn JSONP-Anfragen gestellt werden. Zitat 2 stellt sicher, dass es keine Fehler gibt, wenn der JSONP-Code unmittelbar nach Abschluss des Ladevorgangs selbst ausgeführt wird.
Rückruf
Nach dem Empfang der GET-Anfrage muss der Server normalerweise feststellen, ob ein Rückrufparameter vorhanden ist. Wenn ja, muss er dies tun in den zurückgegebenen Daten enthalten sein. Fügen Sie einen Methodennamen und Klammern außerhalb der Daten hinzu. Wenn Sie beispielsweise die folgende Anfrage initiieren:
http://www.a.com/getSomething?callback=jsonp0
, dann gibt der Server den folgenden Inhalt zurück:
jsonp0({code:200,data:{}})
Da dies natürlich der Inhalt ist, der im dynamisch geladenen Skript-Tag enthalten ist, dann dies ist ein Absatz Selbstausführender Code, dieser Code hat nur eine Funktion namens jsonp0.
Wenn es eine Ausführung gibt, muss diese natürlich zuerst erstellt werden, sonst wird ein Fehler gemeldet. Dieser Erstellungsschritt muss vor dem Aufruf ausgeführt werden.
Die spezifische Implementierung ist wie folgt:
function jsonp (url, successCallback, errorCallback, completeCallback) { // 声明对象,需要将函数声明至全局作用域 window.jsonp0 = function (data) { successCallback(data); if (completeCallback) completeCallback(); } // 创建script标签,并将url后加上callback参数 var script = document.createElement('script') , url = url + (url.indexOf('?') == -1 ? '?' : '&') + 'callback=jsonp0' ; script.src = url; document.head.parentNode.insertBefore(script, document.head); // 等到script加载完毕以后,就会自己执行 }
Das Obige vervollständigt im Grunde den Kern einer JSONP-Methode. Zu diesem Zeitpunkt ist jsonp0 eine Funktion, die wir deklariert haben Der Server ist normal. Bei der Rückkehr wird die jsonp0-Funktion ausgeführt, und der darin enthaltene successCallback-Rückruf wird ebenfalls ausgeführt.
Verbessern Sie es
In tatsächlichen Situationen werden normalerweise viele JSONP-Anfragen gleichzeitig aufgerufen,
Also Da jsonp0 unsere Anforderungen erfüllen kann, sehen wir oft, dass der Code von jsonp1, jsonp2 usw. nacheinander akkumuliert wird.
Das liegt daran, dass die Anfragen asynchron erfolgen können. Wenn die JSONP-Methode zum ersten Mal ausgeführt wird, ist window.jsonp0 die Funktion A. Zu diesem Zeitpunkt wird die JS-Datei geladen. Wenn JS nicht geladen wird, wird die JSONP-Methode erneut aufgerufen Funktion B. Nachdem die beiden js geladen wurden, wird der zweite Rückruf ausgeführt.
Wir müssen also im Namen des Rückrufs unterscheiden, und die Akkumulation kann den Bedarf decken.
Ändern Sie den Code:
var jsonpCounter = 0; function jsonp (url, successCallback, errorCallback, completeCallback) { var jsId = 'jsonp' + jsonpCounter++; // 声明对象,需要将函数声明至全局作用域 window[jsId] = function (data) { successCallback(data); if (completeCallback) completeCallback(); clean(); } // 创建script标签,并将url后加上callback参数 var script = document.createElement('script') , url = url + (url.indexOf('?') == -1 ? '?' : '&') + 'callback=' + jsId ; script.src = url; document.head.parentNode.insertBefore(script, document.head); // 等到script加载完毕以后,就会自己执行 //在执行完我们这个方法以后,会有很多script标签出现在head之前,我们需要手动的删除掉他们。 function clean () { script.parentNode.removeChild(script); window[jsId] = function(){}; } }
Nach dem Hinzufügen von Akkumulation und Bereinigung gibt es noch einen wichtigen Punkt, mit dem Sie sich befassen müssen, nämlich den Fehlerrückruf. Wenn wir JSONP anfordern, legen wir normalerweise eine Zeitüberschreitung fest. Wenn diese Zeit überschritten wird, wird eine Zeitüberschreitungsausnahme ausgelöst.
Die Implementierung ist wie folgt:
var jsonpCounter = 0; function jsonp (url, successCallback, errorCallback, completeCallback, timeout) { // 略去上面写过的代码 var timeout = timeout || 10000 , timer ; if (timeout) { timer = setTimeout(function () { if (errorCallback) { errorCallback(new Error('timeout')); } clean(); }, timeout) } function clean () { script.parentNode.removeChild(script); window[jsId] = function(){}; if (timer) clearTimeout(timer); } }
Auf diese Weise sind grundsätzlich alle Funktionen von JSONP abgeschlossen, und für den Rest sind möglicherweise einige kompatible Änderungen erforderlich, um als vollständige JSONP-Methode betrachtet zu werden.
REFER
《Hochleistungs-JavaScript》
Eine JSONP-Implementierung auf npm, JSONP
Die Das Obige habe ich für alle zusammengestellt. Ich hoffe, dass es in Zukunft für alle hilfreich sein wird.
Verwandte Artikel:
So implementieren Sie explizite Konvertierung und implizite Konvertierung in Javascript
So verwenden Sie die Redux-Architektur in ReactNative
Welche Probleme treten bei der Verwendung von MathJax in Angular auf?
NodeJS zum Schreiben von Crawler-Beispielen verwenden
Das obige ist der detaillierte Inhalt vonDetaillierte Interpretation der JSONP-Prinzipien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Analyse der Rolle und des Prinzips von nohup In Unix und Unix-ähnlichen Betriebssystemen ist nohup ein häufig verwendeter Befehl, mit dem Befehle im Hintergrund ausgeführt werden können. Selbst wenn der Benutzer die aktuelle Sitzung verlässt oder das Terminalfenster schließt, kann der Befehl ausgeführt werden werden weiterhin ausgeführt. In diesem Artikel werden wir die Funktion und das Prinzip des Nohup-Befehls im Detail analysieren. 1. Die Rolle von Nohup: Befehle im Hintergrund ausführen: Mit dem Befehl Nohup können wir Befehle mit langer Laufzeit weiterhin im Hintergrund ausführen lassen, ohne dass dies dadurch beeinträchtigt wird, dass der Benutzer die Terminalsitzung verlässt. Dies muss ausgeführt werden

Prinzipielle Analyse und praktische Erkundung des Struts-Frameworks. Als häufig verwendetes MVC-Framework in der JavaWeb-Entwicklung verfügt das Struts-Framework über gute Entwurfsmuster und Skalierbarkeit und wird häufig in der Anwendungsentwicklung auf Unternehmensebene verwendet. In diesem Artikel werden die Prinzipien des Struts-Frameworks analysiert und anhand tatsächlicher Codebeispiele untersucht, um den Lesern zu helfen, das Framework besser zu verstehen und anzuwenden. 1. Analyse der Prinzipien des Struts-Frameworks 1. MVC-Architektur Das Struts-Framework basiert auf MVC (Model-View-Con

MyBatis ist ein beliebtes Java-Persistenzschicht-Framework, das in verschiedenen Java-Projekten häufig verwendet wird. Unter diesen ist das Einfügen von Stapeln ein häufiger Vorgang, der die Leistung von Datenbankvorgängen effektiv verbessern kann. In diesem Artikel wird das Implementierungsprinzip von Batch Insert in MyBatis eingehend untersucht und anhand spezifischer Codebeispiele detailliert analysiert. Batch-Einfügung in MyBatis In MyBatis werden Batch-Einfügungsvorgänge normalerweise mit dynamischem SQL implementiert. Durch Konstruieren eines S, das mehrere eingefügte Werte enthält

Das RPM-Tool (RedHatPackageManager) in Linux-Systemen ist ein leistungsstarkes Tool zum Installieren, Aktualisieren, Deinstallieren und Verwalten von Systemsoftwarepaketen. Es ist ein häufig verwendetes Tool zur Verwaltung von Softwarepaketen in RedHatLinux-Systemen und wird auch von vielen anderen Linux-Distributionen verwendet. Die Rolle des RPM-Tools ist sehr wichtig. Es ermöglicht Systemadministratoren und Benutzern die einfache Verwaltung von Softwarepaketen auf dem System. Über RPM können Benutzer problemlos neue Softwarepakete installieren und vorhandene Software aktualisieren

MyBatis ist ein hervorragendes Persistenzschicht-Framework, das Datenbankoperationen basierend auf XML und Anmerkungen unterstützt. Es ist einfach und benutzerfreundlich und bietet außerdem einen umfangreichen Plug-In-Mechanismus. Unter diesen ist das Paging-Plugin eines der am häufigsten verwendeten Plug-Ins. Dieser Artikel befasst sich mit den Prinzipien des MyBatis-Paging-Plug-Ins und veranschaulicht es anhand konkreter Codebeispiele. 1. Paging-Plug-In-Prinzip MyBatis selbst bietet keine native Paging-Funktion, Sie können jedoch Plug-Ins verwenden, um Paging-Abfragen zu implementieren. Das Prinzip des Paging-Plug-Ins besteht hauptsächlich darin, MyBatis abzufangen

Der Befehl chage im Linux-System ist ein Befehl zum Ändern des Kennwortablaufdatums eines Benutzerkontos. Er kann auch zum Ändern des längsten und kürzesten nutzbaren Datums des Kontos verwendet werden. Dieser Befehl spielt eine sehr wichtige Rolle bei der Verwaltung der Benutzerkontosicherheit. Er kann die Nutzungsdauer von Benutzerkennwörtern effektiv steuern und die Systemsicherheit verbessern. So verwenden Sie den Befehl chage: Die grundlegende Syntax des Befehls chage lautet: chage [Option] Benutzername. Um beispielsweise das Ablaufdatum des Kennworts des Benutzers „testuser“ zu ändern, können Sie den folgenden Befehl verwenden

Einführung in die Verwendung von JSONP zur Implementierung domänenübergreifender Anfragen in Vue. Aufgrund der Einschränkungen der Same-Origin-Richtlinie wird das Front-End bei domänenübergreifenden Anfragen bis zu einem gewissen Grad behindert. JSONP (JSONwithPadding) ist eine domänenübergreifende Anforderungsmethode. Sie nutzt die Eigenschaften des <script>-Tags, um domänenübergreifende Anforderungen durch die dynamische Erstellung des <script>-Tags zu implementieren Rückruffunktion. In diesem Artikel wird die Verwendung von JSONP in Vue ausführlich vorgestellt

Eine eingehende Analyse der Prinzipien und Implementierung von MySQLMVCC. MySQL ist derzeit eines der beliebtesten relationalen Datenbankverwaltungssysteme. Es bietet einen Mechanismus zur Steuerung der Parallelität mehrerer Versionen (MultiversionConcurrencyControl, MVCC) zur Unterstützung einer effizienten gleichzeitigen Verarbeitung. MVCC ist eine Methode zur Verarbeitung gleichzeitiger Transaktionen in der Datenbank, die eine hohe Parallelität und Isolation bieten kann. In diesem Artikel werden die Prinzipien und die Implementierung von MySQLMVCC ausführlich analysiert und anhand von Codebeispielen veranschaulicht. 1. M
