jqueryでdelegate()は空白をクリックして消えることを実現します


この2,3日、会社のプロジェクトの全局表情コンポーネントを書いて、いくつかのテクニックを試しました.特に記録、共有
1.バインドされたイベントで、イベントソースを取得し、hideメソッドを呼び出し、イベントソースオブジェクトに転送します.

$(document).delegate("body", "click", function(e) {
        var ev = e || window.event; //   
        //var target = ev.target || ev.srcElement; //      
        hide(ev.target || ev.srcElement, true);
    });

もともと使っていた$(window)ですが、IE 8以前の、バグがあったようです.
$(document)の悪い点は、ページのロードが完了すると、一度トリガーされます...
2.
hideメソッドでは、イベントソースが指定された要素から発行されるかどうか、すなわち、イベントソース要素が指定された要素のサブ要素またはそれ自体であるかどうかを判断します.


//     ====
    if (!!window.find)HTMLElement.prototype.contains = function(B) {
        return this.compareDocumentPosition(B) - 19 > 0
    };

 function hide(dom, isClick) {
        var nn,t,_isClick = !!isClick;
        try {
            for (var n in objList) {
                nn = objList[n];
                t = nn.getOption("target")[0];
                if (_isClick && (t == dom || t.contains(dom)))return;
                if (!_isClick || !nn.box[0].contains(dom)) nn.hide();
            }
        } catch(e) {
        }
    }

3.上のhideメソッドでは、isClick変数は、クリックイベントがトリガーされたか否かを判定する.resizeのリスニングを処理します.resizeはsettimeoutで処理する、メモリ消費を低減する.

var reTime = null;
    $(window).bind("resize", function() {
        if (reTime) clearTimeout(reTime);
        reTime = setTimeout(hide, 50);
    });

PS:jquery.extend()真TMごみ、2級jsonデータが来たらだめだ!!!私は行きました!改善を求めます
underscore.jsの_.extend()は使いやすい!おすすめですよ~