2012-03-27 24 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

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