ajax は現在、非常に人気のあるテクノロジーです。JQuery やいくつかのサードパーティのプラグイン、さらには Microsoft が提供するいくつかのコントロールを使用して ajax 機能を実装することもできますが、その使用方法を理解することも非常に重要です。純粋な JavaScript を使用して実装する サーバー側関数を入手して、純粋な JavaScript を使用して ajax 関数を実装する方法を示し、その原理を明確にします
フロントエンド ページの開発プロセスでは、Ajax リクエストはフォーム データを非同期で送信するためによく使用されます。ページを非同期的に更新します。
一般的には、Jquery で $.ajax、$.post、$.getJSON を使用すると非常に便利ですが、場合によっては ajax 機能のみが必要な場合もあるため、Jquery を導入するのは費用対効果が高くありません。
次に、ネイティブ JavaScrpit を使用して単純な Ajax リクエストを実装し、Ajax リクエストにおけるクロスドメイン アクセスの問題と、複数の Ajax リクエストのデータ同期の問題について説明します。
JavaScript は Ajax 非同期リクエストを実装します
単純な Ajax リクエストの実装
Ajax リクエストの原理は、XMLHttpRequest オブジェクトを作成し、このオブジェクトを使用してリクエストを非同期に送信することです。具体的な実装については、次のコードを参照してください:
function ajax(option) { // 创建一个 XMLHttpRequest 对象 var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"), requestData = option.data, requestUrl = option.url, requestMethod = option.method; // 如果是GET请求,需要将option中的参数拼接到URL后面 if ('POST' != requestMethod && requestData) { var query_string = ''; // 遍历option.data对象,构建GET查询参数 for(var item in requestData) { query_string += item + '=' + requestData[item] + '&'; } // 注意这儿拼接的时候,需要判断是否已经有 ? requestUrl.indexOf('?') > -1 ? requestUrl = requestUrl + '&' + query_string : requestUrl = requestUrl + '?' + query_string; // GET 请求参数放在URL中,将requestData置为空 requestData = null; } // ajax 请求成功之后的回调函数 xhr.onreadystatechange = function () { // readyState=4表示接受响应完毕 if (xhr.readyState == ("number" == typeof XMLHttpRequest.DONE ? XMLHttpRequest.DONE : 4)) { if (200 == xhr.status) { // 判断状态码 var response = xhr.response || xhr.responseText || {}; // 获取返回值 // if define success callback, call it, if response is string, convert it to json objcet console.log(response); option.success && option.success(response); // 调用回调函数处理返回数据 // 可以判断返回数据类型,对数据进行JSON解析或者XML解析 // option.success && option.success('string' == typeof response ? JSON.parse(response) : response); } else { // if define error callback, call it option.error && option.error(xhr, xhr.statusText); } } }; // 发送ajax请求 xhr.open(requestMethod, requestUrl, true); // 请求超时的回调 xhr.ontimeout = function () { option.timeout && option.timeout(xhr, xhr.statusText); }; // 定义超时时间 xhr.timeout = option.timeout || 0; // 设置响应头部,这儿默认设置为json格式,可以定义为其他格式,修改头部即可 xhr.setRequestHeader && xhr.setRequestHeader('Content-Type', 'application/json;charset=utf-8'); xhr.withCredentials = (option.xhrFields || {}).withCredentials; // 这儿主要用于发送POST请求的数据 xhr.send(requestData); }
上記のコードには詳細なコメントが含まれていますが、ajax の原理は一般に、XMLHttpRequest オブジェクトを使用してデータを送信します。このオブジェクトについて補足説明します。
XMLHttpRequest オブジェクトの基本プロパティ
readyState プロパティには 5 つのステータス値があります:
0: 初期化されていません: 初期化されていません。 XMLHttpRequest オブジェクトは作成されましたが、初期化されていません。
1: 読み込み中です: 送信する準備ができています。
2: ロードされました。: 送信されましたが、まだ応答がありません。
3: 対話型です: 応答は受信されていますが、まだ受信されていません。
4: はい完了: 応答は受け入れられます。
responseText: サーバーから返された応答テキスト。これは、readyState>=3 の場合にのみ値を持ちます。 readyState=3 の場合、返される応答テキストは不完全です。readyState=4 の場合のみ、完全な応答テキストが受信されます。
responseXML: 応答情報は XML であり、Dom オブジェクトに解析できます。
status: サーバーの HTTP ステータス コード が 200 の場合は OK を意味し、404 は見つからないことを意味します。
statusText: サーバーの http ステータス コードのテキスト。たとえば、OK、見つかりません。
XMLHttpRequest オブジェクトの基本メソッド
open(method, url, asyn): XMLHttpRequest オブジェクトを開きます。メソッドには、get、post、delete、および put が含まれます。 url は、要求されたリソースのアドレスです。 3 番目のパラメータは、非同期を使用するかどうかを示します。 Ajaxの特徴は非同期送信であるため、デフォルトはtrueです。同期が使用される場合は False。
send(body): Ajax リクエストを送信します。送信内容は必須パラメータでも構いません。パラメータがない場合は直接送信(null)
使用方法
上記で定義したajax関数を直接呼び出し、対応するオプションとパラメータを送信します。
ajax({ url: '/post.php', data: { name: 'uusama', desc: 'smart' }, method: 'GET', success: function(ret) { console.log(ret); } });
クロスドメインリクエストの問題
Ajax リクエストを使用する場合、クロスドメインリクエストという 1 つの問題に注意する必要があります。
特別な手段を使用しないクロスドメインリクエスト: 他のドメイン名およびポートで URL リソースをリクエストすると、Access-Control-Allow-Origin 関連のエラーが報告されます。主な理由は、クロスドメイン リソース要求を行うことができないと規定するブラウザーの同一オリジン ポリシー制限です。
解決策
ここでは簡単な解決策をいくつか紹介します。
クロスドメインリクエストを許可するヘッダーを ajax ヘッダーに追加するこの方法では、サーバーがクロスドメインリクエストを許可するヘッダーの追加に協力する必要もあります。以下は、POST リクエストを許可するクロスドメイン ヘッダーを追加する PHP の例です。
// 指定允许其他域名访问 header('Access-Control-Allow-Origin:*'); // 响应类型 header('Access-Control-Allow-Methods:POST'); // 响应头设置 header('Access-Control-Allow-Headers:x-requested-with,content-type');
動的 scrpit タグを使用して、scrpit タグを動的に作成し、それを要求されたアドレス (JSONP メソッド) にポイントします。コールバックを接続する必要があります。 URL の後の関数。タグが正常に読み込まれた後にコールバック関数が呼び出されます。
var url = "http://uusama.com", callbaclName = 'jsonpCallback'; script = document.createElement('script'); script.type = 'text/javascript'; script.src = url + (url.indexOf('?') > -1 ? '&' : '?') + 'callback=' + callbaclName; document.body.appendChild(script);
コールバック関数はグローバル関数として設定する必要があります:
window['jsonpCallback'] = function jsonpCallback(ret) {}
複数のAjaxリクエストデータの同期の問題
単一のAjax戻りデータは非同期で処理されます
複数のAjaxリクエストは互いに関連していません。これらは Request が呼び出された後に個別に送信され、リクエストが成功した後に独自のコールバック メソッドを呼び出します。相互に影響を与えることはありません。
Ajax リクエストの非同期の性質のため、リクエストの完了に依存するすべての操作はコールバック関数内に配置する必要があります。そうしないと、コールバック関数の外で読み取った値が空になります。以下の例を見てください:
var result = null; ajax({ url: '/get.php?id=1', method: 'GET', success: function(ret) { result = ret; } }); console.log(result); // 输出 null
コールバック関数に result の値を設定しましたが、最後の行の console.log(result); の出力は空です。
ajax リクエストは非同期であるため、プログラムが最後の行まで実行されると、リクエストは完了せず、値を変更する時間がありません。
ここではconsole.log(result)関連の処理をsuccessコールバック関数に入れる必要があります。
複数の ajax 戻りデータの問題
複数の ajax リクエストがある場合、状況は少し複雑になります。
複数の ajax リクエストが順番に実行され、そのうちの 1 つが次のリクエストが実行される前に完了した場合、次のリクエストは前のリクエストのコールバックに配置されることがあります。
比如有两个ajax请求,其中一个请求的数据依赖于另外一个,则可以在第一个请求的回调里面再进行ajax请求:
// 首先请求第一个ajax ajax({ url: '/get1.php?id=1', success: function(ret1) { // 第一个请求成功回调以后,再请求第二个 if (ret1) { ajax({ url: '/get2.php?id=4', success:function(ret2) { console.log(ret1); console.log(ret2) } }) } } }); // 也可以写成下面的形式 // 将第二个ajax请求定义为一个函数,然后调用 var ajax2 = function(ret1) { ajax({ url: '/get2.php?id=4', success:function(ret2) { console.log(ret1); console.log(ret2) } }); }; ajax({ url: '/get1.php?id=1', success: function(ret1) { if(ret1){ ajax2(ret1); // 调用第二个ajax请求 } } });
如果不关心不同的ajax请求的顺序,而只是关心所有请求都完成,才能进行下一步。
一种方法是可以在每个请求完成以后都调用同一个回调函数,只有次数减少到0才执行下一步。
var count = 3, all_ret = []; // 调用3次 ajax({ url: '/get1.php?id=1', success:function(ret) { callback(ret); // 请求成功后调用统一回调,次数减1 } }); ajax({ url: '/get2.php?id=1', success:function(ret) { callback(ret); } }); ajax({ url: '/get3.php?id=1', success:function(ret) { callback(ret); } }); function callback(ret) { // 当调用3次以上以后,说明3个ajax军完成 if (count > 0) { count--; // 每调用一次,次数减1 // 可以在这儿保存 ret 到全局变量 all_ret.push(ret); return; } else { // 调用三次以后 // todo console.log(ret); } }
另一种方法是设置一个定时任务去轮训是否所有ajax请求都完成,需要在每个ajax的成功回调中去设置一个标志。
这儿可以用是否获得值来判断,也可以设置标签来判断,用值来判断时,要注意设置的值和初始相同的情况。
var all_ret = { ret1: null, // 第一个ajax标识 ret2: null, // 第二个ajax标识 ret3: null, // 第三个ajax标识 }; ajax({ url: '/get1.php?id=1', success:function(ret) { all_ret['ret1'] = ret; // 修改第一个ajax请求标识 } }); ajax({ url: '/get2.php?id=1', success:function(ret) { all_ret['ret2'] = ret; // 修改第二个ajax请求标识 } }); ajax({ url: '/get3.php?id=1', success:function(ret) { all_ret['ret3'] = ret; // 修改第三个ajax请求标识 } }); var repeat = setInterval(function(){ // 遍历是否所有ajax请求标识都已被修改,以此判断是否所有ajax请求都已完成 for(var item in all_ret) { if (all_ret[item] === null){ return; } } // todo, 到这儿所有ajax请求均已完成 clearInterval(repeat); }, 50); // 调用次数可以适当调整,不应设的过小或者过大
以上就是本篇文章的所有内容,希望对大家学习提供到帮助!!
相关推荐:
Javascript中从学习bind到实现bind的过程详解
以上がネイティブ JavaScript は Ajax 非同期リクエストを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか

node.jsは、主にストリームのおかげで、効率的なI/Oで優れています。 ストリームはデータを段階的に処理し、メモリの過負荷を回避します。大きなファイル、ネットワークタスク、リアルタイムアプリケーションの場合。ストリームとTypeScriptのタイプの安全性を組み合わせることで、パワーが作成されます

PythonとJavaScriptのパフォーマンスと効率の違いは、主に以下に反映されています。1)解釈された言語として、Pythonはゆっくりと実行されますが、開発効率が高く、迅速なプロトタイプ開発に適しています。 2)JavaScriptはブラウザ内の単一のスレッドに限定されていますが、マルチスレッドおよび非同期I/Oを使用してnode.jsのパフォーマンスを改善でき、両方とも実際のプロジェクトで利点があります。

JavaScriptは1995年に発信され、Brandon Ikeによって作成され、言語をCに実現しました。 2。JavaScriptのメモリ管理とパフォーマンスの最適化は、C言語に依存しています。 3. C言語のクロスプラットフォーム機能は、さまざまなオペレーティングシステムでJavaScriptを効率的に実行するのに役立ちます。

JavaScriptはブラウザとnode.js環境で実行され、JavaScriptエンジンに依存してコードを解析および実行します。 1)解析段階で抽象的構文ツリー(AST)を生成します。 2)ASTをコンパイル段階のバイトコードまたはマシンコードに変換します。 3)実行段階でコンパイルされたコードを実行します。

PythonとJavaScriptの将来の傾向には、1。Pythonが科学コンピューティングの分野での位置を統合し、AI、2。JavaScriptはWebテクノロジーの開発を促進します。どちらもそれぞれのフィールドでアプリケーションシナリオを拡大し続け、パフォーマンスをより多くのブレークスルーを行います。

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

はい、JavaScriptのエンジンコアはCで記述されています。1)C言語は、JavaScriptエンジンの開発に適した効率的なパフォーマンスと基礎となる制御を提供します。 2)V8エンジンを例にとると、そのコアはCで記述され、Cの効率とオブジェクト指向の特性を組み合わせて書かれています。3)JavaScriptエンジンの作業原理には、解析、コンパイル、実行が含まれ、C言語はこれらのプロセスで重要な役割を果たします。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SublimeText3 中国語版
中国語版、とても使いやすい

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ホットトピック









