0

我有代码可用于使用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" >
4

3 回答 3

1

你可以有:

var executedAlready = false;

内部函数 B 和 C 具有:

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

或者也许你可以分离事件?我想有几种不同的方法可以做到这一点。

于 2013-03-27T12:45:19.067 回答
0

您可以使用一个或多个标志:

在页面的开头:

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

在你的元素上:

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

onFocus 也一样...

于 2013-03-27T12:43:15.260 回答
0

其他答案告诉您,获得结果的“最快”方法是让您的函数只执行一次。你可以这样做:

  • 做一个标志(只是一个知道你的函数是否已经被触发的变量)。
  • 在执行你的函数时,首先检查这个标志。

这是一个如何使用函数 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 事件的附加和分离操作。

于 2013-03-27T14:13:47.993 回答