以前写的一个AJAX跨域,现在不明白当时怎么实现回调的

时间:2022-08-28 16:06:11
以前写的AJAX跨域
网页运行的时候  某个按钮点击的时候 到远端的一个服务器去进行了一个合法性校验,
返回的时候运行回调函数   最近翻出来想不明白为什么能执行这个回调函数了
点击按钮的时候传卡号进去执行下面的方法

function getblack(str){
    var scriptTag = document.getElementById("checkcard"); 
    var oHead = document.getElementsByTagName('head').item(0); 
    if(scriptTag){oHead.removeChild(scriptTag)}; 
    var s = document.createElement("SCRIPT");
    s.id="checkcard";
    document.getElementsByTagName("HEAD")[0].appendChild(s);
    var rnd=new Date().getTime();
    s.src="http://192.168.1.1:8089/check/black.htm?cardid="+str+"&rnd="+rnd;}


服务端是这样处理的

public ModelAndView blackHandler(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String cardid =             ServletRequestUtils.getRequiredStringParameter(request,"cardid");
 response.addHeader("P3P","CP=CAO PSA OUR");
 response.setContentType("text/javascript");
     response.setHeader("Content-Type", "text/javascript; charset=UTF-8");
String sql = "SELECT * FROM BlackCardList where  cardid=" + cardid;
PrintWriter out = response.getWriter();
blacks = webDAO.findBlacklistinvoicenos(sql);
if (blacks != null && blacks.size() > 0) {
out.write("visitCountCallBack({\"isblack\":true});");
}
        else{
         out.write("visitCountCallBack({\"isblack\":false});");
        }
out.close();
return null;

}



后台相应后,前台会执行下面的方法


function visitCountCallBack(data){
document.getElementsByTagName("HEAD")[0].removeChild(document.getElementById("checkcard")); 
    for(var i in data){
        var isblack=data[i];//action中out.write的data
if(isblack=="false"||isblack==false){
//不是黑卡显示余额,继续操作

}else{
document.getElementById("message").innerHTML="<span  style='color:#FF0000'>黑卡</span>";
}
    }
}



当时跨域是借助了<script src> 只跨域的属性实现的

但是为什么能够自动回调我这个visitCountCallBack名称的回调函数呢??

这几天看EXT中Ext.data.ScriptTagProxy 进行请求的时候,和new Ext.data.HttpProxy
有一个区别就是 
ScriptTagProxy 跨域请求有一个参数callback:stcCallback1001
后台返回的时候必须要"stcCallback1001"+"("+json+")"

7 个解决方案

#1


会不会是getblack在请求src的时候,后台把对应的字符串返回给前台,
类似于内联一样的 代码字啊这个位置展开了
等于就是
getblack(str){
//内联展开了
visitCountCallBack(boolean isblack);
}

#2


引用 1 楼 kentxp 的回复:
会不会是getblack在请求src的时候,后台把对应的字符串返回给前台,
类似于内联一样的 代码字啊这个位置展开了
等于就是
getblack(str){
//内联展开了
visitCountCallBack(boolean isblack);
}

对头,就是相当于新加载了一个js
包含
如下
visitCountCallBack({isblack:true});
或者
visitCountCallBack({isblack:false});

#3


就是加载一个js文件而已了【script加载文件没有跨域只说,不同ajax请求不同域的页面会出现跨域问题】,src可以为动态页也可以为一个js文件,为动态页输出的内容要符合js语法

#4


远端callback q请求就

#5


这不是跨域。

你只是加载了一段js代码到当前页面中

#6


引用 5 楼 zhang_7150 的回复:
这不是跨域。

你只是加载了一段js代码到当前页面中


同意,也与 AJAX 好像没关系。只是动态加入 <script> 当然可以“跨域”调用js. 

题目有些让人误解。


不明白你的问题。你可以修改服务器侧的话。调用什么 callback 都是可能的。

#7


搜一下jquery jsonp的跨域原理就明白了

#1


会不会是getblack在请求src的时候,后台把对应的字符串返回给前台,
类似于内联一样的 代码字啊这个位置展开了
等于就是
getblack(str){
//内联展开了
visitCountCallBack(boolean isblack);
}

#2


引用 1 楼 kentxp 的回复:
会不会是getblack在请求src的时候,后台把对应的字符串返回给前台,
类似于内联一样的 代码字啊这个位置展开了
等于就是
getblack(str){
//内联展开了
visitCountCallBack(boolean isblack);
}

对头,就是相当于新加载了一个js
包含
如下
visitCountCallBack({isblack:true});
或者
visitCountCallBack({isblack:false});

#3


就是加载一个js文件而已了【script加载文件没有跨域只说,不同ajax请求不同域的页面会出现跨域问题】,src可以为动态页也可以为一个js文件,为动态页输出的内容要符合js语法

#4


远端callback q请求就

#5


这不是跨域。

你只是加载了一段js代码到当前页面中

#6


引用 5 楼 zhang_7150 的回复:
这不是跨域。

你只是加载了一段js代码到当前页面中


同意,也与 AJAX 好像没关系。只是动态加入 <script> 当然可以“跨域”调用js. 

题目有些让人误解。


不明白你的问题。你可以修改服务器侧的话。调用什么 callback 都是可能的。

#7


搜一下jquery jsonp的跨域原理就明白了