2013-06-12 33 views
0

我在HTML表格中有一個字段,用戶可以在其中編輯值。當用戶點擊該字段的其中一個單元格時,textarea出現在這個單元格上,用戶編輯他想要的任何內容,當他在該textarea外單擊時,它會回到正常文本。你知道,標準的東西。textarea在內部點擊時模糊

textarea editor

所有這一切都與的onfocus正常工作的onblur事件,除了一兩件事:當我點擊 textarea的(例:我想編輯的某一部分文字通過在兩個字母之間點擊),onblur事件仍然被調用,從而關閉textarea,這不是我想要的。

我很難理解事件被調用的原因。這種現象叫做事件傳播我聽說過嗎?我該如何解決或修復此問題?

這裏是我的相關情況代碼(減輕了一下):

的Javascript

// Create a function that updates a table cell once the textarea loses focus (do not be confused with "losing its Ford Focus") 
function createBlurFunction(cell, textArea, functionName) { 
    return function() { 

     var xmlhttp = new XMLHttpRequest(); 
     xmlhttp.onreadystatechange = function() { 

      if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 

       var result = JSON.parse(xmlhttp.responseText)[0]; 

       /* Do stuff with AJAX result */ 
      } 
     } 

     // Empty cell 
     cell.innerHTML = ""; 

     // Send AJAX request 
     xmlhttp.open("GET","Some AJAX parameters", true); 
     xmlhttp.send(); 
    } 
} 

// textArea is already defined somewhere else 
textArea.addEventListener('blur', createBlurFunction(cell, textArea, cell.title), false); 

謝謝!

編輯1:

我用了一個類似的結構在其他地方在我的網頁(textarea的當您單擊之外的消失)和行爲是不同的:textarea的不走,當我點擊裏面的。

但是,我用複製/從上面的代碼粘貼,所以我可能會懷疑一個代碼錯誤或東西...

+0

我不知道這是否是問題,但在最後一行,您是否嘗試將偵聽器放在'onblur'事件而不是'blur'上? –

+0

addEventListener不需要事件名稱參數的「on」;) –

+0

我的不好,我試圖找出發生了什麼問題。你有沒有嘗試在這些函數中加入一些'alert()'或'console.log()'來檢查它們的執行時間?您可以嘗試通過這種方式找到這些不需要的*事件觸發源。 –

回答

1

你可以把模糊功能上超時,並在您的焦點偵聽器,清除超時。

var timer; 
function createBlurFunction() { 
    var myFunc = function() { ... } 
    return function() {timer = setTimeout(myFunc(),300);}; 
} 

function myFocusFunction() { 
    clearTimeout(timer); 
    //do stuff 
} 
+0

我不確定要了解這將有助於:/ –

+0

哦,問題不在於blur事件是在點擊textarea時觸發,即使你仍然關注它?如果你以後沒有重新關注它,這隻會關閉textarea。對不起,如果我誤解了你的問題! – Patrick

+0

沒有這個問題,我只是不確定我完全理解你的代碼。如果我沒有弄錯,你的事情是模糊創建一個定時器,如果保持焦點被取消? –