Garray

博客园 首页 新随笔 联系 订阅 管理

 

由于xMLHttpRequest的局限性,使其不能跨域去请求,而页面中引用的js和css,甚至是iframe则不存在跨域的问题

利用这一特性:页面在处理跨域请求的时候,共衍生出一下两种形式,jsonp和隐藏iframe。

jsonp形式,使用方便,用get方式传输,传输的数据量有限

隐藏iframe形式,会出现返回延时的现象(在iframe的数据未完全加载时,主页面的js已经执行)

1.jsonp的后台action中处理方式:

public void jsonpMethod (){
        PrintWriter out=null;

        try{
                jsonmap = new HashMap();
                jsonmap.put("successed", true);
                String callBack = ""+ callback +"("+ JSONUtil.serialize(jsonmap) +")";
                response.setCharacterEncoding("utf-8");
                response.setContentType("text/javascript;charset=utf-8");
                response.setHeader("Cache-Control", "no-cache");
                out = response.getWriter();
                out.write(callBack);
        } catch (Exception e) {
            throwException(e);   
        }
    }

 

备注:callback 属于前台传来的参数

jsonp的前台调用形式

var url=http://log.coa.sgcc.com.cn:8006/coa-webapp/json/jsonpMethod .action

jQuery.ajax({
                type : "get",  //获取形式
                url : url,        //请求url
                dataType : "jsonp",     //标明是jsonp的形式
                jsonpCallback:"callback",   
                async : false,
                cache : false,
                data: {querycond:querycond},  //条件
                success : function(json) {
                 alert(json.list[0].unitName)
                }
            })

 

2.隐藏iframe形式:

在主页面中嵌套iframe,而iframe可以为其他域名,待iframe返回数据后,通过回调函数执行主页面中的处理。其中嵌套iframe是放在其他域名的服务器上

<html>
<head>
<script type="text/javascript" >

//获取Solr服务器上的数据

function getSolrXml(data){
          var url="http://search.sgcc.com.cn:8088/searcher/SearcherSelectServlet/select";
           jQuery.ajax({
                      type: "post",
                      url: url, 
                      data: encodeURIComponent(data.queryService) ,
                      async: true,
                      cache: false,
                      timeout: 60000,
                      success: function(resp){
                                       parent.displayXmlToPage(resp)  //回调主页面的函数
                      }
    })
}

</script>
</head>
<body onload="parent.isChildLoaded = true;">测试solr</body>
</html>

 

主页面:

<html>
<head>
<script type="text/javascript" >

var isChildLoaded=false;

//对获取的数据进行展现

displayXmlToPage(resp){

//处理函数

}

if(isChildLoaded){

   getSolrXml(data);//执行iframe的上的函数

}else{

   setTimeOut(getSolrXml,50);

}

</script>
</head>
<body >

<iframe1 src="${solrSearchURL}/searcher/solr.jsp "  id="solrIframe"  style="display:none"></iframe1 >

备注:此处写iframe1是为了防止博客园自动转换成iframe。

</body>
</html>

 

此处需要注意的问题以及解决方案:由于js在浏览器中的执行顺序,  solr.jsp 并么有加载,上面的getSolrXml(data)已经执行,页面则会报js的错误

解决方案: 1,鉴于页面的加载顺序,将iframe尽量放在页面的最上端,js函数放在最后执行

             2,在引用js时尽量使用ref延缓执行,但可能存在浏览器的兼容性问题

             3,在主页面上判断iframe是否加载成功,如果加载成功则执行,如果没有加载成功则延时再去判断

posted on 2014-04-08 18:55  Garray  阅读(198)  评论(0编辑  收藏  举报