如何在文本字段中循环Js函数和事件

how to loop Js function and event in textfield?

本文关键字:Js 函数 事件 循环 文本 字段      更新时间:2023-12-16

使用事件onfocus()onblur()循环textfield时出现问题。在单行中,该事件可以正确运行,但如果我尝试在文本字段中使for循环两行,则textfield上的该事件无法运行。

我需要这个问题的解决方案,谢谢

<script type="text/javascript">
function startCalc() {
    interval=setInterval("calc()",1);
}
function calc() {
    var obj=document.hitung;
    var one=obj.sks.value;
        if(one == 2)
            { var hsks = 14; }
        else if(one == 4)
            { var hsks = 28; }
        else
            { var hsks = 0; }
    obj.n_pertemuan.value=(hsks);
}       
function stopCalc() {
    clearInterval(interval);
}
</script>
<center>
<form name="hitung">
<?php 
    for($x = 1; $x <= 2; $x++)
    {
?>
  <table width="205" border="1" cellspacing="0" cellpadding="2">
    <tr>
      <td height="44" colspan="2" align="center">Js Coba</td>
    </tr>
    <tr>
    <td width="84" align="center">SKS</td>
    <td width="113" align="center">PERTEMUAN</td>
  </tr>
  <tr>
    <td align="center"><input name="sks" type="text" onFocus="startCalc();" onBlur="stopCalc();" size="5"/></td>
    <td align="center"><input name="n_pertemuan" type="text" size="5" ></td>
  </tr>
</table>
<?php } ?>
</form>
</center>

这里我将指出您所犯的一些错误:

当您创建三个或多个表时,该语句

var one = obj.sks.value;

当你有更多的文本字段时,它会返回错误,因为这样它就会像一个类似数组的对象。所以你必须迭代它们才能得到它们的值。最好使用getElementsByName方法。我做了一些改变以使事情变得清楚。首先交换事件处理程序以更好地控制您的程序,否则它将运行疯狂,因为您在每毫秒后使用setinterval。

<input name="sks" type="text" onBlur="startCalc();" onFocus="stopCalc();" size="5"/>

我还更改了你的startClac功能

var obj, one, interval;
function startCalc(){
    obj=document.hitung;
    one=document.getElementsByName('sks');
    for(i=0;i<one.length;i++){
        (function(val){
             if(one[val].value !=""){
                 interval=setInterval(function (){
                 calc(one[val].value);
                 },1000);
             }
        })(i);
    }
}

最好在startCalc之外声明obj、one和interval变量,以获得更好的控制。

使用getElementsByName方法获取名称为'sks'的每个输入。对它们进行迭代以检查它们的值。它会产生一个与closure相关的问题,所以我建议使用一个立即调用的函数来保持i的值不变,除非它会大于实际的文本字段数,并且你会失去对它的跟踪

如果你想让你的代码省略一个变量的value属性,因为它是一个节点列表,而节点列表没有value属性。它只有length属性。在startCalc()函数内部写

 one = obj.sks;
 output = obj.n_pertemuan;

obj,one and output变量排除在calc()函数的作用域之外。以下是您必须在calc()函数内部进行的修改,并保持其余部分不变。

for(i=0;i<one.length;i++){
    (function(val){
        if(one[val].value == 2)
            { var hsks = 14; }
        else if(one[val].value == 4)
            { var hsks = 28; }
        else
            { var hsks = 10; }
        output[val].value=hsks;
        console.log(output[val].value);
    })(i);
}