Discuz 7.2坑爹集錦-js篇

Discuz 7.2坑爹集錦-js篇

在調試DZ過程當中firebug常常提示common.js出錯,什麼「Error: s is null」,「$ is not defined」,「BROWSER not defined」。其實多半和XML有關:當ajax操做時後臺PHP出現錯誤(包括notice)致使前臺JS在解析指望中XML格式返回值時出錯。也許是DZ的ajax調用對返回值處理不夠完善。解決辦法是編輯php.ini設置display_error = off。
DZ的js文件沒細看,主要是解決幾個調試過程當中遇到兼容性問題。

-------------------------------------------------------------------------------------------------------

類型:        過期函數
坑爹指數:    ★
代碼:        include/js/common.js 10-14
BROWSER.ie = window.ActiveXObject && USERAGENT.indexOf('msie') != -1 && USERAGENT.substr(USERAGENT.indexOf('msie') + 5, 3);
BROWSER.firefox = document.getBoxObjectFor && USERAGENT.indexOf('firefox') != -1 && USERAGENT.substr(USERAGENT.indexOf('firefox') + 8, 3);
BROWSER.chrome = window.MessageEvent && !document.getBoxObjectFor && USERAGENT.indexOf('chrome') != -1 && USERAGENT.substr(USERAGENT.indexOf('chrome') + 7, 10);
BROWSER.opera = window.opera && opera.version();
BROWSER.safari = window.openDatabase && USERAGENT.indexOf('safari') != -1 && USERAGENT.substr(USERAGENT.indexOf('safari') + 7, 8);
點評:        測試過程當中某天發現FF下登陸窗口帳戶名只能選擇用戶名,而在chrome下面可選UID及email。當時一直沒找到緣由,某天測試時修改到此處,順便用slice()替換substr()發現FF的登陸窗問題正常了。猛然想起之前看過對於substr的一個註解:「ECMAscript 沒有對該方法進行標準化,所以反對使用它」。在Firefox8之前都沒這個問題,看來FF開始放棄對此函數的兼容了。另外Firefox9也不支持document.getBoxObjectFor對象了。
FIX:    
BROWSER.ie = window.ActiveXObject && USERAGENT.indexOf('msie') != -1 && USERAGENT.slice(USERAGENT.indexOf('msie') + 5, USERAGENT.indexOf('msie') + 8) || false;
BROWSER.firefox = USERAGENT.indexOf('firefox') != -1 && USERAGENT.slice(USERAGENT.indexOf('firefox') + 8, USERAGENT.indexOf('firefox') + 11) || false;
BROWSER.chrome = window.MessageEvent && !document.getBoxObjectFor && USERAGENT.indexOf('chrome') != -1 && USERAGENT.slice(USERAGENT.indexOf('chrome') + 7, USERAGENT.indexOf('chrome') + 17) || false;
BROWSER.opera = window.opera && opera.version() || false;
BROWSER.safari = window.openDatabase && USERAGENT.indexOf('safari') != -1 && USERAGENT.slice(USERAGENT.indexOf('safari') + 7, USERAGENT.indexOf('safari') + 15) || false;

-------------------------------------------------------------------------------------------------------

類型:        操做符順序
坑爹指數:    ★
代碼:        include/js/common.js=1112
function ajaxget(url, showid, waitid, loading, display, recall) {
    waitid = typeof waitid == 'undefined' || waitid === null ? showid : waitid;
    ...
}
點評:        怎麼看這個賦值表達式也沒問題,但是當minify以後就時不時會在這兒出錯,提示「Uncaught ReferenceError: $ is not defined」,用小括號包裹以後就正常了。也蠻奇怪的……
FIX:      
waitid = (typeof waitid == 'undefined' || waitid === null) ? showid : waitid;


-------------------------------------------------------------------------------------------------------

類型:        代碼規範
坑爹指數:    ☆
代碼:        include/js/common.js=834
if($('fwin_dialog_submit')) $('fwin_dialog_submit').onclick = function() {
        if(typeof func == 'function') func();
        else eval(func);
        hideMenu(menuid, 'dialog')
    };
點評:        缺乏分號結尾,跑到if判斷後去了。不過js仍是很寬容的,這兩個小毛病不會致使啥問題。

 

ADD:有朋友說修正分號反而會致使發帖編輯器上按鈕(圖片、附件等)所有失效了。此處請謹慎修改php

 

-------------------------------------------------------------------------------------------------------

類型:        代碼規範
坑爹指數:    ☆
代碼:        
include/js/common.js=1140
if(x.autogoto) scroll(0, x.showId.offsetTop);
include/js/common.js=1150
if(!evaled) evalscript(s);
include/js/common.js=1199
if(!evaled) evalscript(s);
include/js/common.js=1234
if(isUndefined(timeout)) timeout = 3000;
    if(isUndefined(cache)) cache = 1;
    if(isUndefined(pos)) pos = '43';
    if(isUndefined(duration)) duration = timeout > 0 ? 0 : 3;
include/js/common.js=1551
if(tagname == 'INPUT' || tagname == 'TEXTAREA') return;
include/js/common.js=1651
if(lasttop == -1) lasttop = 0;
include/js/common.js=1841
if(isUndefined(parsecode)) parsecode = true;
                if(parsecode) str= str.replace(/\s*\[code\]([\s\S]+?)\[\/code\]\s*/ig, function($1, $2) {return codetag($2);});
include/js/common.js=1860
if(typeof wysiwyg != 'undefined' && wysiwyg) text = text.replace(/<br[^\>]*>/ig, '\n').replace(/<(\/|)[A-Za-z].*?>/ig, '');
include/js/common.js=835
if($('fwin_dialog_submit')) $('fwin_dialog_submit').onclick = function() {
        if(typeof func == 'function') func();        // <----
        else eval(func);                    // <----
        hideMenu(menuid, 'dialog');
    }
   
點評:        看來common.js是同一位大猿寫的,代碼不喜歡用大括號包裹條件句。雖然沒有錯誤,minify以後也正常,但在後期維護時很容易致使問題。習慣成天然,養成的習慣都很差改,不必定害己但必定害人~


版權曾經擁有,歡迎網上分享
轉載請保留連接 http://my.oschina.net/u/126398/blog/39009
相關文章
相關標籤/搜索