0

我有一系列同名的文本框

<%for(i=0;i<=nooftasks;i++){%>
<input type="text" id="duration"
name="duration" class="td4" onkeyup="durationFormat()">
}%>

在Javascript中,我必须在两位数后添加一个冒号

function durationFormat()
{
    var duration = document.getElementsByName("duration").value;
    if(duration.length==2){
        duration=duration+":";
    }
}

但我无法获得所需的结果,因为我无法从该textbox特定文本框中获取字符串。

有任何想法吗?

4

3 回答 3

2

getElementsByName返回 NodeList 而不是 Element。NodeList 就像一个数组。您需要遍历它并依次将更改应用于每个值。

即使您已经使用getElementById(它返回一个元素)并且您的输入具有唯一的 ID(您没有,这是无效的,请修复它),它仍然不会修改该值。将属性复制value到变量中然后修改它不会更改value输入的属性。您需要返回,然后input.value = duration在进行修改后返回。


如果要获取调用该函数的特定输入,则:

  1. 停止使用内在事件属性。他们是一种痛苦
  2. addEventListener改为使用
  3. 使用事件委托来简化处理程序的附加
  4. 检查目标属性以确定调用了哪个输入

这样的:

<fieldset id="durations">
<legend>Durations</legend>
<%for(i=0;i<=nooftasks;i++){%>
<input type="text" name="duration" class="td4">
}%>
</fieldset>

<script>
    function durationFormat(ev) {
        var input = ev.target;
        if (input.value.length === 2) { 
            input.value += ":";
        }
    }
    document.getElementById('durations').addEventListener('keyup', durationFormat);
</script>
于 2013-05-14T11:32:37.557 回答
2
 <input type="text" id="duration" name="duration" class="td4" onkeyup="durationFormat(this)">
<script>
 function durationFormat(obj) {
     if ((obj.value.length)== 2) {
         obj.value+=":";
     }

 }
</script>
于 2013-05-14T11:36:39.733 回答
1

您必须使用 name 循环进入您的元素duration

function durationFormat() {
    var duration = document.getElementsByName("duration");

    for (var i = 0; i < duration.length; i++) {
        if(duration[i].value == 2){
            duration[i].value += ":";
        }
    }
}

这样做的逻辑是:

  • 首先,获取所有elements具有该属性duration值的属性名称。
  • 其次,您必须在调用.getElementsByName方法时获得的元素数组内循环。
  • :最后,如果每个元素的值是 ,则必须在值的末尾加上 a 来设置每个元素的值2

对于那些不明白做什么duration[i].value += ":";的人,自动获取数组位置的输入元素的值并在末尾i添加该值。:如果你这样做,那是完全一样的duration[i].value = duration[i].value + ":";。我更喜欢使用+=,因为它是分拣机。我从未测试过,但我认为这也是浏览器在最后添加一些内容的最快方式。它也可以用于字符串变量。

于 2013-05-14T11:36:14.713 回答