解決eWebEditor老版本在IE新版本下按鈕失效問題一勞永逸的辦法

來源:互聯網
上載者:User

標籤:引用   else   失效   pad   nbsp   處理   comment   參考   但我   

單位裡有一套新聞發布系統,是很早以前的了,一直在用,eWebEditor是什麼版本的也搞不清了,但肯定是老版本。

前一段時間也出了問題,在IE8上按鈕失效,經過百度之後,解決方案幾乎全都一樣,都是五花八門的判斷IE版本然後執行對應的匿名方法。

出問題的是editor.js中的這句:if (element.YUSERONCLICK) eval(element.YUSERONCLICK + "anonymous()"); 

而解決方案,無一例外的都是兩種

1、

1  if(navigator.appVersion.match(/MSIE (7|8)\./i)!=null || navigator.appVersion.match(/MAXTHON/i)==‘MAXTHON‘)2 {3     if (element.YUSERONCLICK) eval(element.YUSERONCLICK + "onclick(event)");4 }else{5     if (element.YUSERONCLICK) eval(element.YUSERONCLICK + "anonymous()");6 }

該方案用版本檢測的方法,針對不同IE版本,調用不同函數名稱來解決,但問題在於IE的後續版本流行起來的話又要加入版本號碼來判斷了,如果IE又修改了函數名就會判斷起來更麻煩了。

2、 

12345678910 if (element.YUSERONCLICK){try{eval_r(element.YUSERONCLICK + "onclick(event)");}catch (e){eval_r(element.YUSERONCLICK + "anonymous()");}}
該方法不檢測IE版本號碼,而是通過try/catch來模糊區分版本號碼,同樣問題,當IE又變更函數名的時候,就又要嵌套一層try/catch了。

3、這就是我設計的解決方案了

翻遍網路,似乎只有這兩種解決方案,看來是轉來轉去的成了標準解決方案了。個人看法,這兩種方法代碼過多不說,而且還無法應對IE升級後有可能再次變更函數名的問題。仔細分析這段有問題的代碼就會發現,其實element.YUSERONCLICK屬性裡存放的是一段function的定義,alert一下就會看到代碼字串如下:

1234 function anonymous(){//這裡是執行代碼}

完整地來看,就是用eval來執行一個js程式碼片段如下:

12345 function anonymous(){//這裡是執行代碼}anonymous()

 由於IE的升級變化,導致anonymous()函數名發生變化,但我們在代碼裡把函數名作為常量字串使用時,這種變化就不能適應了。

當然我們也可以用提取字元的方法把函數名從程式碼片段裡分割出來,然後拼湊起程式碼片段來執行,雖然方法沒問題,但還不夠簡潔。

其實利用JS的動態特性,我們完全可以在不必知道函數名也不必動態提取函數名的情況下直接正確的執行該函數

最終代碼會比原始碼還節省代碼位元組,只需將函數名替換成一對括弧就可以解決了:

if (element.YUSERONCLICK) eval("(" + element.YUSERONCLICK + ")()");

 這樣一處理,不但沒增加代碼,反而減肥了,而且不論IE升級版本後函數名變成什麼都無所謂了,只要IE不取消這個匿名功能函數就會一勞永逸

4、關於本文的後記

時隔兩年之後的今天(2014-10-20)由於又處理了一起老版本ewebeditor的匿名函數故障,再次翻出了自己的博文。無聊之際到維普網搜了一下關鍵字“ewebeditor”,眼前一亮發現了一篇論文引用了本博文中的解決方案,時間是在本博文整理完畢不久的同年(2012年)。

暈啊,有同學引用了本文居然一直不知道啊。

特此備忘一下,滿足一下小小的虛榮心,好歹咱的博文也是參考文獻了,上檔次了,噢耶Y。

解決eWebEditor老版本在IE新版本下按鈕失效問題一勞永逸的辦法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.