ajax(五)

什么是AJAX?提供用户体验,较少网络数据的传输量。

与服务器交换数据,不刷新整个页面?

  send要写在open的下面,send要写在最下面,不然会有BUG。

同源策略是浏览器的一种安全策略,所谓同源是指,域名,协议,端口完全相同。

 

1.  什么是跨域及跨域的两种形式。

        什么是跨域,跨域分为几种情况

        从a 站点的js 代码想去访问b 站点的资源,这个时候 就是跨域

     跨域是浏览器默认的一种安全策略行为。

2.         跨域的两种形式:

        第一种:a 站点 想访问b 站点的dom 元素


   domain可返回下载当前文档的服务器域名  

    document.domain


 我要保证不跨域

        就是我www.taobao.com 下面去请求一个页面,然后我在这个页面的通过js 去访问另外的一个站点的资源。我们必须保证协议,端口,域名完全匹配.访问这个页面www.taobao.com/day11/code/02corss.html,我在这个页面用iframe 去嵌入www.taobao.com/day11/code/03corss.html,不跨域,也就是说我在

www.taobao.com/day11/code/02corss.html,通过我的js 可以去访问www.taobao.com/day11/code/03corss.html的资源.


       我http://www.taobao.com/day11/code/01cross/04cross.html 访问一个页面。然后我在这个页面里面去嵌入另外一个页面,http://itcast.taobao.com/05cross.html, 现在跨域没有。能不能访问,不能访问,能不能解决,能解决,为什么能解决,因为主域名相同

         所以我们能解决:怎么解决:

         在每个页面添加一个js 代码声明,声明这个主域名

      1、顶级域名相同的可以通过domain.name来解决,即同时设置 domain.name = 顶级域名(如example.com)  document.domain="taobao.com";

跨域方案

 

       2、document.domain + iframe

3、window.name + iframe

4、location.hash + iframe

5、window.postMessage()

参考资料

http://rickgray.me/2015/09/03/solutions-to-cross-domain-in-browser.html

 

        第二种:在a 站点使用xmlHttpRequest 对象去访问b 站点的资源。

        原理如下:                      JSONP

我在a 站点想使用   xmlHttpRequest 发请求,浏览器是禁止的.我们使用jQuery 的是怎么做的

dataType:"jsonp"底层是使用script 标签发送请求,给服务端一个回调函数.


     原理:

跨域,所以我们不能访问.

    在jQuery 里面怎么处理,我们使用dataType:"jsonp"处理这个东西. 要知道原理,使用XMLHttpRequest 对象浏览器是禁止跨域访问的.


    我们在页面上面发送请求,点击超链接,表单提交,地址栏输入

    在页面上面发送请求

        <script src="">

        <link href="">

        <img src="">

    也是发送请求.

        我们之前script 标签要求服务端返回js,客户端浏览器按照js 的方式去解析

            link 标签 href 要求服务端返回css 样式。客户端浏览器按照css 的方式去解析

            img src 地址要求服务端返回一张图片   客户端按照图片的方式去解析.

//下面分别是两种发送参数和不发送参数的情况,都可以

 

     我刚刚使用

     $.ajax({

         url:"http://www.baidu.com"

     })

     这个方法底层使用XMLHttpRequest 对象

     现在是因为跨域了,浏览器对这个对象XMLHttpRequest 有限制。 不能访问.

     $.ajax({

              url:"http://www.baidu.com"

              dataType:"jsonp"

      })

      我们发现可以实现访问了,

底层是这样的?创建一个script 标签,srcipt.src="http://www.baidu.com/adsfadsf.php?callback="; //这个地址跟路径后缀没有任何关系

      //接下来是我要通过js 怎么去接收到服务端返回的数据的问题.

      srcipt.src="http://www.baidu.com/adsfadsf.php?callback=";

      发送请求,服务器返回数据,返回的数据浏览器默认是使用js 的方式去解析数据

      现在是我要通过javascript 代码去接收到服务端返回的数据.

      $.ajax({

          url:"http://www.baidu.com"

      })

      因为我是从www.taobao.com 下面获取到的一个页面

      因为去请求另外一个站点,

       $.ajax()

      底层使用的是XMLHttpRequest

      浏览器会有跨域限制

      所以dataType:jsonp   底层创建一个script 标签。 src="http://www.baidu.com/demo.php"

      而且浏览器不会禁止这个标签的跨域行为,

      现在我的跨域请求可以通过这个标签进行发送

      但是这个标签发送请求之后,服务器返回的数据,

      客户端浏览器直接使用js 去解析

      这个时候我的目的是想要得到服务端的数据。然后通过我自己写的js 代码去解析

      这个时候我就给服务端传递了一个callback 回调函数。

      服务端返回的是回调函执行的代码,并且把数据作为回调函数的参数传递过来的.

 

3.  跨域以及iframe标签

    frameborder="0"   

 

this.contentWindow.document=this.contentDocument,都是找到嵌入页面的document。


3. 跨域及iframe标签

 

<script>

function getInfo(obj){

alert(obj);

}

//这种方式,服务端必须返回json 格式的数据

window.οnlοad=function(){

var script=document.createElement("script");

script.src="https://sug.so.360.cn/suggest?callback=getInfo&encodein=utf-8&encodeout=utf-8&format=json&fields=word,obdata&word=ahaha";

document.body.appendChild(script);

}

</script>

    如果getInfo(){}这个函数写在wndow.onload那个函数里面的话,就成了那个函数的内部私有函数。浏览器一拿到数据就调getInfo,就调不到了。类似于下面那种,这样调不到

 

1.  获取天气查询案例

 有的接口默认给我们XML格式的

 加&output=json  会返回给json格式的我们


2.  获取天气查询案例

    var html = ...

 $("table").html(html);  把html放进这个table中   没有值的话是查询,返回内容


3.  接口返回的数据是这里是一个数组,数组里是一个对象,

 


这儿echo的双引号里再用双引号不行,得用单引号

echo "alert("haha")";   错的                  echo "alert('haha')";   对的


1.   瀑布流布局JQ的插件拓展

   匿名函数的自调用    匿名函数自调(function(){

})()       立即执行,只执行一次


固定用法(function($){

      $.fn.waterFall=function(){}

})(jQuery)

  $.fn是固定写法    传形参$进来,$的方法

jQuery是实参,它是上面引用的jQ文件里的jQuery对象。


2.  瀑布流里面

     图片获取需要时间,获取文档里图片的高度的时候,图片没加载出来,所以会出问题。而实际开发中,服务器传来的图片带有宽高。不同的图片会带有不同的宽高。


3. 瀑布流末尾的加个判断不发送请求。可以加个样式,在底下点击的时候如果没有数据了就移除样式,没有那个样式了就判断return。或者判断字的内容?


4.  获取每个小图片盒子的宽度

    var childrens=$item.children();//所有的小图片盒子

    var width=childrens.width();//注意这里,计算每个自盒子的宽度


动态的瀑布流获取数据

data.php

 file_get_contents()将一 将整个文件读入一个字符串

json_decode()接受一个 JSON 格式的字符串并且把它转换为 PHP 变量

json_encode()返回 value 值的 JSON 形式

array_slice()返回根据 offset 和 length 参数所指定的 array 数组中的一段序列。

  

8.  each(callback)

里面的this指的是DOM对象,要jQ对象的话用$(this)

可以使用return false来提前跳出循环

 

index是索引,dom是里面的每一个DOM对象。

 

跨域:

     从a 站点的js 代码想去访问b 站点的资源,这个时候 就是跨域

     跨域是浏览器默认的一种安全策略行为。


     跨域了有两种

        a 站点 想访问b 站点的dom 元素

             bj.itcast.cn  / gz.itcast.cn 下面的dom 元素

             这个我们是可以解决,什么主域名相同

             两个页面

             document.domain=itcast.cn

             http://www.itcast.cn  去访问 http://www.danei.com 下面的资源

             不允许访问的

        在a 站点使用xmlHttpRequest 对象去访问b 站点的资源.


             我在a 站点想使用   xmlHttpRequest 发请求,

             浏览器是禁止的.


             我们使用jQuery 的是怎么做的

             dataType:"jsonp"

             底层是使用script 标签发送请求,给服务端一个回调函数.

百度天气预报调用:

             使用模板去解析数据.

瀑布流:

跨域方案  http://rickgray.me/2015/09/03/solutions-to-cross-domain-in-browser.html 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值