使用script的src實(shí)現(xiàn)跨域和類似ajax效果
場景
假如有兩個(gè)域名不同的服務(wù)器, a.com和b.com, 在b.com/b_return_js.php這個(gè)接口里, 可以獲取一些數(shù)據(jù)。 當(dāng)然,假如是b.com的頁面里, 可以使用ajax, 直接請(qǐng)求這個(gè)接口, 但如果在a.com的頁面里如果請(qǐng)求呢。
b_return_js.php的接口代碼:
$a = array(
array('username'=>'tony', 'age'=>25),
array('username'=>'yimeng', 'age'=>23),
array('username'=>'ermeng', 'age'=>22),
array('username'=>'sanmeng', 'age'=>21),
);
shuffle($a);
echo 'var userdata = '.json_encode($a).';'; //一般如果是b.com的站內(nèi)請(qǐng)求就直接返回json_encode($a)了, 但如果要用src屬性實(shí)現(xiàn)跨域, 這里我們需要將該值賦給一個(gè)js變量, 保證在script標(biāo)簽加載后的頁面里能獲取到這個(gè)數(shù)據(jù)并使用。
簡單實(shí)現(xiàn)
有一種簡單的方法就是在a.com下的頁面里, 直接
<script src=">
這樣在a.com的頁面里就能直接獲取到這個(gè)接口里返回的數(shù)據(jù)了。
但這里有一個(gè)缺陷,這個(gè)數(shù)據(jù)只能在頁面加載的時(shí)候獲取到, 假如我們想要使用ajax那種可以隨時(shí)獲取新的接口數(shù)據(jù)的方式就不太適用了, 例如點(diǎn)擊一個(gè)按鈕, 從這個(gè)接口獲取數(shù)據(jù)局部刷新, 這種方式就有一些不合適了。
類ajax實(shí)現(xiàn)
其實(shí)實(shí)現(xiàn)上面說的類ajax的思路就是在ajax條件觸發(fā)的時(shí)候, 重新生成一遍上面的那個(gè)標(biāo)簽, 從而再次從接口獲取數(shù)據(jù), 但實(shí)際上實(shí)現(xiàn)起來還是略有難度(至少對(duì)我來說費(fèi)了不少功夫)。
上代碼:
假如a.com/scriptSrc.php頁面下有一個(gè)按鈕
<input type="button" id="ajax_request_from_b" value="來自B.com的請(qǐng)求"/>
每次點(diǎn)擊都會(huì)從b.com/b_return_js.php接口獲取數(shù)據(jù), 類似ajax的實(shí)現(xiàn)代碼:
function createScript()
{
//console.log(ele);
ele.src = 'http://b.com/b_return_js.php';
ele.type = 'text/javascript';
ele.language = 'javascript';
}
function getData()
{
console.log(userdata);
}
$('#ajax_request_from_b').click(function(){
//每次都需要重新加載這個(gè)script標(biāo)簽, 因此每次都要重新生成一個(gè)新的script標(biāo) 簽保證能從跨域服務(wù)器獲取數(shù)據(jù)
if(ele && ele.parentNode)
{
//ele.parentNode.removeChild(ele); //這種刪除不能將ele徹底從內(nèi)存刪除,只是移除了在dom中的位置
for (var property in ele) {
delete ele[property]; //徹底刪除
}
}
ele = document.createElement('script'); //這是一個(gè)新的ele
createScript();
document.getElementsByTagName("head")[0].appendChild(ele);
ele.onload = function(){getData()}; //script元素加載后方可獲取userdata, 每次獲取的都是隨機(jī)順序的用戶信息
});
這樣你每次點(diǎn)擊按鈕, 都會(huì)重新從接口獲取一遍數(shù)據(jù), 效果就類似于ajax, 但這是一種js跨域的方法實(shí)現(xiàn), 雖然有些吃力不討好, 但不失為一種思路。
相關(guān)文章
HTML 自動(dòng)伸縮的表格Table js實(shí)現(xiàn)
在開發(fā)的過程中,表格Table有個(gè)缺陷,如果一行中某個(gè)單元格的超過一行,表格就不夠美觀了。2009-04-04javascript判斷機(jī)器是否聯(lián)網(wǎng)的2種方法
只有機(jī)器已經(jīng)聯(lián)網(wǎng)以后,web應(yīng)用才能啟動(dòng),下面使用javascript判斷機(jī)器是否聯(lián)網(wǎng),具體判斷代碼如下,有此需求的朋友可以參考下2013-08-08JavaScript寫的一個(gè)自定義彈出式對(duì)話框代碼
最近閑來無事,用js自己做了一個(gè)彈出式對(duì)話框,需要應(yīng)用彈出式對(duì)話框的朋友可以參考下。2010-01-01Javascript?動(dòng)態(tài)樣式控制方法
這篇文章主要介紹了Javascript?動(dòng)態(tài)樣式控制方法。文章總結(jié)了兩個(gè)方法使用style屬性來設(shè)置和定義好類選擇器的樣式,通過元素的ClassName屬性來設(shè)置其Class屬性值,需要的朋友可以參考一下2022-03-03終于解決了IE8不支持?jǐn)?shù)組的indexOf方法
今天,測試報(bào)過來一個(gè)js bug, 在IE8下有個(gè)js錯(cuò)誤,但是在其它瀏覽器下(Firefox, Chrome, IE9)下面都很正常。后來調(diào)試發(fā)現(xiàn)原因是在IE8下,js數(shù)組沒有indexOf方法。2013-04-04