DedeCMS digg Ajax 跨域的實(shí)現(xiàn)分析
來(lái)源:易賢網(wǎng) 閱讀:1068 次 日期:2016-07-02 10:03:38
溫馨提示:易賢網(wǎng)小編為您整理了“DedeCMS digg Ajax 跨域的實(shí)現(xiàn)分析”,方便廣大網(wǎng)友查閱!

因?yàn)閣eb項(xiàng)目用到二級(jí)域名的原因,使得原先的digg不能正常使用。仔細(xì)分析后,發(fā)現(xiàn)是Ajax JS提交不能跨域的問(wèn)題。

提供解決方案如下:

@writen by etongchina 2009-02-06 19:00

實(shí)現(xiàn)方案:類(lèi)似json實(shí)現(xiàn)

實(shí)現(xiàn)原理:js允許引入的遠(yuǎn)程文件(js)來(lái)操作本地?cái)?shù)據(jù)

具體方法:(以http://news.xxx.com/200812/25-4653.html 為例)

1.修改http://news.xxx.com/200812/25-4653.html 的js調(diào)用用部分;

在本地html或js文件中寫(xiě)入:

<SCRIPT LANGUAGE="JavaScript">

function _Digg(type,tid){

var s = document.createElement("SCRIPT");

s.id="cgi_emotion_list";

document.getElementsByTagName("HEAD")[0].appendChild(s);

s.src="http://www.xxx.com/../dig.php?type="+type+"&tid="+tid ;

//需要統(tǒng)計(jì)的php頁(yè)面的 src

}

function visitCountCallBack(data){

document.getElementsByTagName("HEAD")[0].removeChild(document.getElementById("cgi_emotion_list"));

for(var i in data){

var e =document.getElementById(i);

if(e) e.innerHTML=data[i];

//一些代碼去修改本地html

}

}

</script>

修改以下代碼:<a href="javascript:Digg('digg',4653);">頂一下</a>

為:<a href="javascript:_Digg('digg',4653);">頂一下</a>

2. 訪問(wèn)遠(yuǎn)程文件:

遠(yuǎn)程文件(http://www.xxx.com/../dig.php?type=digg&tid=456 )返回類(lèi)似代碼:

visitCountCallBack({

"visitcount":135

});

以上代碼相當(dāng)于遠(yuǎn)程文件調(diào)用本地函數(shù):visitCountCallBack

這樣一來(lái)就可以實(shí)現(xiàn)利用遠(yuǎn)程返回?cái)?shù)據(jù)來(lái)動(dòng)態(tài)修改本地文件。

3.總結(jié):

關(guān)于此方案,目前可行,也有人認(rèn)為會(huì)過(guò)時(shí)。我認(rèn)為不會(huì)產(chǎn)生JS越權(quán)的問(wèn)題。

我這里有一個(gè)類(lèi)似AJAX應(yīng)用,關(guān)鍵技術(shù)是在<script>標(biāo)簽的src屬性的應(yīng)用。

請(qǐng)大家看以下HTML代碼

<HTML>

<HEAD>

<title>異步j(luò)son例子</title>

<SCRIPT LANGUAGE="JavaScript">

function test(){

var s = document.createElement("SCRIPT");

s.id="cgi_emotion_list";

document.getElementsByTagName("HEAD")[0].appendChild(s);

s.src="http://g2.qzone.qq.com/fcg-bin/cgi_emotion_list.fcg?uin=123456";

// test=function(){};

}

function visitCountCallBack(data){

document.getElementsByTagName("HEAD")[0].removeChild(document.getElementById("cgi_emotion_list"));

for(var i in data){

var e =document.getElementById(i);

if(e) e.innerHTML=data[i];

}

}

</SCRIPT>

</HEAD>

<BODY>

<button onclick="test()">test</button><BR>

歷史訪問(wèn)人數(shù):<span id="visitcount" style="color:#6600CC">點(diǎn)擊test按鈕獲取數(shù)據(jù)</span><BR>

今天訪問(wèn)人數(shù):<span id="dayvisit" style="color:#CC6633">點(diǎn)擊test按鈕獲取數(shù)據(jù)</span><BR>

陽(yáng)光指數(shù):<span id="sun" style="color:red">點(diǎn)擊test按鈕獲取數(shù)據(jù)</span><BR>

愛(ài)心指數(shù):<span id="love" style="color:violet">點(diǎn)擊test按鈕獲取數(shù)據(jù)</span><BR>

雨露指數(shù):<span id="rain" style="color:blue">點(diǎn)擊test按鈕獲取數(shù)據(jù)</span><BR>

營(yíng)養(yǎng)指數(shù):<span id="nutri" style="color:green">點(diǎn)擊test按鈕獲取數(shù)據(jù)</span><BR>

花匠級(jí)別:<span id="gardener" style="color:#996633">點(diǎn)擊test按鈕獲取數(shù)據(jù)</span>

</BODY>

</HTML>

大家可以把上面的代碼拷貝到本地用IE或FIREFOX打開(kāi).點(diǎn)擊按鈕。發(fā)現(xiàn)不刷新頁(yè)面,實(shí)現(xiàn)了動(dòng)態(tài)的效果,而且返回的數(shù)據(jù)是跨域得到了,大家知道JAVASCRIPT是不能跨域訪問(wèn)的,很奇妙吧。。。。仔細(xì)研究代碼發(fā)現(xiàn)了其中的奇妙之處

這段代碼: var s = document.createElement("SCRIPT");

s.id="cgi_emotion_list";

document.getElementsByTagName("HEAD")[0].appendChild(s);

s.src="http://g2.qzone.qq.com/fcg-bin/cgi_emotion_list.fcg?uin=123456";

瀏覽器通過(guò)DOM解析得到了SCRIPT元素,然后添加了ID和SRC屬性。我這里是W3C規(guī)范中對(duì)SCRIPT元素SRC屬性的官方解釋?zhuān)篢he script element allows authors to include dynamic script in their documents. When the src attribute is set, the script element refers to an external file. The value of the attribute must be a URI (or IRI). If the src attribute is not set, then the script is given by the contents of the element. 解釋為:如果定義了SCRIPT標(biāo)簽的SRC屬性,SCRIPT標(biāo)簽涉及到一個(gè)外部文件,屬性值必須是一個(gè)URL。也就是說(shuō)SCRIPT將從此URL引用文件的內(nèi)容。大家在瀏覽器中訪問(wèn)此連接:http://g2.qzone.qq.com/fcg-bin/cgi_emotion_list.fcg?uin=123456這個(gè)類(lèi)似JAVA的SERVLET的URL返回以下數(shù)據(jù):visitCountCallBack({"visitcount":65188579, "dayvisit":8658, "spacemark":0, "markchange":0, "sun":1680, "love":478, "rain":1680, "nutri":1450, "level":5, "gardener":1});這個(gè)字符串是一個(gè)JAVASCRIPT函數(shù),輸入是一個(gè)JSON字符串。這個(gè)數(shù)據(jù)返回的同時(shí)調(diào)用了上面的另一個(gè)JAVASCRIPT函數(shù):function visitCountCallBack(data){

document.getElementsByTagName("HEAD")[0].removeChild(document.getElementById("cgi_emotion_list"));

for(var i in data){

var e =document.getElementById(i);

if(e) e.innerHTML=data[i];

}

}

函數(shù)中用innerHTML吧返回的JSON數(shù)據(jù)填充到BODY中,實(shí)現(xiàn)了不刷新頁(yè)面得到數(shù)據(jù)的異步的效果。 還有一個(gè)關(guān)鍵的問(wèn)題:http://g2.qzone.qq.com/fcg-bin/cgi_emotion_list.fcg?uin=123456是QQ空間的一個(gè)URL(uin是QQ號(hào)碼,大家可以輸入自己的QQ號(hào)碼試試),JAVASCRIPT調(diào)用了其他域的數(shù)據(jù)。 這樣的方式得到數(shù)據(jù)比較簡(jiǎn)單,也能跨域訪問(wèn)數(shù)據(jù),比較適合一些簡(jiǎn)單的,小的無(wú)刷新的效果。 本人有些擔(dān)心的是,如果哪天瀏覽器一更新,拒絕這種訪問(wèn)方式,可能這樣得到數(shù)據(jù)就變得不可用了,建議大家謹(jǐn)慎使用這種方法?。?/P>

更多信息請(qǐng)查看CMS教程
易賢網(wǎng)手機(jī)網(wǎng)站地址:DedeCMS digg Ajax 跨域的實(shí)現(xiàn)分析
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢(xún)回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢(xún)?yōu)闇?zhǔn)!
相關(guān)閱讀CMS教程
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢(xún) | 簡(jiǎn)要咨詢(xún)須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專(zhuān)用圖標(biāo)
聯(lián)系電話(huà):0871-65317125(9:00—18:00) 獲取招聘考試信息及咨詢(xún)關(guān)注公眾號(hào):hfpxwx
咨詢(xún)QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專(zhuān)用圖標(biāo)