原生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 相关文章推荐
jquery 新手学习常见问题解决方法
Apr 18 Javascript
js中parseInt函数浅谈
Jul 31 Javascript
javascript函数重载解决方案分享
Feb 19 Javascript
javascript委托(Delegate)blur和focus用法实例分析
May 26 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
Jan 04 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
Jan 28 Javascript
JS判断一个数是否是水仙花数
Jun 11 Javascript
使用mint-ui开发项目的一些心得(分享)
Sep 07 Javascript
Node实战之不同环境下配置文件使用教程
Jan 02 Javascript
详解webpack4多入口、多页面项目构建案例
May 25 Javascript
详解基于vue-cli3.0如何构建功能完善的前端架子
Oct 09 Javascript
jquery实现垂直手风琴导航栏
Feb 18 jQuery
基于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 zend 相对路径问题
2009/01/12 PHP
php批量上传的实现代码
2013/06/09 PHP
10个简化PHP开发的工具
2014/12/25 PHP
使用PHPCMS搭建wap手机网站
2015/09/20 PHP
php封装好的人民币数值转中文大写类
2015/12/20 PHP
window.location.hash 属性使用说明
2010/03/20 Javascript
基于jquery的一个浮动框(扩展性比较好 )
2010/08/27 Javascript
jcarousellite.js 基于Jquery的图片无缝滚动插件
2010/12/30 Javascript
使用apply方法处理数组的三个技巧[译]
2012/09/20 Javascript
javascript设计模式之中介者模式Mediator
2014/12/30 Javascript
JavaScript获取function所有参数名的方法
2015/10/30 Javascript
jQuery插件实现多级联动菜单效果
2015/12/01 Javascript
理解javascript封装
2016/02/23 Javascript
浅析JS原型继承与类的继承
2016/04/07 Javascript
jquery自定义插件开发之window的实现过程
2016/05/06 Javascript
javascript数组常用方法汇总
2016/09/10 Javascript
不使用 JS 匿名函数理由
2017/11/17 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
Angular5中调用第三方js插件的方法
2018/02/26 Javascript
基于webpack4搭建的react项目框架的方法
2018/06/30 Javascript
vue-cli2打包前和打包后的css前缀不一致的问题解决
2018/08/24 Javascript
微信小程序实现发送验证码按钮效果
2018/12/20 Javascript
Vue.js实现开发购物车功能的方法详解
2019/02/22 Javascript
python实现发送邮件功能
2017/07/22 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
2017/12/12 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
2018/06/14 Python
使用PM2+nginx部署python项目的方法示例
2018/11/07 Python
python hbase读取数据发送kafka的方法
2018/12/27 Python
python处理document文档保留原样式
2019/09/23 Python
Python数据可视化常用4大绘图库原理详解
2020/10/23 Python
Python项目打包成二进制的方法
2020/12/30 Python
Rowdy Gentleman服装和配饰:美好时光
2019/09/24 全球购物
自我鉴定四大框架
2014/01/17 职场文书
《再见了,亲人》教学反思
2014/02/26 职场文书
最美乡村医生事迹材料
2014/06/02 职场文书
2014年酒店服务员工作总结
2014/12/08 职场文书