我正在创建一个类,可以在页面上创建任意数量的验证码。我有一个captcha
类,用于实例化新的验证码对象c1
和c2
。这里是我的JS:为什么这个javascript对象引用了前一个对象的属性?
$(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
的提交按钮,看起来像isValid
方法正在为c2
跑,而不是c1
像我期待。任何想法为什么这样做?
有几件事情需要注意:
- 如果我增加更多
captcha
实例和HTML,每一个提交按钮会就captcha
上点击最后一个实例运行isValid
。 - 这需要为IE8 +
这里工作是在行动代码的fiddle。
任何帮助将不胜感激。谢谢!
c1和c2都是对同一'captcha'对象的引用。 – 2013-04-30 18:14:51
@RickViscomi同意,因为代码状态var c1 = captcha,c2 = captcha; c1和c2都是指向验证码对象的指针,因此它们都是同一个对象,这会导致更改1个对象c1以影响c2和catcha对象。 – abc123 2013-04-30 18:21:17
啊,这一切都有道理。谢谢!我想我的印象是,定义这些变量会创建一个实例而不是指针。你们中的任何一个人都可以让我知道为什么对象存储在变量中,而不是存储在变量中的数字? 'var myNumber = 1,myNewNumber = myNumber;'** vs **'var myObject = {prop1:'red'},myNewObject = myObject;' – 2013-04-30 18:26:22