2010-09-27 61 views

回答

1

Have a look at this piece of code:

var editable = $(document.getElementById('edit').contentWindow.document); 

editable.attr('designMode', "on").keyup(function(){ 
    var length = $(this).find('body').children('br, p, div').length; 

    if($(this).find('body').html().length && !length){ 
     length = 1; 
    } 

    $('#lc').text(length); 
}); 

下面是測試的各種瀏覽器的行爲:

  • 火狐3.6<br />標籤附加到形成換行符。在開始時,沒有<br />,而在第一個換行符之後,在當前光標位置之前添加一個,而在
  • 之間添加一個
  • Chrome<div>用於包含每一行。 <br />用於空行。第一行不包裝
  • IE 8兼容性<p>用於包含每一行。

課程:請勿使用contentEditabledesignMode!這種行爲是非常不一致的,對於這種情況來說毫無用處。當然你可以用黑客來解決這個問題,但是當新的瀏覽器出來時會發生什麼?你必須保持這種狀態直到時間結束!

+0

你建議我做什麼而不是使用contentEditable或designMode? – David 2010-09-27 04:50:46

+0

@David這取決於你在做什麼。如果你需要WYSIWYG編輯器,那麼完整的軟件包已經在那裏了,比如TinyMCE和其他軟件。如果你需要一個純文本編輯器,那麼就使用'textarea'!或者,如果您需要所見即所得,請認真考慮使用諸如Markdown之類的東西,因爲無論您選擇哪一個產生的HTML,幾乎總是垃圾 – 2010-09-27 05:02:27

+0

...或者查看[CodeMirror](http://codemirror.net/)一個代碼編輯器... – 2010-09-27 05:09:11

1

這是一個很好的開始:http://jsfiddle.net/ysgEf/3/

它返回錯誤的行號,但代碼正在工作,現在比沒有好。

知道了這一點:跨瀏覽器的實現是不同的!從iframe的內容中查找行號不是一項簡單的任務!

** 編輯 **

基於Yi Jiang的回答是:

var editable = $(document.getElementById('edit').contentWindow.document) 
    .find('body').css({'overflow':'auto', 'white-space':'nowrap'}).end(); 

editable.attr('designMode', "on").keyup(function(){ 
    var length = $(this).find('body')[0].childNodes.length; 

    $('#lc').text(length); 
});​ 

這也算個文本節點,而不是JQuery的返回。並且也不會包裝周圍的線條。

+0

請在您的答案中包含代碼。此外,這種情況很容易解決:「輸入b進入」現在回到第一行輸入任何內容並點擊「輸入」。 – 2010-09-27 04:20:35

+0

@Peter Ajtai,看編輯 – 2010-09-27 11:23:03