2012-03-27 51 views
0

有人能告訴我爲什麼這個代碼凍結ie8?它應該生成輸入字段。在Firefox,Safari瀏覽器,鍍鉻它的工作原理,但在IN8當我按下生成按鈕,它凍結javascript freezeing ie8

var monthNames = [ "Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie", "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie", "Decembrie" ]; 

function buildMonthlyEntries() { 
    var startDate = new Date(document.getElementById('datastart').value); 
    var endDate = new Date(document.getElementById('dataend').value); 
    if (startDate == "Invalid Date" || endDate == "Invalid Date") { return null; } 

    var monthlyEntries = document.getElementById('monthlyEntries'); 
    monthlyEntries.innerHTML = ""; 

    // inclusiv dataend 
    endDate.setMonth(endDate.getMonth() + 1); 

    // start with startDate; loop until we reach endDate 
    for (var dt = startDate; 
      ! (dt.getFullYear() == endDate.getFullYear() && dt.getMonth() == endDate.getMonth()); 
      dt.setMonth(dt.getMonth() + 1) 
    ) { 
     monthlyEntries.appendChild(document.createTextNode(
        monthNames[dt.getMonth()] + " " + String(dt.getFullYear()).substring(2) 
      )); 
     var textElement = document.createElement('input'); 
     var textElement2 = document.createElement('input'); 
     var textElement3 = document.createElement('input'); 
     textElement.setAttribute('type', 'text'); 
     //textElement.setAttribute('name', 'entry['+ monthNames[dt.getMonth()] + + String(dt.getFullYear()).substring(2) + ']'); 
    textElement.setAttribute('name', 'entry[]'); 
     textElement2.setAttribute('type', 'hidden'); 
     textElement2.setAttribute('name', 'luna[]'); 
     textElement2.setAttribute('value', '' + monthNames[dt.getMonth()] + ''); 
     textElement3.setAttribute('type', 'hidden'); 
     textElement3.setAttribute('name', 'an[]'); 
     textElement3.setAttribute('value', '' + String(dt.getFullYear()) + ''); 
     monthlyEntries.appendChild(textElement); 
     monthlyEntries.appendChild(textElement2); 
     monthlyEntries.appendChild(textElement3); 
     // adauga br 
     // monthlyEntries.appendChild(document.createElement("br")); 
    } 
    return null; 
} 
+2

你有沒有嘗試在IE中調試它也看到它凍結在哪裏? – TGH 2012-03-27 04:50:42

+0

我不知道它是否與'dt.setMonth(dt.getMonth()+ 1)'在瀏覽器中有不同的行爲。 – ChaosPandion 2012-03-27 04:55:35

+0

我試過沒有+1,仍然凍結 – florin 2012-03-27 05:03:54

回答

0

如果任你的日期字符串的不是確切的正確的格式,IE8將不會返回"Invalid Date"因爲你正在測試。相反,它將返回NaN。你也需要爲此進行測試。你可以在IE8的this jsFiddle中看到這個。您可以防止通過改變這樣的:

if (startDate == "Invalid Date" || endDate == "Invalid Date" || 
    isNaN(startDate) || isNaN(endDate)) { return null; } 

其次你的for循環很容易被無限循環:

// start with startDate; loop until we reach endDate 
for (var dt = startDate; 
     ! (dt.getFullYear() == endDate.getFullYear() && dt.getMonth() == endDate.getMonth()); 
     dt.setMonth(dt.getMonth() + 1) 
) 

如果dt是有史以來比endDate更大,那麼for循環將永遠不會結束。寫這會是這樣的一個更安全的方法:

// start with startDate; loop until we reach endDate 
// make sure endDate is always after startDate 
if (endDate < startDate) { 
    var temp = endDate; 
    startDate = endDate; 
    endDate = temp; 
} 
for (var dt = startDate; 
     ! (dt.getFullYear() == endDate.getFullYear() && dt.getMonth() == endDate.getMonth()); 
     dt.setMonth(dt.getMonth() + 1) 
) 
+0

同樣的問題在這裏 – florin 2012-03-27 05:26:14

+0

@florin - 看到我新增加的第一段。 – jfriend00 2012-03-27 05:26:52

+0

你是對的...所以如果我在ie8中輸入dd-mm-yyyy這種格式的日期,它可以工作,但是這種格式不能用於其他瀏覽器。 – florin 2012-03-27 05:31:20

0

你也可以只做到< =,而不是否定嚴格==。