2012-09-10 121 views
7

在Chrome和Safari(可能還有其他基於Webkit的瀏覽器)下,它仍然可以輸入一個CONTENTEDITABLE DIV後,即使在格失去焦點。力CONTENTEDITABLE DIV停止接受輸入它失去焦點的Webkit

我建了一個簡單的例子來說明這個問題:http://jsfiddle.net/yfcsU/3/

的例子有兩個要素:與contenteditable="true"一個div和一個鏈接單擊時,將觸發對CONTENTEDITABLE DIV模糊事件。

當用戶點擊該鏈接時,CONTENTEDITABLE格失去焦點,但你仍然能夠在輸入div和任何按鍵會使它重新集中。

此行爲是在Firefox它的工作原理不同預期:點擊鏈接會導致CONTENTEDITABLE DIV停止接受輸入。

在Webkit中,有沒有辦法迫使CONTENTEDITABLE DIV停止接受輸入它失去焦點而對DIV禁用CONTENTEDITABLE後?

+1

確實如此,但焦點大綱已消失,並且當您再次開始鍵入時重新觸發焦點事件。 – dcro

回答

8

答案標記爲正確的,其實是正確的,但我會增加另一個可能更直接一點的解決方案。當你呼籲CONTENTEDITABLE模糊()格你要調用此:

window.getSelection().removeAllRanges(); 

測試在這裏:http://jsfiddle.net/mareksuscak/oytdoxy8/

在我看來,它做同樣的工作,也解釋了爲什麼它不能正常工作 - 通常選擇範圍在模糊時從輸入元素中刪除,但不知何故無法執行contentEditable div,因此在輸入任何字符/解鎖後,它將再次聚焦。

+1

我更喜歡這個解決方案,因爲它不會直接混淆DOM,這可能導致迴流(https://www.nczonline.net/blog/2009/02/03/speed-up-your-javascript-part- 4),並且也解決了這個問題。謝謝!! – Jun

8

與此掙扎了一會兒後,我ALBE找到一種方法來強制CONTENTEDITABLE元素停止接受Webkit的輸入。

的解決方案是創建臨時編輯的元素,將其添加到DOM,其聚焦,然後將其刪除。這會導致頁面上任何其他可用內容自動停用。

此等效jQuery代碼是:

$('<div contenteditable="true"></div>').appendTo('body').focus().remove() 

我已經更新了原來的例子,包括該技術的演示:http://jsfiddle.net/yfcsU/4/