2011-09-21 98 views
3

我試圖在頁面上的所有CKEditor textareas上設置焦點事件。下面是加載jQuery的文件準備代碼:CKEditor循環僅適用於最後一個實例

for (var i in CKEDITOR.instances) { 
    alert(CKEDITOR.instances[i].name); 
    CKEDITOR.instances[i].on('focus', function() { 
     alert(CKEDITOR.instances[i].name); 
     remove_invalidation(CKEDITOR.instances[i].name); 
    }); 
} 

(注:remove_invalidation()是我寫的,只是去除了一些CSS的textarea的格式化功能,它不應該影響這個問題。)

我添加了一些警報來查看發生了什麼。所以,如預期的那樣,當文檔就緒事件啓動這個代碼時,我得到一個接一個的textarea,並且每個CKEditor textareas的名字都一樣。這樣可行。

但是,當我點擊裏面的任何textareas爲他們提供焦點時,警報總是彈出頁面上最後一個textarea的名稱。

+0

在運行'console.log(CKEDITOR.instances);'時,你在Firebug或其他控制檯上有什麼? – atma

回答

7

試試這個:

for (var i in CKEDITOR.instances) { 
    (function(i){ 
     alert(CKEDITOR.instances[i].name); 
     CKEDITOR.instances[i].on('focus', function() { 
      alert(CKEDITOR.instances[i].name); 
      remove_invalidation(CKEDITOR.instances[i].name); 
     }); 
    })(i); 
} 

的問題是,你是焦點事件中使用在每個相同的我,而我正在遞增到最後編輯的價值。將代碼放在一個立即執行的函數中,通過給代碼提供它自己的作用域來解決這個問題。

+0

謝謝!一位同事,我也想出了一個類似的解決方案。我們使用了與上面相同的代碼,但在焦點事件函數中,我們將「CKEDITOR.instances [i]」更改爲「this」,它的工作原因與您所描述的相同。 –

1

複述的MDN article Closures(部分「在循環中創建封閉件:一個常見的錯誤」):

許多封閉件已經由環產生的,但每一個共享 相同的單個詞法環境,它有一個變量 值(i)。當執行 on('focus')回調時確定i的值。因爲到那時循環已經運行了 當然,i變量(由所有 閉包共享)已經被指向CKEDITOR.instances 列表中的最後一個條目。

相關問題