2016-03-06 41 views
0

我有一個三個輸入的表單。我希望能夠填寫兩個字段並自動填寫第三個字段。輸入兩個輸入,填入第三個

所以,它應該像這樣工作:
- 我填寫的第一,第二,第三被計算
- 我填寫的第一個和最後一個,第二個被計算
- 我填寫第二和最後一個,第一個被計算

我想出了這個代碼:

$(document).on('keyup change', '[data-calc]', function() { 
 
\t var a = $('[data-calc=a]') , 
 
    \t \t aV = a.val() , 
 
     b = $('[data-calc=b]') , 
 
     bV = b.val() , 
 
     c = $('[data-calc=c]') , 
 
     cV = c.val(); 
 
    if(aV.length != 0 && bV.length != 0) { 
 
    \t cV = parseInt(aV) + parseInt(bV); 
 
    \t c.val(cV).prop('disabled',true); 
 
    } 
 
    else if(aV.length != 0 && cV.length != 0) { 
 
    \t bV = parseInt(cV) - parseInt(aV); 
 
    \t b.val(bV).prop('disabled',true); 
 
    } 
 
    else if(bV.length != 0 && cV.length != 0) { 
 
    \t aV = parseInt(cV) - parseInt(bV); 
 
    \t a.val(aV).prop('disabled',true); 
 
    } 
 
    else { 
 
    \t $('[data-calc]').prop('disabled',false); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="text" data-calc="a" /><br /> 
 
+<br /> 
 
<input type="text" data-calc="b" /><br /> 
 
=<br /> 
 
<input type="text" data-calc="c" />

現在工作正常,當我填寫第一個和第二個領域。

但是,如果我填寫第一個,之後的第三個,第三個字段被禁用。

任何想法?

+0

'b.val(BV).prop(」禁用',true);'會禁用第二個輸入...你想禁用哪個域? – Rayon

+0

我想這是應該如何... https://jsfiddle.net/7bz3jz2z/ – Rayon

+0

雙重綁定是問題。我的答案詳情:-) –

回答

-1

問題出在你對雙方都綁定到keyup & change事件。從你的代碼中刪除change,你就開始了:-)

當你在第三個字段中鍵入一個值時,首先觸發keyup事件,並且一切都很好,當焦點移出第三個字段它激發了change事件 - 由於第一個&第二個字段都具有值,所以它又將其禁用。

$(document).on('blur', '[data-calc]', function() { 
 
\t var a = $('[data-calc=a]') , 
 
    \t \t aV = a.val() , 
 
     b = $('[data-calc=b]') , 
 
     bV = b.val() , 
 
     c = $('[data-calc=c]') , 
 
     cV = c.val(); 
 
    if(aV.length != 0 && bV.length != 0) { 
 
    \t cV = parseInt(aV) + parseInt(bV); 
 
    \t c.val(cV).prop('disabled',true); 
 
    } 
 
    else if(aV.length != 0 && cV.length != 0) { 
 
    \t bV = parseInt(cV) - parseInt(aV); 
 
    \t b.val(bV).prop('disabled',true); 
 
    } 
 
    else if(bV.length != 0 && cV.length != 0) { 
 
    \t aV = parseInt(cV) - parseInt(bV); 
 
    \t a.val(aV).prop('disabled',true); 
 
    } 
 
    else { 
 
    \t $('[data-calc]').prop('disabled',false); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="text" data-calc="a" /><br /> 
 
+<br /> 
 
<input type="text" data-calc="b" /><br /> 
 
=<br /> 
 
<input type="text" data-calc="c" />

+0

它的工作原理。再次,問題是你在底部輸入的兩位數字。在第一個數字(1)之後,你得到了邏輯,然後在第二個數字鍵上,你已經在top和middle字段中有值了。我建議改變事件爲'模糊',並避免早熟計算...無論如何,downvote是不酷:-) –

+0

剛剛更新了答案,以支持兩個(和更多)的數字號碼... –

1

這是應該的,你應該檢查哪些元素被編輯

$(document).on('keyup change', '[data-calc]', function(event) { 
 
    var $this = $(event.target || event.srcElement), 
 
    calc = $this.data('calc'), 
 
    $newCalc, 
 
    $a, 
 
    $b, 
 
    $c, 
 
    aV, 
 
    bV, 
 
    cV; 
 
    if (!calc) { 
 
    return; 
 
    } 
 

 
    $a = $('input[data-calc=a]'); 
 
    $b = $('input[data-calc=b]'); 
 
    $c = $('input[data-calc=c]'); 
 

 
    $('input[data-calc]').prop('disabled', false); 
 

 
    aV = Number($a.val()); 
 
    bV = Number($b.val()); 
 
    cV = Number($c.val()); 
 

 
    if (calc === 'a') { 
 
    if (!!aV && !!bV) { 
 
     $newCalc = $c.val(aV + bV); 
 
    } else if (!!aV && !!cV) { 
 
     $newCalc = $b.val(cV - aV); 
 
    } 
 
    } else if (calc === 'b') { 
 
    if (!!aV && !!bV) { 
 
     $newCalc = $c.val(aV + bV); 
 
    } else if (!!bV && !!cV) { 
 
     $newCalc = $a.val(cV - bV); 
 
    } 
 
    } else if (calc === 'c') { 
 
    if (!!aV && !!cV) { 
 
     $newCalc = $b.val(cV - aV); 
 
    } else if (!!bV && !!cV) { 
 
     $newCalc = $a.val(cV - bV); 
 
    } 
 
    } 
 
    if ($newCalc) { $newCalc.prop('disabled', true); } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="text" data-calc="a" /> 
 
<br />+ 
 
<br /> 
 
<input type="text" data-calc="b" /> 
 
<br />= 
 
<br /> 
 
<input type="text" data-calc="c" />