原生js的ajax和解决跨域的jsonp(实例讲解)


Posted in Javascript onOctober 16, 2017

最近慢慢感觉,学再多框架,库,都不如老老实实先把基础弄扎实了。

不说废话,先上一个用ajax请求下本地的一个.txt文件

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <script>
    window.onload =function(){
      var oBtn = document.getElementById('btn');

      oBtn.onclick = function(){
        //创建XHR对象
        var xhr = new XMLHttpRequest();

        //请求的方式,地址,是否异步
        xhr.open('get','test.txt',true);

        //请求的确定操作,初始化,相当于搜索时,敲击的回车
        xhr.send(null);

        //请求的readyState每变化一次就执行一次onreadystatechange函数
        //其中readyState表示的是:请求/响应过程的当前活动阶段
        //readyState有如下取值
        /*
        *  0:未初始化,尚未调用send()方法
        *  1: 启动
        *  2:发送
        *  3:接收
        *  4:完成
        */
        xhr.onreadystatechange =function(){
          if(xhr.readyState ==4){
            alert(xhr.responseText);
          }
        }
      };


    };
  </script>
</head>
<body>
<input type="button" id="btn" value="show">
</body>
</html>

执行效果如下,点击show就会通过ajax请求本地的.txt文件。

原生js的ajax和解决跨域的jsonp(实例讲解)

代码比较简单,加上注释,相信很容易就看得懂。

但是工作中我们经常会请求其他域下的资源(因为同源策略),这个时候就遇到了跨域(协议,端口,域名任何一个不同就算是跨域)。

解决跨域的一种常用办法就是jsonp,虽然他有局限性(只支持get请求),不过优点是兼容老式浏览器(不过现在好像很少有人在意老式浏览器了)。

jsonp的基本原理:就是通过动态创建script标签,script标签的src是没有跨域限制的。

接下来上一个类似百度搜索下拉的页面

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <style>
    *{
      margin: 0;
      padding: 0;
    }
    input{
      width:300px;
      height:30px;
      border:1px solid lightgray;
      margin-top: 150px;
      margin-left: 200px;
      padding-left: 5px;
    }
    ul{
      width:307px;
      list-style: none;
      margin-left: 200px;
      display: none;
    }
    li{
      height:30px;
      border: 1px solid lightgray;
      line-height: 30px;
      padding-left: 5px;
    }
  </style>
  <script>
    function callbackD(response){
      var oUl = document.getElementById('ulList');
      var html='';
      if(response.s.length !=0){
        oUl.style.display='block';
        for(var i = 0;i<response.s.length;i++){
          html+='<li>'+response.s[i]+'</li>'
        }
      }
      oUl.innerHTML = html;
    }
  </script>
  <script>
    window.onload = function(){
      //获取dom元素
      var oData = document.getElementById('inputSearch');
      var oUl = document.getElementById('ulList');

      //键盘按下后抬起触发事件(onkeyup)
      oData.onkeyup = function(){
        if(oData.value != ''){
          //创建标签(createElement)
          var script = document.createElement("script");
          //添加地址
          script.src='http://unionsug.baidu.com/su?wd='+this.value+'&p=3&cb=callbackD';
          //添加给body的(成为body包涵的孩子)
          document.body.appendChild(script);
        }else{
          oUl.style.display='none';
        }

      }

    };
  </script>
</head>
<body>
<input type="text" id="inputSearch">
<ul id="ulList">
  <li>123</li>
</ul>
</body>
</html>

执行效果如下:

原生js的ajax和解决跨域的jsonp(实例讲解)

代码也相对比较简单,加上代码的注释,一定很容易看懂,这就是解决跨域的一种常用办法,其他有反向代理,CORS啊等等,等我学好再整理出来。

以上这篇原生js的ajax和解决跨域的jsonp(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js中将URL中的参数提取出来作为对象的实现代码
Aug 16 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
Apr 12 Javascript
浅析javascript的间隔调用和延时调用
Nov 12 Javascript
JavaScript中Cookie操作实例
Jan 09 Javascript
jQuery实用技巧必备(下)
Nov 03 Javascript
原生javascript实现的ajax异步封装功能示例
Nov 03 Javascript
微信小程序实现滑动删除效果
May 19 Javascript
基于Bootstrap表单验证功能
Nov 17 Javascript
vue实现路由懒加载及组件懒加载的方式
Jun 11 Javascript
详解Vue3.0 前的 TypeScript 最佳入门实践
Jun 18 Javascript
js get和post请求实现代码解析
Feb 06 Javascript
node.js如何自定义实现一个EventEmitter
Jul 16 Javascript
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
Oct 16 #Javascript
Vue 2.0学习笔记之Vue中的computed属性
Oct 16 #Javascript
angular4中关于表单的校验示例
Oct 16 #Javascript
原生JS实现小小的音乐播放器
Oct 16 #Javascript
jQuery实现简单的回到顶部totop功能示例
Oct 16 #jQuery
老生常谈JavaScript面向对象基础与this指向问题
Oct 16 #Javascript
echarts饼图扇区添加点击事件的实例
Oct 16 #Javascript
You might like
PHP 计算代码执行耗时的代码修正网上普遍错误
2011/05/14 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
封装ThinkPHP的一个文件上传方法实例
2014/10/31 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
PHP安全之register_globals的on和off的区别
2020/07/23 PHP
javascript cookie解码函数(兼容ff)
2008/03/17 Javascript
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
2011/09/26 Javascript
JavaScript高级程序设计 阅读笔记(二十一) JavaScript中的XML
2012/09/14 Javascript
javascript的内存管理详解
2013/08/07 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
2014/06/06 Javascript
JavaScript中最简洁的编码html字符串的方法
2014/10/11 Javascript
asp知识整理笔记3(问答模式)
2015/09/27 Javascript
AngularJS基于provider实现全局变量的读取和赋值方法
2017/06/28 Javascript
nodejs后台集成ueditor富文本编辑器的实例
2017/07/11 NodeJs
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
vue使用axios时关于this的指向问题详解
2017/12/22 Javascript
jQuery层叠选择器用法实例分析
2019/06/28 jQuery
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
使用python绘制常用的图表
2016/08/27 Python
对python抓取需要登录网站数据的方法详解
2018/05/21 Python
查找python项目依赖并生成requirements.txt的方法
2018/07/10 Python
python for循环输入一个矩阵的实例
2018/11/14 Python
通过自学python能找到工作吗
2020/06/21 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
2020/07/01 Python
css 元素选择器的简单实例
2016/05/23 HTML / CSS
css3的focus-within选择器的使用
2020/05/11 HTML / CSS
Willer台湾:日本高速巴士/夜行巴士预约
2017/07/09 全球购物
洛杉矶健身中心女性专用运动服饰品牌:Marika
2018/05/09 全球购物
英国领先的大码时装品牌之一:Elvi
2018/08/26 全球购物
苹果台湾官网:Apple台湾
2019/01/05 全球购物
质量标语大全
2014/06/12 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
老人与海读书笔记
2015/06/26 职场文书
员工手册董事长致辞
2015/07/29 职场文书
2016大学生社会实践单位评语
2015/12/01 职场文书
2016年最美孝心少年事迹材料
2016/02/26 职场文书