資源描述:
《javascript跨文檔調(diào)用技術(shù)》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、這是一種很有前途的技術(shù),可惜生不逢時(shí),IE剛打垮網(wǎng)景,火狐又冒出來了。這種技術(shù)是我在設(shè)計(jì)超級數(shù)組對象時(shí)發(fā)現(xiàn)的。由于直接繼承原生數(shù)組問題多,我只有用Object與Array的原型方法構(gòu)建一個(gè)新類。不用說,效率不太理想。直到我已把超級數(shù)組臻至完美的今天,我還在不斷尋找新的替代方案,于是我就想到用另一個(gè)文檔的數(shù)組對象來構(gòu)建。經(jīng)測試,IE下是完美的。后來我又發(fā)現(xiàn)早在2006年全知全能的DE大神早已做了這樣的探索,在《HowToSubclassTheJavaScriptArrayObject》中應(yīng)用這種技術(shù),我只不過是重新把它發(fā)挖出來而
2、已。但是,以后就沒有下文了,DE大神在他的Base2類庫構(gòu)建Array2對象時(shí)也沒有應(yīng)用這種技術(shù)。不明真相的我一頭扎下去,哎呀!DE大神你真壞,有陷阱也不通報(bào)聲!下面就拿DE大神的例子改一下,演示究竟出了什么狀況?!window.onload=function(){//創(chuàng)建一個(gè)iframevariframe=document.createElement("iframe");iframe.style.display="none";document.body.appendChild(iframe);//取得iframe文檔的數(shù)組對
3、象frames[frames.length-1].document.write("");vara=Array2(1,2,3,4),b=a.slice(2)alert(binstanceofArray)//萬惡的safari與firefox總是試圖把沙箱文檔的數(shù)組實(shí)例轉(zhuǎn)化為本地文檔的數(shù)組實(shí)例a.push(5);alert(ainstanceofArray)//同上,safari與firefox受影響的方法是所有返回?cái)?shù)組的方法……暈}運(yùn)行代碼為了方便,我把
4、iframe中的文檔對象的javascript環(huán)境中的數(shù)組對象稱之為沙箱數(shù)組,意即,它不受本地?cái)?shù)組對象影響。對,本地?cái)?shù)組的原型進(jìn)行擴(kuò)展,不會殃及沙箱數(shù)組。俗話說,龍生龍,鳳生風(fēng),老鼠的兒子會打洞!事實(shí)也應(yīng)該如此!看,firefox與safari做了什么好事!沙箱數(shù)組變成原生數(shù)組了,我們在沙箱數(shù)組上做的擴(kuò)展成了廢物了!而且現(xiàn)在是linux大多數(shù)系統(tǒng)捆綁firefox,Mac捆綁safari,真不好辦……別以為跨文檔調(diào)用技術(shù)只能干這事,只是它的潛力還有待發(fā)掘而已?,F(xiàn)在再解釋一下上面那段用到的長長的定語。什么叫做“iframe中的文
5、檔對象的javascript環(huán)境……”?由于框架技術(shù)的發(fā)展,一個(gè)頁面并不只有一個(gè)文檔對象(在HTML5中,有關(guān)框架的標(biāo)簽只死剩iframe了)。最頂層的我們稱之為本地文檔,iframe與frame的文檔我稱之為沙箱文檔。由于它們的相對獨(dú)立性,人們最喜歡用iframe做富文本編輯器,省得調(diào)用document.execCommand("BackColor","","red")命令,整個(gè)頁面都紅了。不過,本地文檔也好,iframe文檔也好,它們都屬于HTML文檔。另,創(chuàng)建HTML文檔也不單止iframe標(biāo)簽(frame標(biāo)簽我向來無視
6、),還有ActiveXObject與createDocument,DOMParser等方法。ActiveXObject是指ActiveXObject("htmlfile"),谷歌的gtalk就是用它結(jié)合其他技術(shù)實(shí)現(xiàn)push的技術(shù)。ActiveXObject("htmlfile")創(chuàng)建的文檔是一個(gè)完美的HTML文檔,它擁有document.title,document.body等HTMLDOM專有的屬性,還能運(yùn)行javascript。全局變量this就是我們要找的全局對象,它還擁有我們想要的一切,Array,Boolean,St
7、ring,Date等等。再看w3c那一大堆方法……createHTMLDocument(title)title參數(shù)為tilte元素的innerText。window.onload=function(){try{vardoc=document.implementation.createHTMLDocument('跨文本調(diào)用技術(shù)by司徒正美');varhtml=doc.documentElementalert(html)//測試是否存在HTML元素alert(html.tagName)//注意大小寫,HTML文檔會把元素節(jié)點(diǎn)的ta
8、gName與nodeName大寫化,按理應(yīng)該會返回“HTML”varbody=doc.bodyalert(body);//測試document.bodyif("title"indoc){alert(doc.title)//測試document.title}varhead=do