繁体   English   中英

为什么我的javascript function有时不能用

[英]Why is my javascript function sometimes not working

我有一个很大的 javascript function init() 可以隐藏和显示大量的 div。 当页面加载时,javascript function 由下面的脚本触发。

<script type="text/javascript">
$(document).ready(function() {
init();
});
</script>

大多数情况下 javascript 是由下面的脚本触发的。 但是偶尔脚本 init() 似乎没有被触发。 function init() 的 20 次中大约有 1 次似乎没有被触发。 所有其他 19 倍的页面和 javascript 工作正常,没有任何错误。 出现这个错误的情况好像和平时没有什么不同,因为按F5 20次就会出现这个错误。

我检查了 init() 似乎根本没有被调用,因为 init() 中的第一条语句(警报(“函数调用”);)没有被调用。 在 javascript 工作正常的情况下,我收到了警报消息,页面加载正常,没有任何错误。

我尝试了不同的方式来触发 javascript,例如 window.onload 并将此脚本放在页面末尾:

<script type="text/javascript">init();</script>

所有这些触发 init() 的不同方法似乎没有任何区别。

这是 init() function:

function init(){
pauzereload__gl_var=1;
load2__gl_var=0;

//Hide bus options:
var boxbusnotshow = document.getElementById("boxDiv").getElementsByTagName("a");
boxbusnotshow[3].style.display="none";
boxbusnotshow[4].style.display="none";
boxbusnotshow[5].style.display="none";

document.getElementById("loadingdiv").style.display = "none";
document.getElementById("loadingdivdate").style.display = "none";
getvariables(); //Get variables generated by the php script, to get activetab

var a=1; b=1;
highlightboxinitiate(a,activetab__gl_var,load2__gl_var);
highlightlistinitiate(a,b);

pauzereload__gl_var=0;
}

这是从 init() function 调用的 highlightboxinitiate function:

function highlightboxinitiate(divnr,linenr,load2__gl_var) {

getvariables();

for (i = 1; i < 8; i++) {document.getElementById("nextnr" + i).style.display = "none";}
if(counttab__gl_var[linenr]>(9 + settab__gl_var[linenr]) && load2__gl_var==0){
document.getElementById("nextnr" + linenr).style.display = "block";}

for (i = 1; i < 8; i++) {document.getElementById("prevnr" + i).style.display = "none";}
if(settab__gl_var[linenr] >2 && load2__gl_var==0){
document.getElementById("prevnr" + linenr).style.display = "block";}

for (i = 1; i < 8; i++) {document.getElementById("pagenr" + i).style.display = "none";}
if(load2__gl_var==0 && counttab__gl_var[linenr]>9){
document.getElementById("pagenr" + linenr).style.display = "block";}


if(load2__gl_var==1){
for (i = 1; i < 8; i++) {document.getElementById("renextnr" + i).style.display = "none";}
if(counttab__gl_var[linenr]>(9 + settab__gl_var[linenr])){
document.getElementById("renextnr" + linenr).style.display = "block";}

for (i = 1; i < 8; i++) {document.getElementById("reprevnr" + i).style.display = "none";}
if(settab__gl_var[linenr] > 2){
document.getElementById("reprevnr" + linenr).style.display = "block";}

for (i = 1; i < 8; i++) {document.getElementById("repagenr" + i).style.display = "none";}
if(counttab__gl_var[linenr]>9){
document.getElementById("repagenr" + linenr).style.display = "block";}
}

var box = document.getElementById("boxDiv").getElementsByTagName("a");
current_tab__gl_var=linenr;
   for (i = 0; i < box.length; i++) {unselectboxinitiate(divnr,i);}

tabselnr = linenr-1;
if (tabselnr<=2){box[tabselnr].className="selected1";}
if (tabselnr>2 && tabselnr<=5){box[tabselnr].className="selected2";}
if (tabselnr==6){box[tabselnr].className="selected3";}


    for (j = 1; j < 10; j++) {
    for (i = 1; i < 8; i++) {
    document.getElementById("list"+j+"n"+i).style.display = "none";
    document.getElementById("it"+j+"n"+i).style.display = "none";}
    document.getElementById("list"+j+"n"+linenr).style.display = "block";
    document.getElementById("it"+1+"n"+linenr).style.display = "block";}

}

这是从 init() function 调用的 highlightlistinitiate function:

function highlightlistinitiate(divnr,linenr) {
   var box = document.getElementById("listmenu").getElementsByTagName("a");
current_list__gl_var=linenr;
   for (i = 0; i < box.length; i++) {
    box[i].className="unselected";}
    box[linenr-1].className="selected";
        for (j = 1; j < 10; j++) {
    for (i = 1; i < 8; i++) {
    document.getElementById("it"+j+"n"+i).style.display = "none";}}
    document.getElementById("it"+current_list__gl_var+"n"+current_tab__gl_var).style.display = "block";
    }

这是从 highlightboxinitiate function 调用的 getvariables function:

function getvariables(){
counttab__gl_var = new Array (7);
settab__gl_var = new Array (7);
counttab__gl_var [1] = 83; settab__gl_var [1] = 0; activetab__gl_var = 2; counttab__gl_var [2] = 111; settab__gl_var [2] = 0; activetab__gl_var = 2; counttab__gl_var [3] = 137; settab__gl_var [3] = 0; activetab__gl_var = 2; counttab__gl_var [4] = 1; settab__gl_var [4] = 0; activetab__gl_var = 2; counttab__gl_var [5] = 1; settab__gl_var [5] = 0; activetab__gl_var = 2; counttab__gl_var [6] = 1; settab__gl_var [6] = 0; activetab__gl_var = 2; counttab__gl_var [7] = 1; settab__gl_var [7] = 0; activetab__gl_var = 2; }

我的印象是这些功能没问题,因为当页面没有正确启动时,init() function 中的第一条语句没有被执行。

我检查过跨浏览器不会影响这个问题。 所有浏览器都会出现此问题。

发生错误时,我在萤火虫控制台中看不到任何错误消息。

我一直在搜索和调试很多,所以任何帮助都将非常受欢迎和感激!

你可以试试

<script type="text/javascript">
   $(window).load(function() {
      init();
   });
</script>

代替

<script type="text/javascript">
   $(document).ready(function() {
      init();
   });
</script>

问题是不知何故并非所有内容都加载到页面中,因此 javascript 崩溃了,因为它找不到所有对象。

页面末尾的以下声明有助于解决此问题:

<?php
print str_pad('',4096)."\n";
ob_flush();
flush();
set_time_limit(45);
?>

上面将所有解析的内容发送到浏览器,直到该语句为止。

您应该使用 $(document).ready 而不是 $(window).load。

这是因为 $(window).load 仅在整个页面完全加载时触发,包括(外部)images/javascript/css/frames 等。$(document).ready 在 DOM 完全加载时触发。 这意味着您已经可以进行 DOM 操作,而无需等待加载图像等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM