原生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 相关文章推荐
javascript判断是手机还是电脑访问网页的简单实例分享
Jun 03 Javascript
jQuery中last()方法用法实例
Jan 06 Javascript
jquery事件preventDefault()方法用法实例
Jan 16 Javascript
javascript删除元素节点removeChild()用法实例
May 26 Javascript
javascript先序遍历DOM树的方法
Feb 27 Javascript
JavaScript程序中实现继承特性的方式总结
Jun 24 Javascript
关于JavaScript语句后面的分号问题
Dec 07 Javascript
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
Jan 04 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
Feb 22 Javascript
jQuery实现获取动态添加的标签对象示例
Jun 28 jQuery
新手简单了解vue
May 29 Javascript
jQuery创建折叠式菜单
Jun 15 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中删除数组的第一个元素和最后一个元素的函数
2015/03/07 PHP
laravel学习笔记之模型事件的几种用法示例
2017/08/15 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
jQuery实现鼠标滑过遮罩并高亮显示效果
2013/07/16 Javascript
jquery中对于批量deferred的处理方法
2014/01/22 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
JavaScript代码性能优化总结(推荐)
2016/05/16 Javascript
基于jQuery实现仿微博发布框字数提示
2016/07/27 Javascript
JavaScript利用正则表达式替换字符串中的内容
2016/12/12 Javascript
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
微信小程序和百度的语音识别接口详解
2019/05/06 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
Vue项目打包部署到iis服务器的配置方法
2019/10/14 Javascript
jquery实现购物车基本功能
2019/10/25 jQuery
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
[19:15]DK战队纪录片
2014/09/02 DOTA
Python的类实例属性访问规则探讨
2015/01/30 Python
Python多重继承的方法解析执行顺序实例分析
2018/05/26 Python
Python JSON格式数据的提取和保存的实现
2019/03/22 Python
Python OpenCV实现视频分帧
2019/06/01 Python
浅谈Python3中print函数的换行
2020/08/05 Python
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
Servlet都有哪些方法?主要作用是什么?
2014/03/04 面试题
建筑设计学生的自我评价
2014/01/16 职场文书
2014年机关植树节活动方案
2014/02/27 职场文书
优秀党员学习焦裕禄精神思想汇报范文
2014/09/10 职场文书
个人总结与自我评价
2014/09/18 职场文书
学校运动会广播稿
2014/10/11 职场文书
2015学校图书管理员工作总结
2015/05/11 职场文书
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL
关于JavaScript轮播图的实现
2021/11/20 Javascript
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers
详解Python+OpenCV进行基础的图像操作
2022/02/15 Python
Java练习之潜艇小游戏的实现
2022/03/16 Java/Android