Javascript AddEventListener只触发一次

时间:2015-02-10 21:08:15

标签: javascript html twitter-bootstrap

我有以下HTML

...
    <div class="content-row"><div class="col-md-4"></div>
            <div class="col-md-4">
                <form>
                    <div id='undiv' class="form-group"><label for="uname">Name:</label><input id="uname" type="text" class="form-control"/></div>
                    <div class="form-group"><label for="email">Email (optional):</label><input id="email" type="text" class="form-control" /></div>
                    <div class="form-group"><label for="gamecode">Game Code:</label><input id="gamecode" type="text" class="form-control" /></div>
                    <div class="form-group pull-right"><input id="join" type="button" value="Join" class="btn btn-primary btn-lg btn btn-primary btn-lg" /></div>
                </form>
            </div><div class="col-md-4"></div>
    </div>
....

body

中HTML下方的Javascript
<script type='text/javascript'>
            var uname = document.getElementById("uname");
            var email = document.getElementById("email");
            var gamecode = document.getElementById("gamecode");
            var joinbtn = document.getElementById("join");
            var notify = document.getElementById("notify");
            var undiv = document.getElementById("undiv");
...


    uname.addEventListener("blur",function(evt) {
                console.log('onblur');
                var un = uname.value;
                console.log(un);
                if(un.length >= 2) {
                    undiv.className += " has-success has-feedback";
                    undiv.innerHTML += '<span id="mark" class="glyphicon glyphicon-ok form-control-feedback" aria-hidden="true"></span>';
                }
                else {
                    undiv.className += " has-error has-feedback";
                    undiv.innerHTML += '<span id="mark" class="glyphicon glyphicon-remove form-control-feedback" aria-hidden="true"></span>';
                }
                //uname.value = un;
            });

            uname.addEventListener("focus",function(evt) {
                console.log('onfocus');
                undiv.className = "form-group";
                var mark = document.getElementById("mark");
                if(mark !=null) {
                    mark.parentNode.removeChild(mark);      
                    console.log("mark="+mark);  
                }   
            });
    </script>

unameonfocus事件onblur仅触发一次。

我在eventListener上有另一个button click event,它运行正常。

我不明白为什么focusblur eventListeners在事件发生时不会触发?

Chrome和Firefox上的调试器没有显示错误或警告......我不明白出了什么问题?

http://jsfiddle.net/ddf5h2nu/

2 个答案:

答案 0 :(得分:10)

一个好的做法是在你的桌子上放一把尺子,如果你发现自己正在键入element.innerHTML += "...",只需抓住标尺并拍打你的手背。

- )

严重的是,在+=之后使用.innerHTML非常具有破坏性且不必要,因为您可以看到导致意外结果。

另一个答案显示了如何使用DOM创建方法,这是一种好方法,但如果您想使用HTML标记,则使用.insertAdjacentHTML()而不是.innerHTML

uname.addEventListener("blur",function(evt) {
    console.log('onblur');
    var un = uname.value;
    console.log(un);
    if(un.length >= 2) {
        undiv.className += " has-success has-feedback";
        undiv.insertAdjacentHTML("beforeend", '<span id="mark" class="glyphicon glyphicon-ok form-control-feedback" aria-hidden="true"></span>');
    }
    else {
        undiv.className += " has-error has-feedback";
        undiv.insertAdjacentHTML("beforeend", '<span id="mark" class="glyphicon glyphicon-remove form-control-feedback" aria-hidden="true"></span>');
    }
    //uname.value = un;
});

您会注意到第一个参数是"beforeend",第二个参数是您的HTML。 .insertAdjacentHTML()方法接受四个不同的字符串作为第一个参数。它们如下:

  • "beforebegin" (将标记放在元素之前)
  • "afterbegin" (将标记放在元素的开头)
  • "beforeend" (将标记放在元素的末尾)
  • "afterend" (将标记放在元素后面)

因此,有四个位置可以相对于调用方法的元素插入HTML。这些不会破坏任何现有元素,这就是为什么它比.innerHTML更好。

答案 1 :(得分:1)

当您更改undiv的{​​{1}}属性时,您将导致从HTML重新创建innerHTML元素,从而丢失事件侦听器。

这是一个很好的选择:

<input>

Fiddle