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

时间:2015-02-17 03:10:31

标签: javascript php

我在使用事件textfieldonfocus()循环onblur()时遇到问题。在单行中,该事件可以正常运行,但如果我尝试在文本字段中使用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>

1 个答案:

答案 0 :(得分:0)

在这里,我将指出你所犯的一些错误:

当您创建三个或更多表时此语句

  

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属性,因为它是一个nodelist而nodelist没有value属性。它只有length属性.inside 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);
}