我正在使用jQuery 1.7。我试图了解命名空间应如何工作。我可以得到一些工作的部分,但不完全像我期望的那样工作。我希望当输入表单元素时,函数checkPasswordForm将触发并提醒字段的值。
我有这个表单元素。
<input type='text' id='Password'>
我希望这段代码能够创建一个命名空间,创建一个对象并创建一个函数。
// SET NAMESPACE
var nsPASS = {
$Password: $('#Password'),
checkPasswordForm: function() {
var Password = $Password.val();
alert(Password);
}
};
nsPASS.$Password.keyup(nsPASS.checkPasswordForm);
此代码不会运行。我收到一个错误,说没有定义$ Password。我修改了代码一千种不同的方法来使它工作。下面的版本按照我的预期工作。这似乎是完成任务所需的更多代码。
// SET NAMESPACE
var nsPASS = {
$Password: $('#Password'),
init: function() {
$Password = $('#Password');
},
checkPasswordForm: function() {
var Password = $Password.val();
alert(Password);
}
};
nsPASS.init();
nsPASS.$Password.keyup(nsPASS.checkPasswordForm);
在第二个示例中,如果我删除nsPASS.init(),则代码会中断。如果我删除密码:$('#Password')代码中断。
我可以定义对象,然后立即在函数中使用它们吗?为什么第一个例子有效,但第二个例子没有?
答案 0 :(得分:4)
JavaScript没有名称空间,只有对象。如果对某个对象的属性有一些值,则不能像使用变量那样使用属性名称,而是始终需要通过该对象来解决它。
在第二个示例中,如果我删除nsPASS.init(),则代码会中断。如果我删除密码:$('#Password')代码中断。
那是因为一个是隐式全局变量(在init
函数中分配,在checkPasswordForm
函数中使用) - 另一个是nsPass
对象的属性(在nsPASS.$Password.keyup(…)
调用中使用的对象文字。所以把它改成
var Password = nsPass.$Password.val();
如果要编写始终在命名空间对象的上下文中调用的函数(作为方法),则可以使用this
keyword作为对象的引用。但是,您的特定函数将被称为事件处理程序,因此其上下文是#Password
输入本身。您可以轻松将其更改为
var Password = $(this).val(); // or shorter: this.value;
答案 1 :(得分:2)
返回您使用的第一个代码块。你应该使用这个:
var Password = nsPASS.$Password.val();
对于像这样的对象,您必须始终记住指定查找变量的位置;)