【发布时间】:2013-04-30 18:12:17
【问题描述】:
我正在创建一个可以在页面上创建任意数量的验证码的类。我有一个captcha 类,用于实例化新的验证码对象c1 和c2。这是我的 JS:
$(function(){
var captcha = {
parentForm : '',
container : '',
captcha_input : '',
number1 : 0,
number2 : 0,
createCaptcha : function(form_ID){
var newHtml;
this.parentForm = $('#' + form_ID);
this.container = this.parentForm.find('.captchaContainer');
this.number1 = this.randomNumber(10);
this.number2 = this.randomNumber(10);
newHtml = 'What does ' + this.number1 + ' plus ' + this.number2 + ' equal? <b class="required goldenrod" title="Required Field">*</b><br/><br/><input type="text" name="captcha">';
this.container.html(newHtml);
},
isValid : function(){
console.log(this.container);
this.captcha_input = this.container.find('input[name="captcha"]');
if (this.number1 + this.number2 == this.captcha_input.val()) {
this.captcha_input.css('background-color', '')
return true;
} else{
this.captcha_input.css('background-color', '#FFCCCC')
alert(this.number1 + ' plus ' + this.number2 + ' does not equal ' + this.captcha_input.val() + '. Please try again.');
this.captcha_input.focus();
return false;
}
},
randomNumber : function(max){ return Math.floor(Math.random()*(max+1)); }
}
var c1 = captcha,
c2 = captcha;
c1.createCaptcha("form1");
c2.createCaptcha("form2");
$('#form1 input[type="submit"]').click(function() {
if(c1.isValid()){
alert('Captcha is valid!');
}else{
return false;
}
});
$('#form2 input[type="submit"]').click(function() {
if(c2.isValid()){
alert('Captcha is valid!');
}else{
return false;
}
});
});
还有我的 HTML:
<form id="form1">
<div class="captchaContainer"></div>
<input type="submit">
</form>
<form id="form2">
<div class="captchaContainer"></div>
<input type="submit">
</form>
当我单击form1 的提交按钮时,似乎正在为c2 运行isValid 方法,而不是像我预期的那样为c1 运行。知道为什么会这样吗?
需要注意的几点:
- 如果我添加更多
captcha实例和 HTML,每个提交按钮将在单击时在captcha的最后一个实例上运行isValid。 - 这需要适用于 IE8+
这是代码的fiddle。
任何帮助将不胜感激。谢谢!
【问题讨论】:
-
c1 和 c2 都是对同一个
captcha对象的引用。 -
@RickViscomi 同意,因为代码状态 var c1 = captcha, c2 = captcha; c1 和 c2 都是指向验证码对象的指针,因此它们都是同一个对象,这会导致对 1 个对象 c1 的更改影响 c2 和 catcha 对象。
-
啊,这一切都说得通。谢谢!我想我的印象是定义这些变量会创建一个实例而不是一个指针。你们中的任何一个都可以告诉我为什么存储在变量中的对象而不是存储在变量中的数字之类的东西会这样吗?
var myNumber = 1, myNewNumber = myNumber;vsvar myObject = {prop1:'red'}, myNewObject = myObject; -
@Fillip:它适用于所有数据类型!不同之处在于,在对象的情况下,变量的值是对对象的引用,而不是对象本身。此外,对象是可变的,而数字则不是。
-
@FelixKling - 感谢您的解释!有道理!
标签: javascript jquery class object