我們服務器上項目鏈接:
http://sk2shop.moxz.cn/
http://sk2shop.moxz.cn/index1.html
京東服務器鏈接:
http://wqs.jd.com/promote/third/sk2shop2
http://wqs.jd.com/promote/third/sk2shop2/index1.html
京東提供的接口如下:
http://wq.jd.com/activeapi/opensendcouponapi?biz=bizname&cert=xxxxxx&returl=xxxxxx
前端需要在請求的接口返回的鏈接中,獲取ret狀態值(根據不同的狀態值,提示不同的信息),及定義returl返回頁面;
遇到問題
1.跨域請求,jsonp問題;
$.ajax({
url:'src',
type:'get',
async : false,
dataType:'jsonp',
jsonpCallback:'jdcard',
success:jdcard
});
function jdcard(data){
var url;
if(data.code == 200){
url = data.url;
$.cookie("clicc","y");
location.href =url;
}
}
標紅的三項需特別注意:
a. asnyc:true(默認) 異步方式,當ajax發送請求後,兩個線程同時執行。
async:false; 同步執行。
b.當dataType:'jsonp',的情況下cache默認爲false,jquery1.2以上新功能。
cache的作用就是第一次請求完畢之後,如果再次去請求,可以直接從緩存裏面讀取而不是再到服務器端讀取。
c.jsonpCallback:'jsonCallback'(默認情況下這麼寫),jsonpCallback是實現跨域請求時定義回調函數用的。如果不涉及到跨域請求可以不寫。
jsonpCallback的值可以根據後臺傳的或者自定義的去寫,比如上邊寫的 jsonpCallback:'jdcard'
d.success方法是所有的請求都請求完畢後執行的。
2.請求完成後再次刷新頁面時,還是彈窗怎麼辦?
//此時頁面返回鏈接爲:http://sk2shop.moxz.cn/?ret=0&retmsg=oijewiofj
截取url,並獲取某個參數的方法(我們這技術大牛寫的,膩害):
var str = location.search, ret;
str=str.replace(/^\?/,'').split('&');
for (var i = str.length - 1; i >= 0; i--) {
if(str[i].match(/^ret/g)){
ret = str[0].split('=');
ret = ret[1];
break;
}
}
location.search是截取link鏈接後的拼接參數,如本鏈接爲:http://sk2shop.moxz.cn/?ret=0&retmsg=oijewiofj
那麼location.search後獲取的值爲:?ret=0&retmsg=oijewiofj
然後利用正則進行匹配。最後得到ret值。
if(location.href.indexOf("?") != -1){
$(".loading").hide();
if(ret == 0){
$(".coupon").html("領取成功(領取成功,請到京東賬戶內查看)");
}
}
因爲當前ret值已經存在,所以刷新頁面時會再執行一次彈窗方法,即使封裝在function裏也同樣會執行。
然。。研究半天,最後想出來了第一次請求時給個cookie值,每打開頁面時判斷cookie值是否存在。
想法有了,但實現也並非那麼容易。
接下來是苦b的探索過程。
最後找到個好方法,判斷頁面是否第一次打開,然後將cookie存儲起來:
var urlf=window.location.href;//獲取當前的URL
urlf=urlf.replace(/[^a-z0-9]/gi,"");//用正則清除字符串中的所有非字母和數字的內容
if($.cookie(urlf)=="" || $.cookie(urlf)==null){
alert("第一次找開");
$.cookie(urlf,"y");
}else{
alert("已經打開過");
$.cookie(urlf,"n");
}
這個活無比煎熬,因客戶總改需要,再加之跨域請求,上到京東服務器時,由於 兩個服務器之間調用,也存在一些問題。
端午節三天假,我兩天都在加班。