-1

我在一个对象中有一个对象,该对象包含一个值为 jQuery 函数的属性:

var fields = {
    id: {},
    timeStarted: {},
    duration: {},
    status: {},
    name: {
        field: $("#companyName"),
        changeEvent: $("#companyName").on("click", function(){
            alert("bazinga!");
        })
    }
};

我还有另一个函数,它遍历在其中找到的所有值fields并尝试注册更改事件:

function registerChangeEvents(){
    $.each(fields, function(field, v){
        $.each(v, function(prop, vv){
            // check which property the loop is on: if changeEvent
            if (prop == "changeEvent"){
                vv();
            }
        });
    });
}

但是,当我运行registerChangeEvents()时,控制台返回Uncaught TypeError: object is not a function. changeEvent我可以用 a包装它的值,function(){...}这将使它成为一个可以正常运行的函数。不过,出于某种原因,这似乎不是正确的方法。

如果您有任何想法,请告诉我。

谢谢。

4

2 回答 2

2

当你有这个:

changeEvent: $("#companyName").on("click", function(){
    alert("bazinga!");
})

代码立即执行,结果.on()是原始选定的对象......这只是$("#companyName"). 所以changeEvent设置为一个 jQuery 对象,包含带有id“companyName”的元素。

我会将其更改name为:

name: {
    field: "#companyName",
    changeEvent: function(){
        alert("bazinga!");
    }
}

然后将您的功能更改为:

function registerChangeEvents(){
    $.each(fields, function(prop, v){
        var field, changeEvent;
        $.each(v, function(propp, vv){
            if (propp === "field") field = vv;
            if (propp === "changeEvent") changeEvent = vv;
        });
        if (field && changeEvent) $(field).on("change", changeEvent);
    });
}

我对一件事感到困惑-您将其称为“changeEvent”,但event您的原始代码中的“click”。

于 2013-04-25T15:41:20.393 回答
1

如果您希望注册更改事件,则需要包装点击处理程序附件:

name: {
    field: $("#companyName"),
    changeEvent: function() {
        this.field.on("click", function(){
            alert("bazinga!");
        });
    }
}

然后像这样调用它:

$.each(fields, function(field, v) {
    if ($.isFunction(v.changeEvent)) {
        v.changeEvent();
    }
}
于 2013-04-25T15:50:27.720 回答