이 글에서 공유한 내용은 Mockjs의 원칙에 대한 소개입니다. 필요한 친구들이 참고할 수 있습니다. 백엔드는 데이터 형식을 제공하고 프런트엔드는 시뮬레이션된 인터페이스를 통해 데이터를 반환하여 페이지를 렌더링합니다. 한동안 이 플러그인이 Ajax 요청을 차단했는지 궁금했습니다. . 온라인으로 검색한 결과 정보가 매우 적고 성공하지 못한 것으로 나타났습니다. 그러던 어느 날 문득 생각이 들었습니다. ajax 메서드 요청을 다시 작성하면 요청을 보내기 전에 콜백을 제공하면 이 기능을 구현할 수 있지 않을까요?
환경 준비
$.ajax
$.ajax
需要解决的问题主要有
$.ajax
即将被改写,所以要自己实现一个发送请求的xhr方法(又懒得写封装的ajax方法,于是把$.ajax
缓存起来,以待后用)
如何去匹配将被拦截的请求地址
拦截了请求之后,如何把预先准备好的数据当做请求成功后的数据
代码实现
let Mock = { // 存储匹配规则 rules: new Map(), // 缓存ajax方法 ajax: $.ajax, mock(url, data) { this.rules.set(url, data) } }// 改写ajax方法$.ajax = function(options) { Mock.ajax({ url: options.url, beforeSend(XHR) { let data = Mock.rules.get(options.url) // 找到规则拦截请求,并执行回调(return false时会拦截请求) data && options.success(data) return !data }, success(data) { // 找不到规则,正常发送请求 options.success(data) } }) }// 测试Mock.mock('/a', { a: 1, b: 2}) $.ajax({ url: '/a', success(data) { console.log(data, 1) } }) $.ajax({ url: '/b', success(data) { console.log(data, 2) } })
功能检测
以上代码可直接拷贝至控制栏运行,我们可以看到只发送了b请求,a请求被拦截了下来,同时我们也能拿到所预期的数据
至于Mockjs随机数据的功能,我们暂不考虑
之后我也粗略看了下Mockjs源码,它也是改写了jquery和zepto的$.ajax
$.ajax
가 곧 다시 작성될 예정이므로 요청을 보내는 xhr 메서드를 직접 구현해야 합니다. (캡슐화된 ajax 메서드를 작성하기에는 너무 게으른 관계로 캐시합니다. $.ajax
추후 사용)
var Ajax={ get: function(url, fn) { var xhr = new XMLHttpRequest(); // XMLHttpRequest对象用于在后台与服务器交换数据 xhr.open('GET', url, true); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200 || xhr.status == 304) { // readyState == 4说明请求已完成 fn.call(this, xhr.responseText); //从服务器获得数据 } }; xhr.send(); }, post: function (url, data, fn) { // datat应为'a=a1&b=b1'这种字符串格式,在jq里如果data为对象会自动将对象转成这种字符串格式 var xhr = new XMLHttpRequest(); xhr.open("POST", url, true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); // 添加http头,发送信息至服务器时内容编码类型 xhr.onreadystatechange = function() { if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 304)) { // 304未修改 fn.call(this, xhr.responseText); } }; xhr.send(data); } }🎜🎜 🎜기능 감지🎜🎜🎜🎜🎜🎜위 코드를 컨트롤바에 직접 복사해서 실행하면 되는 것을 알 수 있습니다. 요청이 차단되는 동시에 예상되는 데이터도 얻을 수 있습니다🎜🎜🎜🎜 Mockjs 임의 데이터의 기능에 관해서는 지금은 고려하지 않겠습니다🎜🎜🎜🎜🎜요약🎜🎜🎜🎜이후 즉, jquery 및 zepto Implemented의
$.ajax
메서드도 다시 작성한 Mockjs 소스 코드를 대략적으로 살펴보았는데, 이는 네이티브 js로 ajax 메서드를 캡슐화하면 이를 수행할 수 없음을 의미합니다. 다음은 네이티브 js의 ajax 메서드입니다. 관심이 있으시면 직접 확인해 보세요. 🎜rrreee🎜🎜🎜🎜🎜위 내용은 Mockjs의 원리 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!