2012-11-07 63 views
1

我遇到了一個問題,其中另一個頁面上的相同的JavaScript工作正常,但由於某種原因在這個特定的頁面上,它拋出一個錯誤,完全相同的代碼。在IE中的空對象

我有一個函數,獲取更新並傳遞屬性的對象來更新。

function animateTo(a,t){ 
    var speed,easing,del,cb; 
    speed = a.speed ? a.speed : 600; 
    del = a.del ? a.del : 0; 
    setTimeout(function() { 
    t.stop(true).animate({ left:a.x, top:a.y, opacity:a.opacity }, { duration: speed, easing: easeOutExpo }); 
    }, del); 

} 

在IE中它說a.speed爲null。已傳遞的對象有時具有速度屬性,有時不具有。所以我的猜測是當它沒有在IE中被識別爲空。他們是否有辦法解決這個問題。而無需每次將速度屬性添加到對象。

我以爲speed = a.speed? a。速度:600; 如果a.speed不存在,它會將其設置爲600。

UPDATE:

我認爲它可能有一些做的setTimout。 這兩個頁面之間唯一的區別是該函數被同時調用3次。在它工作的頁面上,animateTo函數的調用被隔開。看來,當我一個接一個地調用它時,我得到的速度是null或者不是隻在IE中的對象。

此外,當我移動setTimout內部的變量,我沒有得到該錯誤。但我不得不離開setTimout函數之外的del變量,當我這樣做時,我得到一個錯誤del是空或不在IE中的對象。

它似乎在第一次調用setTimout的作品,並能夠讀取一個速度,但第二個調用a.speed爲空,因爲第一個setTimeout仍然試圖找到不在周圍的局部變量。至少這是我的理論。任何人都有這個想法。

回答

0

你有正確的想法,但我認爲你的ternery操作員是問題。一套輔助理論應該解決它。

你ternery被評爲

(speed = a.speed) ? a.speed : 600; 

,而不是

speed = (a.speed ? a.speed : 600); 
+0

我從來沒有聽說過必須做你以前說的話。所以我試了一下,沒有什麼區別。 – Chapsterj

0

儘量用邏輯或代替:

speed = a.speed || 600; 

here

var whatIWant = null || new ShinyObject(); // is a new shiny object 
var whatIWant = undefined || "well defined"; // is "well defined" 
var whatIWant = 0 || 42; // is 42 
var whatIWant = "" || "a million bucks"; // is "a million bucks" 
var whatIWant = "false" || "no way"; // is "false"