我正在研究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";
}
}
}
}
答案 0 :(得分:0)
如果您在弹出窗口外单击两次,则hideDelayTimer
将被调用两次,第二次sm
将没有父节点。
您每次都会检查sm
是否为空,但您从未将设置为null;这可能是问题所在:将其从父节点中删除后将其设置为null(我相信你可以在事件处理方面做得更好)。