2012-04-08 7 views
2

많은 javascript를 숨기고 표시하는 큰 자바 스크립트 함수 init()이 있습니다. 페이지가로드되면 javascript 함수가 아래 스크립트에 의해 트리거됩니다.왜 내 자바 스크립트 함수가 작동하지 않습니다

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

대부분의 경우 자바 스크립트는 아래 스크립트에 의해 실행됩니다. 그러나 한 번씩 init() 스크립트가 실행되지 않는 것처럼 보입니다. 함수 init()의 20 배 정도가 트리거되지 않는 것 같습니다. 다른 모든 19 번 페이지와 자바 스크립트는 오류없이 잘 작동합니다. F5 키를 20 번 누르면이 오류가 발생하므로이 오류가 발생하는 상황은 정상적인 것과 다를 바없는 것처럼 보입니다.

init()의 첫 번째 명령문 (alert ("function called");)이 호출되지 않았기 때문에 init()이 전혀 호출되지 않은 것으로 확인되었습니다. 자바 스크립트가 잘 작동하는 경우 경고 메시지가 표시되고 페이지가 오류없이 올바르게로드되었습니다.

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

그 모든 다른 방법을 만들 것 같지 않았다 초기화()을 트리거 :

나는 같은 창로드로하고 페이지의 끝에서이 스크립트를 넣어 자바 스크립트를 실행할 수있는 여러 가지 방법을 시도 어떤 차이.

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";} 

} 

이되고있는 highlightlistinitiate 함수이다

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; 
} 

이 초기화() 함수로부터 호출되는 highlightboxinitiate 함수이다

는 초기화() 함수 init() 함수에서 호출 된 :

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"; 
    } 

이것은 getvariables fu입니다. highlightboxinitiate 함수에서 호출되는 nction :

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; } 

나는 페이지가 제대로 초기화() 함수의 첫 번째 문을 시작하지 않은 경우에 실행되지 않았기 때문에 기능이 확인되어 있다는 인상을 가지고있다.

크로스 브라우저가이 문제에 영향을 미치지 않는지 확인했습니다. 이 문제는 모든 브라우저에서 발생합니다.

오류가 발생하면 방화 광 콘솔에 오류 메시지가 표시되지 않습니다.

많은 검색과 디버깅을 해 주셨습니다. 도움을 주시면 감사하겠습니다.

+3

Yikes. 나는 그것을 유지하지 않기 때문에 기쁘다. –

+0

명확해야 함 (이 체크 표시를했지만 질문에 표시되지 않음) : init 함수가 실행되지 않으면 브라우저의 콘솔에 오류가 표시됩니까? – Marcin

+0

아니요 오류가 표시되지 않습니다 – BastiaanWW

답변

3

문제는 어떻게 든 모든 콘텐츠가 페이지에로드되지 않았기 때문에 모든 개체를 찾을 수 없어 자바 스크립트가 충돌했기 때문입니다.

페이지의 끝에 다음 문은이 문제를 해결 도움 :

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

위의 전송 브라우저에 그 진술까지 분석 다.

+0

언리얼이 결국 비슷한 문제를 해결할 수있게되었습니다. 나는 ob_flush();을 제거해야했다. – easiestripes

2

당신은

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

대신

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

나를 미치게 생각하지만이 방법은 서버 측 코드에 무작위로 추가하는 것보다 나은 해결책이라고 생각합니다. –

0

당신은 $ (문서) .ready 대신에 $의 (창) .load를 사용해야 시도 할 수 있습니다.

이것은 (외부) 이미지/자바 스크립트/CSS/프레임 등 전체 페이지가 완전히로드 된 경우에만 발생하기 때문에 $ (window) .load가 발생합니다. DOM이 완전히로드되었을 때 $ (document) .ready 트리거 . 즉, 이미로드 된 이미지를 기다릴 필요없이 DOM 조작을 할 수 있습니다.

관련 문제