小編給大家分享一下CKEDITOR 4怎么實(shí)現(xiàn)Dialog內(nèi)嵌IFrame操作,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
成都創(chuàng)新互聯(lián)公司2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站制作、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元嘉蔭做網(wǎng)站,已為上家服務(wù),為嘉蔭各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792實(shí)例如下:
contents: //每一個(gè)contents在對(duì)話框中都是一個(gè)tab頁 [ { id: 'user', //contents的id label: 'You name', title: 'You name', elements: //定義contents中的內(nèi)容,我們這里放一個(gè)文本框,id是name [ { id: 'name', type: 'text', style: 'width: 50%;', label: 'You name', } ] } ],
如果我們把elements中間的內(nèi)容,換成iframe,會(huì)是什么樣呢?讓我們來看一看:
contents: //每一個(gè)contents在對(duì)話框中都是一個(gè)tab頁 [ { id: 'user', //contents的id label: 'You name', title: 'You name', elements: [ { type: "html", html: "", style: "width:800px;height:580px;padding:0;" } ] } ],
在這里,我們描述了我們的elements的類型是html,接著我們插入了一段html代碼,也就是我們的iframe,將網(wǎng)易鏈接了進(jìn)來,最后用style標(biāo)簽定義了對(duì)話框的大小。保存之后,打開看看效果:
果然,我大“黃易”的首頁被載入進(jìn)來了,看來這個(gè)路子可行!那接下來,我們可以試著載入自己的頁面了。在ckeditor_sample.html文件旁邊,再新建一個(gè)文件,叫做myiframe.html,類似這樣:
打開這個(gè)文件進(jìn)行編輯,填入以下代碼,我們構(gòu)建一個(gè)帶有輸入框和復(fù)選框的頁面:
姓名:
《C++ 從入門到放棄》 《HeadFirst 設(shè)計(jì)模式》
《Thinking in Java》 《姜哥的Django匠人生活》
然后把myplug.js中elements段的內(nèi)容改成下面這樣,將iframe的src指向我們自己的創(chuàng)建的頁面:
contents: //每一個(gè)contents在對(duì)話框中都是一個(gè)tab頁 [ { id: 'user', //contents的id label: 'You name', title: 'You name', elements: [ { type: "html", html: "", style: "width:800px;height:580px;padding:0;" } ] } ],
保存后打開看效果:
太棒了!頁面出來了,那么,我們?cè)趺传@取獲取頁面上的輸入值和復(fù)選框的值呢?
還記得上一節(jié),我們打的那些代碼中,那些onLoad,onShow之類的函數(shù)嗎?其實(shí)看名字,都可以知道,這些函數(shù)被觸發(fā)的時(shí)刻,當(dāng)我們點(diǎn)擊“確定”按鈕的時(shí)候,會(huì)觸發(fā)onOk事件,同時(shí)自動(dòng)調(diào)用onOk()函數(shù),那我們就在onOk()里寫點(diǎn)兒代碼吧。
onOk: function () { var html = ""; var your_name = document.getElementById('myiframe').contentDocument.getElementById('username'); //使用JS最基礎(chǔ)的getElementById找到我們的iframe控件,然后再獲取id為username的控件 html = html + "" + your_name.value + ":
"; var selected_books = document.getElementById('myiframe').contentDocument.getElementsByName('yourbook'); //使用JS最基礎(chǔ)的getElementById找到我們的iframe控件,然后再獲取所有name為yourBook的控件 var books = ""; for(var i=0; i< selected_books.length; i++){ //遍歷我們的selected數(shù)組 if (selected_books[i].checked){ books = books + "" + selected_books[i].value + "
"; } } html = html + books; editor.insertHtml(html); this.commitContent(); },
我們用了最基礎(chǔ)的js語法,從dom對(duì)象中獲取我們想要的控件和控件中的值,學(xué)過js語法的同學(xué)應(yīng)該一眼就看的出來,這個(gè)真的很簡單,讓我們來運(yùn)行一下看看吧:
Oooooops!太糟糕了,居然又報(bào)錯(cuò)了,F(xiàn)12打開的調(diào)試窗口中,可以看到我們這個(gè)的這個(gè)錯(cuò)誤叫做:
Blocked a frame with origin "null" from accessing a cross-origin frame
錯(cuò)誤的意思是:未捕獲的安全錯(cuò)誤:阻止了一個(gè)域?yàn)閚ull的frame頁面訪問另一個(gè)域?yàn)閚ull的頁面。
姜哥給他翻譯成人話:其實(shí)是瀏覽器為了避免一種叫做“跨域攻擊”的黑客攻擊手段,阻止了兩個(gè)不同域名之間的dom操作。由于我們的頁面是本地打開的,瀏覽器中的地址欄是類似下面這種的本地地址,因此無法訪問iframe頁面中的值:file:///E:/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/ckeditor_4.8.0_full/ckeditor_sample.html
怎么辦呢?其實(shí)一般小伙兒伴開發(fā)這個(gè)頁面,都是運(yùn)行在一個(gè)工程里,或者一個(gè)項(xiàng)目里,本來就是運(yùn)行在類似http://localhost/xxx這種網(wǎng)絡(luò)地址下的,不會(huì)有問題,但是我們現(xiàn)在是想調(diào)試下啊,怎么辦呢。。。
如果只是想調(diào)試學(xué)習(xí)一下,其實(shí)特別簡單,那就是——換一個(gè)瀏覽器!比如IE瀏覽器,就妥妥啦!
注意:這里不是說這段代碼在Chrome下無法運(yùn)行,只是瀏覽器特性不同,chrome不允許這種不在同一個(gè)域名下的內(nèi)嵌頁面通過dom接口來訪問,安全性比較高。換句話說就是,如果我們這段代碼是發(fā)布在一個(gè)網(wǎng)站上,比如你放在nginx里,瀏覽器通過http://localhost/ckeditor/ckeditor_sample.html這種方式去打開我們的頁面,就沒有問題了!
相當(dāng)成功,對(duì)吧?讓我再次點(diǎn)擊我們的插件,發(fā)現(xiàn)了什么?對(duì)了!What the fuck!上次填入的內(nèi)容居然還在里面!
腫么辦?還記得我們可以使用的函數(shù)嗎?對(duì)!我們可以用onHide()函數(shù),在對(duì)話框關(guān)閉時(shí),刷新一下myiframe.html,以保證下一次打開時(shí),是一個(gè)全新的頁面:
onHide: function () { document.getElementById('myiframe').contentDocument.location.reload(); },
再次保存之后,嘗試一下,完全正常了。
以上是“CKEDITOR 4怎么實(shí)現(xiàn)Dialog內(nèi)嵌IFrame操作”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!