原生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之appendChild、insertBefore和insertAfter使用说明
Dec 30 Javascript
jquery中eq和get的区别与使用方法
Apr 14 Javascript
JavaScript判断变量是否为undefined的两种写法区别
Dec 04 Javascript
html的DOM中document对象forms集合用法实例
Jan 21 Javascript
微信小程序 用户数据解密详细介绍
Jan 09 Javascript
Vue.js鼠标悬浮更换图片功能
May 17 Javascript
jQuery自定义多选下拉框效果
Jun 19 jQuery
js原生方法被覆盖,从新赋值原生的方法
Jan 02 Javascript
详解如何在vue项目中引入elementUI组件
Feb 11 Javascript
基于jQuery使用Ajax动态执行模糊查询功能
Jul 05 jQuery
解决Js先触发失去焦点事件再执行点击事件的问题
Aug 30 Javascript
微信小程序点击顶部导航栏切换样式代码实例
Nov 12 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
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
2014/05/07 PHP
yii实现创建验证码实例解析
2014/07/31 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
2016/05/16 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
点弹代码 点击页面任何位置都可以弹出页面效果代码
2012/09/17 Javascript
jQuery操作select下拉框的text值和value值的方法
2014/05/31 Javascript
javascript中this指向详解
2016/04/23 Javascript
jquery ezUI 双击行记录弹窗查看明细的实现方法
2016/06/01 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
js实现文字超出部分用省略号代替实例代码
2016/09/01 Javascript
js+css3实现旋转效果
2017/01/20 Javascript
Ionic3实现图片瀑布流布局
2017/08/09 Javascript
详解webpack性能优化——DLL
2017/10/20 Javascript
JavaScript实现数字前补“0”的五种方法示例
2019/01/03 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
2019/09/14 Javascript
js实现双色球效果
2020/08/02 Javascript
linecache模块加载和缓存文件内容详解
2018/01/11 Python
python 读取摄像头数据并保存的实例
2018/08/03 Python
超简单使用Python换脸实例
2019/03/27 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
2019/06/24 Python
解析Tensorflow之MNIST的使用
2020/06/30 Python
详解python算法常用技巧与内置库
2020/10/17 Python
移动端rem布局的两种实现方法
2018/01/03 HTML / CSS
html5 兼容IE6结构的实现代码
2012/05/14 HTML / CSS
Clarks英国官方网站:全球领军鞋履品牌
2016/11/26 全球购物
软件工程师岗位职责
2013/11/16 职场文书
通信生自我鉴定
2014/01/18 职场文书
医学检验专业自荐信
2014/09/18 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
应届毕业生求职信范文
2015/03/19 职场文书
实施意见格式范本
2015/06/05 职场文书
Spring实现内置监听器
2021/07/09 Java/Android