Ajax 構文の簡単な分析

怪我咯
怪我咯オリジナル
2017-04-05 14:54:261010ブラウズ

Ajax は現在非常に一般的な技術であり、議論や研究に値する技術でもあります。この記事では、Ajax の開発プロセスと、Ajax がさまざまなライブラリ framework でどのように使用されるかに焦点を当てます。 Ajax の古い構文と新しい構文

Ajax の概要

Ajax は「Asynchronous Javascript And XML」の略で、「非同期 JavaScript と XML」を意味します。ページをブロックせずにデータをやり取りすることは、Ajax の助けを借りて、Web ページを部分的に更新するだけでデータの表示を更新できるため、不必要なデータの量が削減され、ユーザー エクスペリエンスが大幅に向上します。 、ユーザーの待ち時間を短縮し、Web アプリケーションをより小さく、より速く、より使いやすくします

もちろん、上記は一般的なことであり、資格のある開発者としては基本的にこれらに精通しています。ここでは、それらについて簡単に説明します。 Ajax の詳細については、PHP 中国語 Web サイトを参照してください:

ネイティブ Ajax

基本的に、すべての最新のブラウザーはネイティブ Ajax の機能をサポートしています。以下で、ネイティブ

JS の使用方法を詳しく説明します。 Ajax リクエストを開始して処理するため

1. XMLHttpRequest オブジェクトを取得します

var xhr = new XMLHttpRequest(); // 获取浏览器内置的XMLHttpRequest对象

プロジェクト アプリケーションが IE の下位バージョンを考慮していない場合は、すべての最新のブラウザ (Firefox、Chrome、Safari、Opera) で上記の方法を直接使用できます。すべてに XMLHttpRequest オブジェクトが組み込まれています。古いバージョンの IE (IE5、IE6) と互換性を持たせる必要がある場合は、ActiveX オブジェクトを使用できます:

var xhr;

if (window.XMLHttpRequest) {
    xhr=new XMLHttpRequest();
} else if (window.ActiveXObject) {    // 兼容老版本浏览器
    xhr=new ActiveXObject("Microsoft.XMLHTTP");
}

2. パラメータの設定

XMLHttpRequest オブジェクトでは、設定する必要もあります。一部のリクエスト パラメーター情報を使用してデータのやり取りを完了するには、open メソッドを使用します。

var xhr;

if (window.XMLHttpRequest) {
    xhr=new XMLHttpRequest();
} else if (window.ActiveXObject) {
    xhr=new ActiveXObject("Microsoft.XMLHTTP");
}

if (xhr) {
    xhr.open('GET', '/test/', true); // 以GET请求的方式向'/test/'路径发送异步请求
}

open メソッドは、新しい http リクエストを作成します。最初のパラメーターはリクエスト メソッド (通常は 'GET' または 'POST') です。はリクエストの URL で、3 番目のパラメータは非同期かどうかで、デフォルトは true です

3. リクエストを送信します

基本的なパラメータ情報を設定した後、send メソッドを直接呼び出してリクエストを送信します。以下:

var xhr;

if (window.XMLHttpRequest) {
    xhr=new XMLHttpRequest();
} else if (window.ActiveXObject) {
    xhr=new ActiveXObject("Microsoft.XMLHTTP");
}

if (xhr) {
    xhr.open('GET', '/test/', true); 
    xhr.send(); // 调用send方法发送请求
}

ここで必須 GET メソッドを使用してパラメータを渡す場合、POST メソッドを使用する場合は '/test/?name=luozh&size=12' のようにパラメータを URL の直後に置くことができることに注意してください。次に、パラメーターを send メソッドに次のように記述する必要があります。 :

xhr.open('POST', '/test/', true);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); // 将请求头设置为表单方式提交
xhr.send('name=luozh&size=12');

最終的にはフォーム データの形式で配信されます:

リクエスト ヘッダーが設定されていない場合、ネイティブ Ajax はContent-Type がデフォルトで 'text/plain; charset=UTF-8' の場合、上記のパラメータ記述形式によれば、最終的な送信形式は次のとおりです:

明らかに、これは、

xhr.open('POST', '/test/', true);
xhr.send(JSON.stringify({name: 'luozh', size: 12}));

最終的な送信形式は次のとおりです:

このように、処理のために JSON

string をバックグラウンドに直接渡すことができます。 もちろん、バックグラウンドを設定することもできます。それに応じて。

4. ステータスの監視

Ajaxリクエストを送信した後、サーバーから返されるステータスを監視し、それに応じて処理する必要があります。ここではonreadystatechangeメソッドを使用する必要があり、コードは次のとおりです:

var xhr;

if (window.XMLHttpRequest) {
    xhr=new XMLHttpRequest();
} else if (window.ActiveXObject) {
    xhr=new ActiveXObject("Microsoft.XMLHTTP");
}

if (xhr) {
    xhr.open('GET', '/test/', true);     // 以GET请求的方式向'/test/'路径发送异步请求
    xhr.send();
    xhr.onreadystatechange = function () {    // 利用onreadystatechange监测状态
        if (xhr.readyState === 4) {    // readyState为4表示请求响应完成
            if (xhr.status === 200) {    // status为200表示请求成功
                console.log('执行成功');
            } else {
                console.log('执行出错');
            }   
        }
    }
}

上記では使用しています。 onreadystatechange を使用してステータスを監視し、内部的には、readyState を使用して現在の状態を取得します。 readyState には合計 5 つの段階があり、4 の場合、応答内容が解析され、クライアントで呼び出すことができることを意味します。 readyState が 4 の場合、ステータスを通じて

ステータス コード を取得します。ステータス コードが 200 の場合は成功コードが実行され、それ以外の場合はエラー コードが実行されます。

もちろん、onload を使用して、onreadystatechange が 4 に等しい状況を置き換えることもできます。onload は状態が 4 の場合にのみ呼び出されるためです。コードは次のとおりです:

xhr.onload = function () {    // 调用onload
    if (xhr.status === 200) {    // status为200表示请求成功
        console.log('执行成功');
    } else {
        console.log('执行出错');
    }   
}

ただし、IE はサポートされていないことに注意してください。 onload 属性

はフレンドリーではありません。 onload に加えて、

    onloadstart
  • onprogress
  • onabort
  • ontimeout
  • onerror
  • もあります。

  • ロードエンド

  等事件,有兴趣的同学可以亲自去实践它们的用处。

  以上便是原生Ajax请求数据的常见代码。

 其他库框架中的Ajax

  1.jQuery中的Ajax

  jQuery作为一个使用人数最多的库,其Ajax很好的封装了原生Ajax的代码,在兼容性和易用性方面都做了很大的提高,让Ajax的调用变得非常简单。下面便是一段简单的jQuery的Ajax代码:

$.ajax({
    method: 'GET', // 1.9.0本版前用'type'
    url: "/test/",
    dataType: 'json'
})
.done(function() {
    console.log('执行成功');
})
.fail(function() {
    console.log('执行出错');
})

  与原生Ajax不同的是,jQuery中默认的Content-type是'application/x-www-form-urlencoded; charset=UTF-8', 想了解更多的jQuery Ajax的信息可以移步官方文档:http://api.jquery.com/jquery.ajax

  2.Vue.js中的Ajax

  Vue.js作为目前热门的前端框架,其实其本身并不包含Ajax功能,而是通过插件的形式额外需要在项目中引用,其官方推荐Ajax插件为vue-resource,下面便是vue-resource的请求代码:

Vue.http.get('/test/').then((response) => {
    console.log('执行成功');
}, (response) => {
    console.log('执行出错');
});

  vue-resource支持Promise API,同时支持目前的Firefox, Chrome, Safari, Opera 和 IE9+浏览器,在浏览器兼容性上不兼容IE8,毕竟Vue本身也不兼容IE8。想了解更多的vue-resource的信息可以移步github文档:https://github.com/vuejs/vue-resource

  3.Angular.js中的Ajax

  这里Angular.js中的Ajax主要指Angular的1.×版本,因为Angular2目前还不建议在生产环境中使用。

var myApp = angular.module('myApp',[]);

var myCtrl = myApp.controller('myCtrl',['$scope','$http',function($scope, $http){
    $http({
        method: 'GET',
        url: '/test/',
        headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}  
    }).success(function (data) {
        console.log('执行成功');
    }).error(function () {
        console.log('执行出错');
    });
}]);

  在Angular中,我们需要在控制器上注册一个$http的事件,然后才能在内部执行Ajax。Angular的Ajax默认的Content-type是'application/json;charset=UTF-8',所以如果想用表单的方式提交还需设置下headers属性。想了解更多的Angular Ajax的信息可以移步官方文档:https://docs.angularjs.org/api/ng/service/$http(可能需要翻墙)更多精彩内容关注微信公众号:全栈开发者中心(admin10000_com)

  4.React中的Ajax

  在React中我比较推荐使用fetch来请求数据,当然其不仅适用于React,在任何一种框架如上面的Vue、Angular中都可以使用,因为其已经被目前主流浏览器所支持,至于其主要功能和用法,我在下面会做下讲解。

 Fetch API

  Fetch API 是基于 Promise 设计,由于Promise的浏览器兼容性问题及Fetch API本身的兼容问题,一些浏览器暂时不支持Fetch API,浏览器兼容图如下:

  当然我们可以通过使用一些插件来解决兼容性问题,比如:fetch-polyfill、es6-promise、fetch-ie8等。

  使用Fetch我们可以非常便捷的编写Ajax请求,我们用原生的XMLHttpRequst对象和Fetch来比较一下:

  XMLHttpRequst API

// XMLHttpRequst API
var xhr = new XMLHttpRequest();
xhr.open('GET', '/test/', true);

xhr.onload = function() {
    console.log('执行成功');
};

xhr.onerror = function() {
    console.log('执行出错');
};

xhr.send();

  Fetch API

fetch('/test/').then(function(response) {
    return response.json();
}).then(function(data) {
    console.log('执行成功');
}).catch(function(e) {
    console.log('执行出错');
});

  可以看出使用Fetch后我们的代码更加简洁和语义化,链式调用的方式也使其更加流畅和清晰。随着浏览器内核的不断完善,今后的XMLHttpRequest会逐渐被Fetch替代。关于Fetch的详细介绍可以移步:https://segmentfault.com/a/1190000003810652

 跨域Ajax

  介绍了各种各样的Ajax API,我们不能避免的一个重要问题就是跨域,这里重点讲解下Ajax跨域的处理方式。

  处理Ajax跨域问题主要有以下4种方式:

  1. 利用iframe

  2. 利用JSONP

  3. 利用代理

  4. 利用HTML5提供的XMLHttpRequest Level2

  第1和第2种方式大家应该都非常熟悉,都属于前端的活,这里就不做介绍了,这里主要介绍第3和第4种方式。

  利用代理的方式可以这样理解:

通过在同域名下的web服务器端创建一个代理:
北京服务器(域名:www.beijing.com)
上海服务器(域名:www.shanghai.com)
比如在北京的web服务器的后台(www.beijing.com/proxy-shanghaiservice.php)来调用上海服务器(www.shanghai.com/services.php)的服务,然后再把访问结果返回给前端,这样前端调用北京同域名的服务就和调用上海的服务效果相同了。

  利用XMLHttpRequest Level2的方式需要后台将请求头进行相应配置:

// php语法
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET,POST');

  以上的*号可以替换成允许访问的域名,*表示所有域名都可以访问。

3番目と4番目のメソッドは主にバックグラウンド作業であり、フロントエンドはそれを呼び出すだけでよいことがわかります。

概要

Ajax の構文がどれほど多様であっても、ライブラリやフレームワークが Ajax をどのようにカプセル化しても、Ajax は非同期データ対話を実現するためのツールにすぎません。ネイティブ JS での Ajax の実装原理を理解し、理解する必要があるだけです。 XMLHttpRequest、Promise、およびプロセスの概念を活用すれば、非同期データ対話の時代を簡単に乗り切ることができます。

以上がAjax 構文の簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。