У меня есть код, который можно использовать для вычитания значений текстового поля с помощью javascript?

у меня есть код, который можно использовать для вычитания и дополнительных значений текстового поля с помощью javascript, и он работает, но проблема в том, что javascript снова и снова выполняет функцию всякий раз, когда onfocus textbox я хочу, чтобы только один раз javascript был executed function?

функция javascript снова и снова дополнительная onMouseOver="return B(0);"

функция javascript снова и снова вычитание onfocus="return C();"

функция javascript снова и снова дополнительная onfocus="return D();"

function getObj(objID){
return document.getElementById(objID);
}

function B(){
var advanceBox = document.getElementById('advance');
var originalValue = advanceBox.value;
advanceBox.onfocus = function() {
this.value = parseFloat(originalValue, 10) +
parseFloat(document.getElementById('recamt').value, 10);
return false;
};
}   

function C() {
getObj("balance").value=parseFloat(getObj("total").value  || 0)-
(parseFloat(getObj("advance").value || 0)) ;
getObj("balance").value=parseFloat(getObj("balance").value || 0)-
(parseFloat(getObj("discount").value)||0) ;
return false;
} 

function D() {
getObj("total").value=parseFloat(getObj("total").value  || 0)+
(parseFloat(getObj("openbal").value || 0)) ;
return false;
}      


 Opening Balance:<input class="input_field2" 
 type="text" name="openbal" id="openbal"><br />

Total:<input class="input_field2" type="text" 
readonly name="total" id="total" value="5000"><br />

Advance:<input class="input_field2" type="text" 
readonly name="advance" id="advance"    value="500" 
onMouseOver="return B(0);"><br />

Balance:<input class="input_field2" readonly type="text" 
name="balance" id="balance" onfocus="return C();"><br />

Rem Amount:<input class="input_field2" type="text"
name="recamt" id="recamt"><br />

Discount: <input class="input_field2" 
style="background-color:#FFF !important;" 
type="text" name="discount" id="discount" >

person Community    schedule 27.03.2013    source источник


Ответы (3)


Вы могли бы:

var executedAlready = false;

Внутренние функции B и C имеют:

if(executedAlready != true){ executedAlready = true; }
else { return; }

Или, может быть, вы могли бы вместо этого отсоединить события? Я думаю, есть несколько разных способов сделать это.

person Odinator    schedule 27.03.2013

Другие ответы говорят вам, что «самый быстрый» способ получить результаты - заставить ваши функции выполняться только один раз. Вы можете сделать это следующим образом:

  • Создайте флаг (просто переменную, которая знает, была ли уже запущена ваша функция).
  • При выполнении ваших функций сначала проверьте этот флаг.

Вот пример того, как это сделать с помощью функции B():

(Примечание: я не менял вашу функцию, не хочу сейчас вдаваться в подробности)

// setup fired as false
var hasBFired = false;
function B(){
  // if B is true, we do nothing
  if (hasBFired) {
    return;
  // else if it is not true, basically only the first time you call this, flip the flag and execute the rest of the code.
  } else {
    hasBFired = true;
  }
  var advanceBox = document.getElementById('advance');
  var originalValue = advanceBox.value;
  advanceBox.onfocus = function() {
  this.value = parseFloat(originalValue, 10) +
  parseFloat(document.getElementById('recamt').value, 10);
  return false;
};

Теперь повторите то же самое с функциями C и D (установите еще два флага).

Это не лучший способ - нехорошо настраивать глобальные объекты и прочее, но, поскольку вы, вероятно, не получаете какую-либо стороннюю библиотеку, это поможет вам решить вашу проблему на данный момент. Для долгосрочного решения вы должны использовать библиотеку событий (например, YUI Event) и обрабатывать ее прикрепление и отсоединение действий от событий onfocus для вас.

person Zlatko    schedule 27.03.2013
comment
спасибо, вы мне очень помогли, у меня есть еще один вопрос к вам page-url-without-form-or-su" title="есть ли способы передать значения текстового поля на тот же URL-адрес страницы без формы или su"> stackoverflow.com/questions/15712596/ - person ; 30.03.2013

вы можете использовать один или несколько флагов:

в начале страницы:

<script>
    var flag = false;
</script>

и на вашем элементе:

<div .... onMouseOver="if(!flag) { flag = true; return B(0);}" > .... </div>

то же самое для onFocus...

person BlueMagma    schedule 27.03.2013
comment
вы можете написать пример javascript, потому что я запутался в вашем ответе - person ; 27.03.2013