Javascript jQuery函数作为对象的属性值
我在一个对象中有一个对象,该对象包含一个值为jQuery函数的属性:Javascript jQuery函数作为对象的属性值,javascript,jquery,function,object,Javascript,Jquery,Function,Object,我在一个对象中有一个对象,该对象包含一个值为jQuery函数的属性: var fields = { id: {}, timeStarted: {}, duration: {}, status: {}, name: { field: $("#companyName"), changeEvent: $("#companyName").on("click", function(){ alert("bazin
var fields = {
id: {},
timeStarted: {},
duration: {},
status: {},
name: {
field: $("#companyName"),
changeEvent: $("#companyName").on("click", function(){
alert("bazinga!");
})
}
};
我还有另一个函数,它遍历字段中的所有值,并尝试注册更改事件:
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()
时,控制台返回UncaughtTypeError:object不是函数
。我可以用function(){…}
包装changeEvent
的值,这将使它成为一个运行良好的函数。但出于某种原因,这似乎不是正确的方法
如果你有任何想法,请告诉我
谢谢。当您有这个:
changeEvent: $("#companyName").on("click", function(){
alert("bazinga!");
})
立即执行代码,.on()
的结果是原始选定的对象…它只是$(“#公司名称”)
。因此,changeEvent
被设置为一个jQuery对象,其中包含id为companyName的元素
我会将名称
更改为:
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”,但原始代码中的事件
用于“单击”。如果您希望注册更改事件,您需要包装单击处理程序附件:
name: {
field: $("#companyName"),
changeEvent: function() {
this.field.on("click", function(){
alert("bazinga!");
});
}
}
那么就这样称呼它:
$.each(fields, function(field, v) {
if ($.isFunction(v.changeEvent)) {
v.changeEvent();
}
}
谢谢你的回答。我假设我的第一个建议(将changeEvent
值包装在javascript函数中)是最好的,在这种情况下?另外,我很抱歉没有在前面提到这一点,但是registerChangeEvents()
将在进行某个ajax调用后触发。不同的字段
将具有不同的changeEvents
,它们不限于单击
s,这就是我之所以这样称呼它的原因。例如,我使用的是Bootstrap的伪单选按钮,它不会触发本机更改事件。调用registerChangeEvents()
,这样我就可以为我将通过Ajax调用的所有字段设置这些更改事件。这不是一个函数,而是调用这些jQuery函数的结果(结果是一个jQuery包装器对象)。在匿名函数中包装调用是一个好办法(除非您想使用$.fn.click.bind($(“#companyName”)、alert.bind(窗口,“bazinga!”)
)