【问题标题】:Cannot read property removeChild of null in jsni无法在 jsni 中读取 null 的属性 removeChild
【发布时间】:2015-06-11 05:08:42
【问题描述】:

我正在处理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";
            }
        }
    }
}

【问题讨论】:

    标签: javascript gwt removechild jsni


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-05
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多