我正在創建一個類,可以在頁面上創建任意數量的驗證碼。我有一個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