使用JavaScript改变可见性

25

嗨, 我有一个网页,在其中使用ajax从另一个页面检索数据,同时在进行此操作时,我想在页面上显示一个加载gif动画,因此我创建了一个带有gif图像的div。

 <div id="loading"><img src="images/loadinfo.net.gif" width="48" height="48" /></div>

这是我的CSS代码:

#content #loading {
    visibility:hidden;
    position: fixed;
    width: 48px;
    top: 0px;
}

现在我明白了,我所需要做的就是在我的加载内容的 AJAX 函数开始时将 loading div 的可见性设为 "visible",然后在结束时再将其隐藏。但是它并没有起作用,奇怪的是,如果我在 AJAX 函数开始时将 loading div 设为可见,然后立即将其隐藏,它就可以正常工作!!!

这是我的函数:

function ajaxpage(url, containerid) {
    document.getElementById('loading').style.visibility = 'visible';

    var bustcachevar = 1 //bust potential caching of external pages after initial request? (1=yes, 0=no)
    var loadedobjects = ""
    var rootdomain = "http://" + window.location.hostname
    var bustcacheparameter = ""

    var page_request = false
    if (window.XMLHttpRequest) // if Mozilla, Safari etc
    page_request = new XMLHttpRequest()
    else if (window.ActiveXObject) { // if IE
        try {
            page_request = new ActiveXObject("Msxml2.XMLHTTP")
        } catch (e) {
            try {
                page_request = new ActiveXObject("Microsoft.XMLHTTP")
            } catch (e) {}
        }
    } else
    return false
    page_request.onreadystatechange = function () {
        loadpage(page_request, containerid)
    }
    if (bustcachevar) //if bust caching of external page
    bustcacheparameter = (url.indexOf("?") != -1) ? "&" + new Date().getTime() : "?" + new Date().getTime()
    page_request.open('GET', url + bustcacheparameter, true)
    page_request.send(null)
}

function loadpage(page_request, containerid) {
    if (page_request.readyState == 4 && (page_request.status == 200 || window.location.href.indexOf("http") == -1)) document.getElementById(containerid).innerHTML = page_request.responseText

}

function loadobjs() {
    if (!document.getElementById) return
    for (i = 0; i < arguments.length; i++) {
        var file = arguments[i]
        var fileref = ""
        if (loadedobjects.indexOf(file) == -1) { //Check to see if this object has not already been added to page before proceeding
            if (file.indexOf(".js") != -1) { //If object is a js file
                fileref = document.createElement('script')
                fileref.setAttribute("type", "text/javascript");
                fileref.setAttribute("src", file);
            } else if (file.indexOf(".css") != -1) { //If object is a css file
                fileref = document.createElement("link")
                fileref.setAttribute("rel", "stylesheet");
                fileref.setAttribute("type", "text/css");
                fileref.setAttribute("href", file);
            }
        }
        if (fileref != "") {
            document.getElementsByTagName("head").item(0).appendChild(fileref)
            loadedobjects += file + " " //Remember this object as being already added to page
        }
    }
    document.getElementById('loading').style.visibility = 'hidden';
}

2
请下次缩进您的代码。 - Daniel Baulig
你在评论中提到了“已加载页面”。可以推测,你的ajax返回了一些片段,这些片段被加载到了“当前”页面中,是吗?正在加载什么?loadobjs()如何使用?虽然你已经包含了它,但在你的代码中并没有调用它。我在快速测试中使用了你提供的代码,并且它按预期工作。你能给我们指出一个实时页面吗? - squidbe
3个回答

44
function loadpage (page_request, containerid)
{
  var loading = document.getElementById ( "loading" ) ;

  // when connecting to server
  if ( page_request.readyState == 1 )
      loading.style.visibility = "visible" ;

  // when loaded successfully
  if (page_request.readyState == 4 && (page_request.status==200 || window.location.href.indexOf("http")==-1))
  {
      document.getElementById(containerid).innerHTML=page_request.responseText ;
      loading.style.visibility = "hidden" ;
  }
}

2
如果你只想在获取响应时显示它,请将以下内容添加到你的loadpage()函数中。
function loadpage(page_request, containerid){
   if (page_request.readyState == 4 && page_request.status==200) {
      var container = document.getElementById(containerid);
      container.innerHTML=page_request.responseText;
      container.style.visibility = 'visible';
      // or 
      container.style.display = 'block';
   }
}

但这完全取决于你如何在第一次隐藏div。

不,我想在从另一个页面检索数据时显示它。 - max
哦,那么在进行请求之前先更改容器样式。 - Ibu
显示 = '块';仅对一个页面有效,当我单击加载的页面中的链接时,会出现以下消息:对象必需行:22字符:1代码:0而这一行是:document.getElementById('loading').style.display ='块';... - max
检查是否有一个id为'loading'的元素。 - Ibu

1
使用display代替visibility。对于不可见的元素,使用display: none;对于可见的元素,则不需要设置任何属性。

这个可以工作,但只适用于一个页面,当我在加载的页面中点击链接时,会出现以下错误信息: 消息:对象必需 行:22 字符:1 代码:0而这一行是: document.getElementById('loading').style.display = 'block'; - max
读起来像是找不到任何id为“loading”的元素,您可以通过将该行分成两部分进行测试:var loading = document.getElementById(“loading”); loading.style.display =''; 我不使用'block',我只使用'none'或''。我认为默认值是'inline',但我只是将其未指定,不确定为什么每个人都那么喜欢'block' ;) - mikey
此外,Max,你所说的一页和已加载页面是什么意思并不清楚。 - mikey
忘记只有一个链接有效(无论哪个)!在单击第一个链接后,其他链接都不起作用。所以我按照你说的做了,现在我从第二部分得到错误“loading.style.display ='';”。 - max
loading.style.display=''; 但这不是你的问题。由于某种原因,document.getElementById("loading") 看起来返回了null,这意味着第二次没有找到任何ID为"loading"的元素。你尝试使用Firefox /w Firebug了吗?它可能会帮助你关注事情并调试问题。 - mikey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接