无法在jsni

时间:2015-06-11 05:08:42

标签: javascript gwt removechild jsni

我正在研究gwt。我写了一段代码来显示一个弹出窗口,这个弹出窗口发生得非常好,它会在5秒后自动进行,如果有人点击弹出窗口,那么它将保持到用户点击弹出窗口之外(点击html正文)。

整个功能正常工作,但在它消失后出现错误

错误是

  

未捕获的TypeError:无法读取null的属性'removeChild'

public static void popupError(){

    var sr,sm,mb1;

    sr=$doc.getElementById('errorpopup');
    sr.innerHTML="";

    sm=$doc.createElement("div");
    sm.className="greyout";
    sm.setAttribute("style","margin-bottom: 10px;");

    mb1=$doc.createElement("div");
    mb1.className="mob-maskbody";

        var rightside = $doc.createElement("div");
        rightside.className="pad10";

            var errortext= $doc.createElement("div");
            errortext.className="nh6 center bold";
            errortext.innerHTML=error;

            rightside.appendChild(errortext);

    mb1.appendChild(rightside);

    sm.appendChild(mb1);
    sr.appendChild(sm);

    fadding();

    $doc.body.onclick = function()
    {
        fadding();
    }

    function fadding()
    {
        if(sr.childNodes[0]!=null || sm!=null)
        {
            var hideFadeTimer;
            var hideDelayTimer;

            hideFadeTimer = setTimeout(function()
            {
                if(sm!=null){
                    sm.className="greydout";
                }
            },2500);

            hideDelayTimer = setTimeout(function()
            {
                if(sm!=null){
                    sm.parentNode.removeChild(sm);

                    hideFadeTimer = null;
                    hideDelayTimer = null;
                    $doc.body.onclick = null;
                }
            },5000);

            sm.onclick = function(event)
            {
                event.stopPropagation();

                if(hideDelayTimer)
                {
                    clearTimeout(hideDelayTimer);
                }
                if(hideFadeTimer)
                {
                    clearTimeout(hideFadeTimer);
                }
                sm.className="greyout";
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

如果您在弹出窗口外单击两次,则hideDelayTimer将被调用两次,第二次sm将没有父节点。

您每次都会检查sm是否为空,但您从未设置为null;这可能是问题所在:将其从父节点中删除后将其设置为null(我相信你可以在事件处理方面做得更好)。