2012-10-25 35 views
0

我jEditable工作正常,用textarea編輯對象內的內容。我使用jEditable的onblur選項將onBlur直接提交給一個函數(而不是url),並且所有的工作都如預期一樣,除非你改變了窗口的使用。 ALT + TAB。當我使用alt +選項卡時,它看起來像通過實際的http請求提交的內容忽略了我的回調函數。jEditable提交onBlur失敗,ALT + TAB

我非常基本的樣本實現是這樣的:

$(".editable").editable(function(content,settings){ 
     content = content.replace(/\n/gi,"<br />"); 
     return content; 
    },{ 
    data: function(value, settings) { 
     return value.replace(/<br[\s\/]?>/gi, '\n'); 
    }, 
    type: "textarea", 
    onblur: "submit" 
});​ 

你可以在這裏進行測試:http://jsfiddle.net/xmajox/wePp5/

我已經嘗試了所有其他窗口操作:調整大小,移動等,甚至標籤之間移動在瀏覽器上效果很好(提交數據並退出編輯模式)。

任何想法如何可能被馴服?

更新: 經過幾個測試和其他人的一些colaboration,似乎這取決於操作系統(窗口管理器?)。它在ubuntu 12.10上始終如一地發生,但不會在Mac或Windows上發生(未測試其他Linux盒)。

此外,現在證明我的回調方法在我使用alt-tab時運行,但是之後表單無論如何都會POST'd。添加一個live preventDefault似乎沒有幫助。

回答

0

找到了解決這個問題的辦法,但是不知道爲什麼會發生這種情況。

首先,我必須是這個世界上最幸運的人,因爲我已經在其他組合的第十位嘗試過了,它沒有這個問題,只有我能得到它的地方是:

Ubuntu 12.10 (with Unity) and Chrome (v22 at the time of this post) 

聲明:這並不意味着它不會在其他地方發生,我只是不能在我測試的那些(或要求測試的朋友)上重現它。

問題: 丟失焦點時,jEditable - 爲1.7.1版本 - 在實際執行任何操作(默認爲200ms),以防止根據源代碼中的註釋重複的動作之前設置超時。如果在超時被觸發之前(即在數據被提交併且你的方法被運行之前)你(使用上面的瀏覽器/操作系統組合)alt +標籤離開瀏覽器窗口,它將強制POST請求與數據完全忽略preventDefaults或返回False。 如果按下alt ...按住(超過200ms,即足夠的時間點擊超時),則不會出現此問題,然後按alt移開。

解決方案: 我編輯jEditable的源代碼,以減少超時(甚至刪除)。所以,我周圍的線路280,在那裏說:

(...) 
    input.blur(function(e) { 
     // prevent double submit if submit was clicked 
     t = setTimeout(function() { 
       form.submit(); 
     }, 200); 
    }); 
(...) 

我把它改爲:

(...) 
    input.blur(function(e) { 
     form.submit(); 
    }); 
(...) 

注: 我刪除了這一點,因爲在我的情況(僅提交上模糊,沒有任何文字區域允許用戶提交數據的其他控件)我不能再現Mika Tuupola在評論中提及的雙提交問題。如果在提交onBlur處於活動狀態時有文本輸入字段(按Enter提交),則可能會陷入這種情況。在這些情況下,我建議你減少超時時間,或者乾脆避免使用onBlur提交。