zoukankan      html  css  js  c++  java
  • 解决ajax跨域的问题

    ajax跨域调用的解决办法有很多种,我这里只说两种:

    假设s.cnblogs.com是一个评论系统,只提供javascript方式的调用。news.cnblogs.com是一个新闻系统,这个系统将评论功能委托给s.cnblogs.com。这时news.cnblogs.com发表评论的代码可能是:

    function sendData(data,callback)

    {

    var xmlHttp=createXmlHttpRequest();

    xmlHttp.open('post','http://s.cnblogs.com/postHandler.ashx');

    xmlHttp.onreadystatechange=callback;

    xmlHttp.send(data);//data包含要发送的数据。

    }

    这代代码在IE6中会有一个安全提醒,但在IE7里面,直接会出错。因为跨域。

    第一种解决方案:document.domain.

    1.将sendData代码存进一个services.htm文件中。并在services.htm中设置document.domain='cnblogs.com'

    2.将services.htm放到s.cnblogs.com网站根目录下面。

    3.在news.cnblogs.com提交评论的页面加上<iframe id='ajaxFrame' src='http://s.cnblogs.com/services.htm' width='0' height='0'></iframe>

    4.在news.cnblogs.com提交评论的页面加上

    function sendData(data,callback)

    {

         ajaxFrame.window.sendData(data,callback);

    }

    和document.domain='cnblogs.com';

    方案的缺点:

    只能解决跨子域的问题。

    方案2:动态script 法。

    1.在news.cnblogs.com提交评论的页面加上,<script id='ajaxProxy' src=''></script>

    function sendData(data,callback)

    {

         var proxy=document.getElementById('ajaxProxy');

         proxy.src='http://s.cnblogs.com/postHandler.ashx?data="+data;

         proxy.onreadystatechange=callback;

    }

    我个人更喜欢方案2,但方案的一个问题是callback可以做的事情太少,无法接收postHandler.ashx发回的所馈数据。

    不过,我觉得有一种变通的方案,那就是直接在postHandler.ashx中输出js,比如alert('ok');,但我测试了几次都没能成功能。感觉可能是我的RP问题。

  • 相关阅读:
    win10安装nodejs,修改全局依赖位置和环境变量配置
    JavaScript判断两个对象内容是否相等
    JS判断是否是数组
    Js判断值是否是NaN
    typeof方法重写(区分数组对象)
    JS实现图片懒加载
    输入url到展示页面过程发生了什么?
    html如何在服务端跑起来
    nuxt怎么打包
    如果scss引用了字体图标文件该怎么打包
  • 原文地址:https://www.cnblogs.com/bqrm/p/1269166.html
Copyright © 2011-2022 走看看