Heim Web-Frontend js-Tutorial Detaillierte Interpretation der JSONP-Prinzipien

Detaillierte Interpretation der JSONP-Prinzipien

Jun 22, 2018 pm 05:56 PM
jsonp 原理

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
Nach dem Login kopieren

, dann gibt der Server den folgenden Inhalt zurück:

jsonp0({code:200,data:{}})
Nach dem Login kopieren

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加载完毕以后,就会自己执行
}
Nach dem Login kopieren

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 Login kopieren

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);
 }
}
Nach dem Login kopieren

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Analyse der Funktion und des Prinzips von Nohup Analyse der Funktion und des Prinzips von Nohup Mar 25, 2024 pm 03:24 PM

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

Ausführliche Diskussion der Prinzipien und Praktiken des Struts-Frameworks Ausführliche Diskussion der Prinzipien und Praktiken des Struts-Frameworks Feb 18, 2024 pm 06:10 PM

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

Vertiefendes Verständnis des Batch-Insert-Implementierungsprinzips in MyBatis Vertiefendes Verständnis des Batch-Insert-Implementierungsprinzips in MyBatis Feb 21, 2024 pm 04:42 PM

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

Eine ausführliche Diskussion der Funktionen und Prinzipien von Linux-RPM-Tools Eine ausführliche Diskussion der Funktionen und Prinzipien von Linux-RPM-Tools Feb 23, 2024 pm 03:00 PM

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

Ausführliche Erläuterung des Prinzips des MyBatis-Paging-Plug-Ins Ausführliche Erläuterung des Prinzips des MyBatis-Paging-Plug-Ins Feb 22, 2024 pm 03:42 PM

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

Eine ausführliche Analyse der Funktionen und Arbeitsprinzipien des Linux-Befehls chage Eine ausführliche Analyse der Funktionen und Arbeitsprinzipien des Linux-Befehls chage Feb 24, 2024 pm 03:48 PM

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

So verwenden Sie JSONP, um domänenübergreifende Anforderungen in Vue zu implementieren So verwenden Sie JSONP, um domänenübergreifende Anforderungen in Vue zu implementieren Oct 15, 2023 pm 03:52 PM

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

Eingehende Analyse des MySQL MVCC-Prinzips und der Implementierung Eingehende Analyse des MySQL MVCC-Prinzips und der Implementierung Sep 09, 2023 pm 08:07 PM

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

See all articles