原生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 replace正则表达式应用案例讲解
Jan 17 Javascript
基于javascript实现彩票随机数生成(升级版)
Apr 17 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
Feb 16 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
May 15 Javascript
JS实现Ajax的方法分析
Dec 20 Javascript
CSS3结合jQuery实现动画效果及回调函数的实例
Dec 27 jQuery
js实现前面自动补全位数的方法
Oct 10 Javascript
深入理解Angularjs 脏值检测
Oct 12 Javascript
layui checkbox默认选中,获取选中值,清空所有选中项的例子
Sep 02 Javascript
使用vscode快速建立vue模板过程详解
Oct 10 Javascript
详解jQuery中的prop()使用方法
Jan 05 jQuery
Vue实现点击当前行变色
Dec 14 Vue.js
基于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 事务处理数据实现代码
2010/05/13 PHP
php学习之流程控制实现代码
2011/06/09 PHP
php数组函数序列之array_unique() - 去除数组中重复的元素值
2011/10/29 PHP
了解PHP的返回引用和局部静态变量
2015/06/04 PHP
php设置页面超时时间解决方法
2015/09/22 PHP
ThinkPHP实现更新数据实例详解(demo)
2016/06/29 PHP
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
2013/01/24 Javascript
html的DOM中Event对象onabort事件用法实例
2015/01/21 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
2015/06/11 Javascript
js return返回多个值,通过对象的属性访问方法
2017/02/21 Javascript
vuejs响应用户事件(如点击事件)
2017/03/14 Javascript
原生JS发送异步数据请求
2017/06/08 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
2017/07/14 Javascript
微信小程序实现页面跳转传值的方法
2017/10/12 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
layui 地区三级联动 form select 渲染的实例
2019/09/27 Javascript
Vue使用axios引起的后台session不同操作
2020/08/14 Javascript
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
Python新手们容易犯的几个错误总结
2017/04/01 Python
Python常见加密模块用法分析【MD5,sha,crypt模块】
2017/05/24 Python
python下setuptools的安装详解及No module named setuptools的解决方法
2017/07/06 Python
python数据结构之列表和元组的详解
2017/09/23 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
2018/02/08 Python
Django数据库连接丢失问题的解决方法
2018/12/29 Python
python 实现dict转json并保存文件
2019/12/05 Python
Django的CVB实例详解
2020/02/10 Python
如何实现一个python函数装饰器(Decorator)
2020/10/12 Python
Kent & Curwen:与大卫·贝克汉姆合作
2017/06/13 全球购物
Zadig&Voltaire官网:法国时装品牌
2018/01/05 全球购物
运动会方阵解说词
2014/02/12 职场文书
如何写自我评价?自我评价写什么好?
2014/03/14 职场文书
房屋买卖协议书范本
2014/04/10 职场文书
《音乐之都维也纳》教学反思
2014/04/16 职场文书
初中生300字旷课检讨书
2014/11/19 职场文书
详解Vue的列表渲染
2021/11/20 Vue.js
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL