原生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 prototype 原型链
Mar 12 Javascript
JS设置cookie、读取cookie、删除cookie
Apr 17 Javascript
基于jQuery插件实现点击小图显示大图效果
May 11 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
Jul 10 Javascript
JavaScript实现通过select标签跳转网页的方法
Sep 29 Javascript
javascript  数组排序与对象排序的实例
Jul 17 Javascript
JS中跳出循环的示例代码
Sep 14 Javascript
基于express中路由规则及获取请求参数的方法
Mar 12 Javascript
详解swiper在vue中的应用(以3.0为例)
Sep 20 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
Aug 27 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
May 23 Javascript
vue3.0中setup使用(两种用法)
Dec 02 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 转义使用详解
2013/07/15 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
2014/06/25 PHP
php 解析xml 的四种方法详细介绍
2016/10/26 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
[JS源码]超长文章自动分页(客户端版)
2007/01/09 Javascript
JavaScript 不只是脚本
2007/05/30 Javascript
javascript类继承机制的原理分析
2009/09/12 Javascript
javascript window.confirm确认 取消对话框实现代码小结
2012/10/21 Javascript
JavaScript对HTML DOM使用EventListener进行操作
2015/10/21 Javascript
jQuery实现为LI列表前3行设置样式的方法【2种方法】
2016/09/04 Javascript
JavaScript 随机验证码的生成实例代码
2016/09/22 Javascript
JS验证input输入框(字母,数字,符号,中文)
2017/03/23 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
jQuery EasyUI tree增加搜索功能的实现方法
2017/04/27 jQuery
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
JS实现json对象数组按对象属性排序操作示例
2018/05/18 Javascript
js实现简单扫雷
2020/11/27 Javascript
vue3.0中setup使用(两种用法)
2020/12/02 Vue.js
Python enumerate索引迭代代码解析
2018/01/19 Python
python实现简易版计算器
2020/06/22 Python
对numpy中shape的深入理解
2018/06/15 Python
Python函数中不定长参数的写法
2019/02/13 Python
django实现类似触发器的功能
2019/11/15 Python
python 解决flask 图片在线浏览或者直接下载的问题
2020/01/09 Python
使用TensorFlow对图像进行随机旋转的实现示例
2020/01/20 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
2020/02/17 Python
Jupyter notebook运行Spark+Scala教程
2020/04/10 Python
初中生物教学反思
2014/01/10 职场文书
人力资源专员岗位职责
2014/01/30 职场文书
放飞蜻蜓反思
2014/02/05 职场文书
超市中秋节促销方案
2014/03/21 职场文书
标准单位租车协议书
2014/09/23 职场文书
工作能力自我评价2015
2015/03/05 职场文书
惹女朋友生气检讨书
2015/05/06 职场文书
蜗居观后感
2015/06/11 职场文书
电脑无法安装Windows 11怎么办?无法安装Win11的解决方法
2021/11/21 数码科技