我正在学习JavaScript,并且想更深入地了解jQuery。我创建了一个非常简单的JS“表单控制器”,所以当我将表单作为参数传递给对象时,它会连接事件并劫持提交:
var FormController = function (form) {
// private field
var _form = $(form);
var _url = _form.attr('action');
var _isValid = false;
$(form).submit(function (e) {
submitForm();
e.preventDefault();
});
var disableAll = function () {
_form.find('select,input,textarea').attr('disabled', 'disabled')
};
var enableAll = function () {
_form.find('select,input,textarea').removeAttr('disabled')
};
var submitForm = function () {
disableAll();
_isValid = true;
if (_isValid) {
$.ajax({
url: _url,
type: 'POST',
success: function (data, textStatus, jqXHR) {
enableAll();
var obj = jQuery.parseJSON(jqXHR.responseText);
print(data.Result ? data.Result : "[No Result]");
print(textStatus.toString());
},
error: function (data, textStatus, jqXHR) {
print(textStatus);
_form.css('border', '1px solid Red');
enableAll();
}
});
}
};
// public fields and functions
return {
getIsValid: function () { return _isValid; },
submit: function () { return submitForm(); }
};
};
一切都按预期进行。现在我想创建一个jQuery扩展,以便将该对象应用于结果:
$.fn.formController = function () {
return this.each(function (i, item) {
new FormController(item);
});
};
我的代码也按预期运行,但是... GC会收集那个对象吗?或者因为事件被连接了,它算作被引用的吗?
现在,我想保留我的控制器实例,这样我就可以在创建后操作它们,例如调用方法。像这样:
$('#myForm').formController('submit');
我已经尝试了几种方法,但是我无法实现它。我曾尝试使用一个闭包和一个跟踪项目的对象,等等...但是我只是在"this"上混乱了。
什么是正确的做法?我认为即使它能工作,到目前为止我所做的一切都可能是错误的。
谢谢。
更新
如果问题不够清楚,我很抱歉。我想要的是一种方法,可以这样做:
$('#myForm').formController('submit');
,然后该函数将查找与该HTML对象关联的"FormController"对象,并调用此"submit"成员。我想实现类似于此的功能:
$.fn.formController = function (name) {
if(!document._items)
document._items = [];
if (name) {
return this.each(function (i, item) {
var id = $(item).data('form-controller');
if (id) {
var fc = document._items[id];
var member = fc[name];
if (member) {
if (typeof member == 'function')
member();
}
}
});
}
else {
return this.each(function (i, item) {
var id = document._items.push(new FormController(item)) - 1;
$(item).data('form-controller', id.toString());
});
}
};
在这种方法中的问题是我将集合作为全局对象来保留,而我想要的是使其成为内部对象。我尝试使用闭包,但是我遇到了“this”(指向DOM窗口)或“_items”变量为空的问题。
正确的方法是什么?
arguments
是指传递给each()
函数的参数。我已经更新了代码来修复这个问题。 - shesek