2010-12-15 11 views
1

私は基本的に何か非常に単純なことをしたい:ユーザーにツイートを入力させ、140文字後に灰色になるテキストを切り捨てたい。 は簡単でしょうか?あなたが入力したときにcontentEditable要素をフォーマットします

私は書式設定にcontentEditableプロパティを使用しています。 keyupイベントでは、テキストが長すぎるかどうかを確認し、余分な文字を<span>に移動します。しかし、選択は途中で失われます。

私はすでに多くのことを試しましたが(thisを含む)、何もうまくいかず、あなたは私を助けてくれますか?私はあなたが実際の例を与えることができるなら、それが私を最大限に助けるだろうと思う。

+0

リンク先の回答を試したときに、正確には機能しなかったものは何ですか?私たちが見ることができる例がありますか? –

+0

ここに例があります:http://jsfiddle.net/g7KJ5/「Uncaught TypeError:プロパティ 'previousSibling' of nullを読み取ることができません」 – eWolf

+0

@Tim:これを修正できるなら、本当に素晴らしいでしょう:-) – eWolf

答えて

1

私は興味があったので、これを取った。面倒なほど大量のコードですが、それはまさにそれです。私の新しいバージョンではRangyのsaveSelection()は使用されていませんが、IE互換のためにクロスブラウザRangeサポートが使用されています。それはここに投稿するにはあまりにも多くのコードですので、私はちょうどjsfiddleにリンクされます:http://jsfiddle.net/timdown/g7KJ5/9/

+0

問題を解決してくれてありがとう - 残念ながら、あなたのソリューションはうまく動作していないようです。その一部は500msの遅延によって引き起こされるかもしれませんが(本当に必要ですか?)、時にはフォーカスを失うこともあります。 Btw:これをChrome拡張機能に使用しますので、ブラウザ間のサポートは必要ありません。 – eWolf

+0

私は告白しなければならない、私はそれには本当に満足していないと十分にそれをテストしていない。タイピング時の遅れを防ぐため、一般的には遅れを取るのが良い考えです。私はそれを試して改善するかもしれない。 –

+0

私が下に投稿した答えを見てみましょう - 別のアプローチを使って解決しました。 – eWolf

0

$.fn.softlimit = function(maxChars, wrapElement, wrapAttributes) { 
    var lastHTML, that = this[0]; 

    setInterval(function() { 
     //Only trigger on change 
     if (lastHTML == that.innerHTML) return; 
     lastHTML = that.innerHTML; 

     // Save the selection 
     var savedSel = rangy.saveSelection(); 

     // Strip HTML and extract rangy markers 
     var markers = [ ], text = '', htmlPos = 0; 

     function escapeForHTML(text) { 
      return text.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace('"', '&quot;'); 
     } 

     function processNode(node) { 
      if (node.nodeType == 3) 
       text += escapeForHTML(node.nodeValue); 
      else if (node.nodeName == 'SPAN' && node.id && node.id.indexOf('selectionBoundary_') === 0) 
       markers.push({ index: text.length, html: node.outerHTML }); 
      else 
       for (var i = 0; i < node.childNodes.length; ++i) 
        processNode(node.childNodes[i]); 
     } 

     processNode(that); 

     // Do formatting 
     var getOffset, markerOffset = 0; 

     if (text.length > maxChars) { 
      var startTag = '<' + wrapElement + ' ' + wrapAttributes + '>'; 
      var endTag = '</' + wrapElement + '>'; 

      text = text.substr(0, maxChars) + startTag + text.substr(maxChars) + endTag; 

      getOffset = function(index) { 
       if (index > maxChars) return startTag.length; 
       else return 0; 
      }; 
     } 
     else 
      getOffset = function() { return 0; }; 

     // Re-inject markers 
     for (var i = 0; i < markers.length; ++i) { 
      var marker = markers[i]; 
      var index = marker.index + getOffset(marker.index) + markerOffset; 

      text = text.substr(0, index) + marker.html + text.substr(index); 
      markerOffset += marker.html.length; 
     } 

     that.innerHTML = text; 

     // Restore the original selection 
     rangy.restoreSelection(savedSel); 
    }, 20); 

    return $(this); 
}; 

重要な手がかりだったマーカーとヒント、ため@Timダウンのおかげ:今、これは私が思い付いたものです!

関連する問題