焦点事件监听器在不可编辑的输入上不发生作用。

问题描述 投票:1回答:1

我试图让焦点事件监听器在用户试图在地址字段中输入P.O.Box时开火。 我无法编辑输入,以获得一个简单的按键解决方案。 我的代码中缺少了什么,我没有得到警报?

http:/jsfiddle.netZQQS97

<input type="text" size="25" maxlength="75" name="ShipAddress1" id="v65-onepage-shipaddr1" value="" style="" onkeydown="">

<script type="text/javascript">  
    document.addEventListener("focus", function killPObox(id) {
        var idValue = document.getElementById('v65-onepage-shipaddr1').value;   
        if (id == 'v65-onepage-shipaddr1') {
            function runVal() {
               if (idValue.substr(0,4).toUpperCase() === "PO B" || idValue.substr(0,5) === "P.O. ") {
                    alert("USA Light cannot ship to P.O. Boxes. Please enter a street address.");
                    }
                }
                    setInterval(runVal(),1);
            }
        }, true
    );
</script>
javascript html forms validation dom-events
1个回答
3
投票

我列出了一些问题(除了底部的解决方案)。

1) 正如Halcyon所提到的, id 在你 killPObox(id) 函数分配给了事件,所以你可以通过先获取事件的 target 的活动,这将是你的 <input>.

2) 正如Barmar提到的,事件监听器被添加到文档中,而不是输入元素本身。

3) 正如Halcyon所提到的,事件监听器被添加到文档中,而不是输入元素本身。setInterval() 接受一个函数,而不是一个函数的评估结果。

4) setInterval() 并不是一个好的解决方案,因为这将使你的检查运行不必要的次数。特别是当用户收到警报时,用户会持续收到警报。我们可以通过利用更合适的事件监听器来解决这个问题,例如 input.

(5) focus 事件不是一个很好的监听事件。我们可以使用 input 事件来监听你的 <input>.

下面的代码段解决了上述问题。运行该代码段,看看它的功能是否符合您的要求。

document.getElementById('v65-onepage-shipaddr1')
  .addEventListener('input', function killPObox(e) {
    var targetValue = e.target.value;
    if (targetValue.substr(0, 4).toUpperCase() === "PO B" || targetValue.substr(0, 5) === "P.O. ") {
      alert("USA Light cannot ship to P.O. Boxes. Please enter a street address.");
    }
  }, true);
<input type="text" size="25" maxlength="75" name="ShipAddress1" id="v65-onepage-shipaddr1">
© www.soinside.com 2019 - 2024. All rights reserved.