2010-10-31 122 views
1

我有這個腳本由@Felix Kling在這篇文章HERE提供,但是當我使用它時崩潰了我的IE;在FF 3.6上,Opera,Chrome,Safari工作正常。JavaScript腳本不工作和崩潰IE

任何想法爲什麼會發生這種情況?一個修復可能?

var ajaxTimeout; 

function autorun() { 
    if ($("#contactForm").is(":visible")){ 
     if(ajaxTimeout) { 
      clearInterval(ajaxTimeout); 
      ajaxTimeout = false; 
     } 
    } 
    else if(!ajaxTimeout) { 
     ajaxTimeout = setInterval("refreshAjax();", 15000); 
    } 
} 


$(function autorun() { 
    setInterval("autorun();", 2000) 
}); 

感謝,

克里斯蒂安。

LE。對不起,忘了添加關於這個的細節。

IE剛剛關閉,「遇到錯誤,需要關閉,尋找解決方案......」。 IE 8.0 Windows7。如果我加載頁面,我無法從開發人員工具打開調試器,但是如果在加載該頁面之前打開調試器並按下開始調試,它不會顯示任何錯誤或任何內容,但頁面不會刷新網格它是想。

+0

定義「崩潰」。你得到什麼錯誤信息? – 2010-10-31 09:01:33

+0

我更新了問題。謝謝。 – Chris19 2010-10-31 09:09:29

回答

3

這裏是你以後:

$(function() { 
    var ajaxTimeout; 
    function autorun() { 
    if ($("#contactForm").is(":visible")){ 
     if(ajaxTimeout) { 
     clearInterval(ajaxTimeout); 
     ajaxTimeout = false; 
     } 
    } 
    else if(!ajaxTimeout) { 
     ajaxTimeout = setInterval(refreshAjax, 15000); 
    } 
    } 
    setInterval(autorun, 2000); 
}); 

IE在像這樣使用都喜歡叫功能,不,它的覆蓋先前定義的。 This is a long-standing bug不是fixed until IE9。問題的核心是$(function autorun() {正在接管名稱autorun,該名稱只是排隊越來越多的本身。

此外,最好將函數引用直接傳遞給setInterval(),而不是字符串。

+0

現貨,尼克。完美的作品。非常感謝,讓我瘋狂。 – Chris19 2010-10-31 09:30:32

+0

@ Chris19 - 你當然不是第一個,*很多*開發者對這個有點bal :)了:) – 2010-10-31 09:31:45

0

我懷疑這是罪魁禍首:

$(function autorun() { 
    setInterval("autorun();", 2000) 
}); 

這不是一個真正有效的JavaScript。我認爲它可能應該是這樣的:

$(document).ready(function() { 
    setInterval("autorun();", 2000); 
}); 

[編輯:有,我建議一個錯誤之上,我已經改正了。我錯誤地將setInterval(...)的結果分配給變量ajaxTimeout。這最終導致了主autorun()函數內部的邏輯來從未發起refreshAjax()其間隔,從而導致代碼出現到「什麼也不做」]


[編輯:一些人指出,我的建議是沒有提供足夠的解釋,所以我會盡力在這裏提供。]

  • 你聲明瞭function autorun()兩次。一旦在頂部,並再次在我建議你應該做出改變的底部。這兩個聲明都在相同的範圍內,所以名稱將會相互衝突,行爲將依賴於瀏覽器。一些瀏覽器會讓一個函數「隱藏」另一個,而其他瀏覽器將(可能)拒絕編譯它。

  • 您在「內聯」上下文中使用了命名函數聲明(autorun的第二個聲明)。這可能是一些瀏覽器允許的(有些人認爲它實際上是有效的,儘管我承認它不是),但它肯定會在IE中引起問題。

  • 我的建議將第二個聲明更改爲匿名聲明,以便一石二鳥:避免名稱衝突,並使用所有瀏覽器支持的語法。

  • 終於,我介紹了使用$(document).ready(...),因爲這是jQuery編程時的標準做法。你可以閱讀更多關於它on jQuery's site。長話短說 - 它直接等同於您使用的$(function() {...})語法,因此您可以隨心所欲地拿起它或放下它。

+1

我建議只是傳遞函數,而不是一個字符串來評估 – 2010-10-31 09:10:21

+0

如果你想在某個時刻步進計時器,但在其他方面完全可選,捕獲返回值很有用。 – Quentin 2010-10-31 09:20:26

+0

不,不起作用。甚至不用FF或鉻刷新網格。 – Chris19 2010-10-31 09:21:25