jQuery._data事件处理程序

时间:2016-10-12 09:00:24

标签: javascript jquery twitter-bootstrap

我正在尝试确定是否已加载Twitter Bootstrap“tab.js”。一种方法是查看它挂钩的事件。

如果我将事件处理程序转储到控制台:

namespace:"bs.data-api.tab"

Chrome的控制台显示:

Chrome console output

正如您所看到的,Click Array [7]变成了一个Array [5],但是显示了7个对象,然后当我尝试显示元素[5]的命名空间时,元素[5]和[6]已经消失!

任何人都知道这里发生了什么,以及如何阅读元素[5]的值,是

SendIntentException

由于 JC

1 个答案:

答案 0 :(得分:0)

这是一个时间问题。我正在加载'tab.js',将其附加到正文,并假​​设此过程将立即完成:

ourScript = document.createElement("script");
ourScript.type  = "text/javascript";
ourScript.src = sourceDir + "tab.js";
document.body.appendChild(ourScript);

似乎没有来自jquery追加的回调,所以我在检查'tab.js'之前添加了一秒延迟,所有看起来都没问题。我希望Chrome控制台会混淆并显示出奇怪的效果。

最终代码:

// ---------------------------------
var eventNameSpaceLoaded = function (thisNamespace) {
    var isLoaded = false;
    var theseClickEvents = jQuery._data(document, "events").click; 

    Object.keys(theseClickEvents).forEach(function (key) {
        if (theseClickEvents[key].namespace && (theseClickEvents[key].namespace === thisNamespace)) {
            isLoaded = true;
            return false;               // stop the each
        }
    });
    return isLoaded;
};

// check bootstrap tab.js is loaded
var ourScript;
if( !eventNameSpaceLoaded("bs.data-api.tab")) {
    ourScript = document.createElement("script");
    ourScript.type = "text/javascript";
    ourScript.src = sourceDir + "tab.js";
    document.body.appendChild(ourScript);
}

// has tab.js been loaded - try checking for 10 seconds
(function checkTabLoad( counter) {
    if( !eventNameSpaceLoaded("bs.data-api.tab")) {
        counter -= 1;
        if(counter > 0){
            setTimeout(function(){  
                checkTabLoad( counter); 
            }, 100);
        }
    } else {
        // get tabs working 
        $('#SOME_ SELECTOR').click(function (e) {
            e.preventDefault();
            $(this).tab('show');
        });
        console.log("tabs fired up");
    }
}( 100));