网页运行的时候 某个按钮点击的时候 到远端的一个服务器去进行了一个合法性校验,
返回的时候运行回调函数 最近翻出来想不明白为什么能执行这个回调函数了
点击按钮的时候传卡号进去执行下面的方法
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);
}
类似于内联一样的 代码字啊这个位置展开了
等于就是
getblack(str){
//内联展开了
visitCountCallBack(boolean isblack);
}
#2
对头,就是相当于新加载了一个js
包含
如下
visitCountCallBack({isblack:true});
或者
visitCountCallBack({isblack:false});
#3
就是加载一个js文件而已了【script加载文件没有跨域只说,不同ajax请求不同域的页面会出现跨域问题】,src可以为动态页也可以为一个js文件,为动态页输出的内容要符合js语法
#4
远端callback q请求就
#5
这不是跨域。
你只是加载了一段js代码到当前页面中
你只是加载了一段js代码到当前页面中
#6
同意,也与 AJAX 好像没关系。只是动态加入 <script> 当然可以“跨域”调用js.
题目有些让人误解。
不明白你的问题。你可以修改服务器侧的话。调用什么 callback 都是可能的。
#7
搜一下jquery jsonp的跨域原理就明白了
#1
会不会是getblack在请求src的时候,后台把对应的字符串返回给前台,
类似于内联一样的 代码字啊这个位置展开了
等于就是
getblack(str){
//内联展开了
visitCountCallBack(boolean isblack);
}
类似于内联一样的 代码字啊这个位置展开了
等于就是
getblack(str){
//内联展开了
visitCountCallBack(boolean isblack);
}
#2
对头,就是相当于新加载了一个js
包含
如下
visitCountCallBack({isblack:true});
或者
visitCountCallBack({isblack:false});
#3
就是加载一个js文件而已了【script加载文件没有跨域只说,不同ajax请求不同域的页面会出现跨域问题】,src可以为动态页也可以为一个js文件,为动态页输出的内容要符合js语法
#4
远端callback q请求就
#5
这不是跨域。
你只是加载了一段js代码到当前页面中
你只是加载了一段js代码到当前页面中
#6
同意,也与 AJAX 好像没关系。只是动态加入 <script> 当然可以“跨域”调用js.
题目有些让人误解。
不明白你的问题。你可以修改服务器侧的话。调用什么 callback 都是可能的。
#7
搜一下jquery jsonp的跨域原理就明白了