国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

使用script的src實(shí)現(xiàn)跨域和類似ajax效果

2019-11-20 13:56:27
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

場(chǎng)景

假如有兩個(gè)域名不同的服務(wù)器, a.com和b.com, 在b.com/b_return_js.php這個(gè)接口里, 可以獲取一些數(shù)據(jù)。 當(dāng)然,假如是b.com的頁(yè)面里, 可以使用ajax, 直接請(qǐng)求這個(gè)接口, 但如果在a.com的頁(yè)面里如果請(qǐng)求呢。

b_return_js.php的接口代碼:

復(fù)制代碼 代碼如下:

$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)簽加載后的頁(yè)面里能獲取到這個(gè)數(shù)據(jù)并使用。

簡(jiǎn)單實(shí)現(xiàn)

有一種簡(jiǎn)單的方法就是在a.com下的頁(yè)面里, 直接

復(fù)制代碼 代碼如下:

<script src=">

這樣在a.com的頁(yè)面里就能直接獲取到這個(gè)接口里返回的數(shù)據(jù)了。
但這里有一個(gè)缺陷,這個(gè)數(shù)據(jù)只能在頁(yè)面加載的時(shí)候獲取到, 假如我們想要使用ajax那種可以隨時(shí)獲取新的接口數(shù)據(jù)的方式就不太適用了, 例如點(diǎn)擊一個(gè)按鈕, 從這個(gè)接口獲取數(shù)據(jù)局部刷新, 這種方式就有一些不合適了。

類ajax實(shí)現(xiàn)

其實(shí)實(shí)現(xiàn)上面說(shuō)的類ajax的思路就是在ajax條件觸發(fā)的時(shí)候, 重新生成一遍上面的那個(gè)標(biāo)簽, 從而再次從接口獲取數(shù)據(jù), 但實(shí)際上實(shí)現(xiàn)起來(lái)還是略有難度(至少對(duì)我來(lái)說(shuō)費(fèi)了不少功夫)。

上代碼:

假如a.com/scriptSrc.php頁(yè)面下有一個(gè)按鈕

<input type="button" id="ajax_request_from_b" value="來(lái)自B.com的請(qǐng)求"/>
每次點(diǎn)擊都會(huì)從b.com/b_return_js.php接口獲取數(shù)據(jù), 類似ajax的實(shí)現(xiàn)代碼:

復(fù)制代碼 代碼如下:

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), 雖然有些吃力不討好, 但不失為一種思路。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 正蓝旗| 公安县| 禄丰县| 沅江市| 五河县| 楚雄市| 虞城县| 玉门市| 乌拉特前旗| 兴业县| 拜城县| 合作市| 右玉县| 布尔津县| 体育| 江达县| 滦平县| 宾川县| 洪湖市| 娱乐| 朔州市| 鄱阳县| 泸州市| 盐亭县| 襄垣县| 白玉县| 张掖市| 榆社县| 廊坊市| 色达县| 吉安市| 疏勒县| 德阳市| 侯马市| 沾化县| 广南县| 名山县| 昭通市| 津市市| 汶上县| 南康市|