原生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中showModalDialog 的使用解析
Apr 17 Javascript
js图片延迟加载的实现方法及思路
Jul 22 Javascript
JS+DIV实现鼠标划过切换层效果的实例代码
Nov 26 Javascript
js判断页面中是否有指定控件的简单实例
Mar 04 Javascript
js超时调用setTimeout和间歇调用setInterval实例分析
Jan 28 Javascript
JavaScript 函数模式详解及示例
Sep 07 Javascript
JavaScript中Array的实用操作技巧分享
Sep 11 Javascript
AngularJs表单验证实例代码解析
Nov 29 Javascript
vue2项目使用sass的示例代码
Jun 28 Javascript
4个顶级JavaScript高级文本编辑器
Oct 10 Javascript
vue-cli4.x创建企业级项目的方法步骤
Jun 18 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
Jul 24 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
第一节--面向对象编程
2006/11/16 PHP
一贴学会PHP 新手入门教程
2009/08/03 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
php 一维数组的循环遍历实现代码
2017/04/10 PHP
详细解读php的命名空间(一)
2018/02/21 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
js下写一个事件队列操作函数
2010/07/19 Javascript
Javascript 判断是否存在函数的方法
2013/01/03 Javascript
用js获取电脑信息(是使用与IE浏览器)
2013/01/15 Javascript
JS实现下拉框的动态添加(附效果)
2013/04/03 Javascript
Jquery 模拟用户点击超链接或者按钮的方法
2013/10/25 Javascript
JavaScript实现的伸展收缩型菜单代码
2015/10/14 Javascript
jquery实现移动端点击图片查看大图特效
2020/09/11 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
2015/12/03 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
jQuery 3.0中存在问题及解决办法
2016/07/15 Javascript
使用微信小程序开发前端【快速入门】
2016/12/05 Javascript
Jquery获取radio选中的值
2017/05/05 jQuery
Angular 4根据组件名称动态创建出组件的方法教程
2017/11/01 Javascript
对vux点击事件的优化详解
2018/08/28 Javascript
ES6函数实现排它两种写法解析
2020/05/13 Javascript
vue项目中播放rtmp视频文件流的方法
2020/09/17 Javascript
vue3.0 的 Composition API 的使用示例
2020/10/26 Javascript
vue移动端下拉刷新和上滑加载
2020/10/27 Javascript
python中的计时器timeit的使用方法
2017/10/20 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
python 画条形图(柱状图)实例
2020/04/24 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
python读取excel数据并且画图的实现示例
2021/02/08 Python
用CSS3实现无限循环的无缝滚动的实例代码
2017/07/04 HTML / CSS
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
电大自我鉴定范文
2013/10/01 职场文书
会计助理岗位职责
2014/02/17 职场文书
百日安全活动总结
2014/05/04 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
2014年职称评定工作总结
2014/11/26 职场文书