javascript实现jsonp跨域访问

来源:互联网 发布:js获取指定网页内容 编辑:程序博客网 时间:2024/06/07 19:31

所谓的jsonp跨域访问,其实就是利用了script标签来发送请求,返回的数据为javascript代理,在返回的javascript代码中调用已经写好的javascript方法,传入需要的参数进行处理即可。

下面是项目中用到的跨域访问代码:

1、inc_footer.vm页面代码

<div id="common-footer"></div><script type="text/javascript">    $(function () {        loadFooterPage()    });    function pageCallback(data){        $("#common-footer").html(data);    }    function loadFooterPage() {        var script = document.createElement("script");        script.type = "text/javascript";        script.src = "${cfg.portalCtx}/common/footerpage";        document.body.appendChild(script);    }</script>
在这段代码中我定义了两个方法loadFooterPage和pageCallback,其中pageCallback方法有个参数data,其实就是跨域请求以后需要调用pageCallback返回并传入一个data参数。loadFooterPage方法只是为了动态创建script标签,并添加到body里面,当当前页面加载完成后才执行loadFooterPage方法,这样做的好处是不影响当前页面的加载。执行loadFooterPage方法后body里面就会多一个script,浏览器会解释执行script标签,去请求script指定的scr路径,执行成功以后返回的内容会被当作javascript执行。


2、controller处理请求后返回

return "common/inc_footer_page";

接着看我的返回页面部分

3、inc_footer_page.vm代码

pageCallback('<div>...</div>')
在我返回页面的只是像写javascript代码一样调用前面写好的pageCallback方法,并传入了参数,返回该页面给调用页时就会执行该调用语句,这样简单的跨域返回就实现了。

注:我用的是springmvc架构,模板引擎用的是velocity,上面的script的src请求路径当然是要过controller处理的,在controller只是作了数据查询等操作,然后return页面。

很多jsonp的文章都会提到一个callback参数,其实是封装的jsonp框架不知道你要调哪个函数来执行请求成功以后的操作,所以要传这个callback参数。上面的代码如果以callback参数来确定调哪个函数,可以改为如下形势

script.src = "${cfg.portalCtx}/common/footerpage?callback=pageCallback";
然后在controller中将这个参数放到model中(方便在页面中获取方法名)

model.addAttribute("callback",callback);
最后在inc_footer_page.vm中调用方法

$!{callback}('<div>...</div>')






0 0
原创粉丝点击