2010-10-27 33 views
1

的可能的誤解基本上我有一些事件偵聽器及其處理函數定義如下:的JavaScript循環越過環約束,封

<div id="postTextBlock"/> 
<div id="postImageBlock"/> 
<div id="postQuoteBlock"/> 
<div id="postLinkBlock"/> 

document.getElementById('postTextBlock').addEventListener('click', function() { showPostType(postTextBlock) }, false); 
document.getElementById('postImageBlock').addEventListener('click', function() { showPostType(postImageBlock) }, false); 
document.getElementById('postQuoteBlock').addEventListener('click', function() { showPostType(postQuoteBlock) }, false); 
document.getElementById('postLinkBlock').addEventListener('click', function() { showPostType(postLInkBlock) }, false); 

var showPostType = (function() { 
    var postTypes = new Array('postTextBlock', 'postImageBlock', 'postQuoteBlock', 'postLinkBlock') 

    return function(type) { 
     for (var i = 0; i < postTypes.length; i++) { 
      (function(index) { alert(document.getElementById(postTypes[index])) })(i) 
     } 
    } 
})() 

當我運行此我將獲得5個警報。一個用於我的數組中定義的每個postTypes,以及我猜測的最終空值是postTypes[5]。爲什麼在i = 5postTypes.length = 4)設置for循環終止時,它執行i = 5的代碼。

編輯: 我添加了它引用的html以及完整的數組值。希望這會清除一些有關代碼無法工作的內容。

+0

你確定長度是'4'嗎?有一個非常基本的循環它的工作原理:http://jsfiddle.net/tbGYV/,所以我猜錯誤是在'postTypes.length'和/或它找不到該元素。 – 2010-10-27 09:48:39

+0

你是否覆蓋了你的數組構造函數? – helle 2010-10-27 09:49:30

+0

Felix Kling:是的,它的4.我在調試器中多次檢查過它。我不知道爲什麼。我第一次遇到錯誤時做的第一件事就是使用您發佈的基本循環。 – PolandSpring 2010-10-27 09:57:51

回答

0

你知道你的代碼示例不起作用嗎?我刺殺了它所要做的事情。

http://jsfiddle.net/8xxQE/1/

document.getElementById('postTextBlock').addEventListener('click', function() { 
    showPostType('postTextBlock'); //Argument does nothing 
}, false); 
document.getElementById('postImageBlock').addEventListener('click', function() { 
    showPostType('postImageBlock'); //Argument does nothing 
}, false); 

上面傳遞的參數沒有列入的基礎上,他們什麼也沒做,反正功能代碼。

var showPostType = (function() { 
    var postTypes = new Array('postTextBlock', 'postImageBlock') 

    return function(/*type argument removed isn't referenced*/) { 
     var l = postTypes.length; 
     for (; l--;) { 
      (function(index) { 
       console.log(index, postTypes[index]); 
       alert(document.getElementById(postTypes[index])) 
      })(l); 
     } 
    } 
})() 

我添加了一些技巧,只是一個更好的方法來寫for循環的例子。你的關閉工作正常,我認爲你正在做其他事情導致此代碼無法按預期工作。爲什麼這個錯誤會運行4次,數組中只有兩個項目。我的示例每次單擊div時都會運行兩次,就像您在JSFiddle上看到的一樣。

+0

我張貼的代碼有些註釋,我想這不是很清楚什麼被遺漏了。我已經添加了其餘的代碼,所以事情會更加清晰。 – PolandSpring 2010-10-27 20:12:09

+0

有一段時間,我想我在運行代碼時也看到了5條警報,但是後來證明我算錯了。 – palswim 2010-10-27 22:54:24

0

該div的ID是「postLInkBlock」,但您正在搜索「postLinkBlock」。那是空的。

+0

這只是示例代碼中的一個錯字。我得到5個分立警報。 – PolandSpring 2010-10-27 22:34:20