Detailed interpretation of JSONP principles
The editor below recommends an analysis based on JSONP principles, which has a good reference value and I hope it will be helpful to everyone. Let’s follow the editor and take a look.
Preface
The first project I came into contact with since I started working was the front-end and back-end separation, and the front-end was static The file has its own independent domain name, and data is obtained through the interface for rendering and other operations.
There is no need to say much about cross-domain methods. If you search casually, there are many, but the most commonly used ones are jsonp and CORS. jsonp focuses on the front-end, which can be regarded as front-end Hack skills. CORS is more important than the back-end, and the server needs to be configured more.
This article analyzes the implementation principle of jsonp.
Basic Principle
The basic principle is easy to explain. There are some tags in the html page that are not subject to crossing. Domain restrictions, such as img, script, link, etc. If we put the data we need in a js file, then we can break through the browser's same-origin limitation.
Creating script tags
Dynamic script elements are mentioned in "High Performance JavaScript". The author writes:
1. The file is used in this element. Start downloading when added to page. The key point of this technology is that whenever a download is initiated, the download and execution of the file does not block other processes on the page.
2. When using dynamic script nodes to download files, the returned code will usually be executed immediately (except for Firefox and Oprea, which will wait for all previous dynamic script nodes to complete execution.) When the script executes itself, this mechanism Operating normally.
Quote 1 ensures that the main thread will not be blocked when making JSONP requests. Quote 2 ensures that there will be no errors when the JSONP code executes itself immediately after loading is completed.
callback
After receiving the GET request, the server usually needs to determine whether there is a callback parameter. If so, it needs to be included in the returned Add a method name and parentheses outside the data. For example, if you initiate the following request:
http://www.a.com/getSomething?callback=jsonp0
, then the server will return the following content:
jsonp0({code:200,data:{}})
Obviously, since this is the content contained in the dynamically loaded Script tag, then this is a paragraph Self-executing code, this code only has one function called - jsonp0.
Of course, if there is execution, it must be created first, otherwise an error will be reported. This step of creation needs to be executed before calling.
The specific implementation is as follows:
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加载完毕以后,就会自己执行 }
The above basically completes the core of a jsonp method. At this time, jsonp0 is a function we declared. If the server is normal When returning, the jsonp0 function will be executed, and the successCallback callback inside will also be executed.
Improve it
In actual situations, there are usually many jsonp requests being called at the same time,
So since jsonp0 can meet our needs. Why do we often see the code of jsonp1, jsonp2, etc. being accumulated in sequence?
This is because the requests may be made asynchronously. When the jsonp method is executed for the first time, window.jsonp0 is function A. At this time, the js file is loaded. When js is not loaded, the jsonp method is called again. At this time, window.jsonp0 points to function B. Then after the two js are loaded, the second callback will be executed.
So, we need to make a distinction in the name of the callback, and accumulation can meet the needs.
Modify the 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(){}; } }
After adding accumulation and cleanup, there is still an important place to deal with, which is the error callback. Normally, when we request jsonp, we will set a timeout. If this time is exceeded, a timeout exception will be thrown.
The implementation is as follows:
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); } }
In this way, all functions of jsonp are basically completed, and the rest may require some compatible modifications to be considered a complete jsonp method.
REFER
《High Performance JavaScript》
A jsonp implementation on npm, JSONP
The above is what I compiled for everyone. I hope it will be helpful to everyone in the future.
Related articles:
How to implement explicit conversion and implicit conversion in javascript
How to use Redux architecture in ReactNative
What problems do you encounter when using MathJax in Angular?
Using NodeJS to write crawler examples
The above is the detailed content of Detailed interpretation of JSONP principles. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



Analysis of the role and principle of nohup In Unix and Unix-like operating systems, nohup is a commonly used command that is used to run commands in the background. Even if the user exits the current session or closes the terminal window, the command can still continue to be executed. In this article, we will analyze the function and principle of the nohup command in detail. 1. The role of nohup: Running commands in the background: Through the nohup command, we can let long-running commands continue to execute in the background without being affected by the user exiting the terminal session. This needs to be run

Principle analysis and practical exploration of the Struts framework. As a commonly used MVC framework in JavaWeb development, the Struts framework has good design patterns and scalability and is widely used in enterprise-level application development. This article will analyze the principles of the Struts framework and explore it with actual code examples to help readers better understand and apply the framework. 1. Analysis of the principles of the Struts framework 1. MVC architecture The Struts framework is based on MVC (Model-View-Con

MyBatis is a popular Java persistence layer framework that is widely used in various Java projects. Among them, batch insertion is a common operation that can effectively improve the performance of database operations. This article will deeply explore the implementation principle of batch Insert in MyBatis, and analyze it in detail with specific code examples. Batch Insert in MyBatis In MyBatis, batch Insert operations are usually implemented using dynamic SQL. By constructing a line S containing multiple inserted values

The RPM (RedHatPackageManager) tool in Linux systems is a powerful tool for installing, upgrading, uninstalling and managing system software packages. It is a commonly used software package management tool in RedHatLinux systems and is also used by many other Linux distributions. The role of the RPM tool is very important. It allows system administrators and users to easily manage software packages on the system. Through RPM, users can easily install new software packages and upgrade existing software

MyBatis is an excellent persistence layer framework. It supports database operations based on XML and annotations. It is simple and easy to use. It also provides a rich plug-in mechanism. Among them, the paging plug-in is one of the more frequently used plug-ins. This article will delve into the principles of the MyBatis paging plug-in and illustrate it with specific code examples. 1. Paging plug-in principle MyBatis itself does not provide native paging function, but you can use plug-ins to implement paging queries. The principle of paging plug-in is mainly to intercept MyBatis

The chage command in the Linux system is a command used to modify the password expiration date of a user account. It can also be used to modify the longest and shortest usable date of the account. This command plays a very important role in managing user account security. It can effectively control the usage period of user passwords and enhance system security. How to use the chage command: The basic syntax of the chage command is: chage [option] user name. For example, to modify the password expiration date of user "testuser", you can use the following command

Introduction to how to use JSONP to implement cross-domain requests in Vue. Due to the restrictions of the same-origin policy, the front-end will be hindered to a certain extent when making cross-domain requests. JSONP (JSONwithPadding) is a cross-domain request method. It uses the characteristics of the <script> tag to implement cross-domain requests by dynamically creating the <script> tag, and passes the response data back as a parameter of the callback function. This article will introduce in detail how to use JSONP in Vue

An in-depth analysis of the principles and implementation of MySQLMVCC. MySQL is one of the most popular relational database management systems currently. It provides a multiversion concurrency control (MultiversionConcurrencyControl, MVCC) mechanism to support efficient concurrent processing. MVCC is a method of handling concurrent transactions in the database that can provide high concurrency and isolation. This article will provide an in-depth analysis of the principles and implementation of MySQLMVCC, and illustrate it with code examples. 1. M
