何年も前、ちょっと待って、コンテンツ編集可能 (右上隅) を検索してみましょう。 contenteditable の応用である「div は textarea のテキスト ドメインをシミュレートして高い適応性を簡単に実現する」という記事を書きました。
すべてのブラウザでサポートされている contenteditable シミュレートされたテキスト フィールドを使用すると、コンテンツの高さに応じて自動的に拡張する非常に優れたエクスペリエンスを実現できますが、HTML コンテンツを直接貼り付けることができるという大きな問題があります。以下に示すように:
前の記事では、コンテンツが純粋なテキストであることを確認するために HTML をフィルターする方法について説明しました。ただし、この方法の問題点は次のとおりです。
2. contenteditable 属性と関係のない CSS 制御メソッド
主人公が表示されます:
user-modify .
サポートされる属性値は次のとおりです:
user-modify: read-only;user-modify: read-write;user-modify: write-only;user-modify: read-write-plaintext-only;
ここをクリックできます: CSS user-modify 属性の動作デモ
読み取り/書き込みおよび読み取り/書き込み平文専用の値が設定されていることがわかります。
2 つの違いは、リッチ テキストを入力できるのに対し、次の要素はプレーン テキストのみを入力できることです。 Web ページからコンテンツの一部をコピーして貼り付けて見てみましょう:
OK、この時点で、この記事のタイトルに対する答えは実際にはすでに存在しています。つまり、要素を
user-modify: read-write-plaintext-only
カッコいいじゃないですか!ただし、申し訳ありませんが、現在、read-write-plaintext-only 値をサポートしているのは Webkit カーネル ブラウザだけです。そのため、実際の使用法は次のとおりです。
-webkit-user-modify: read-write-plaintext-only
3. 標準の contenteditable 属性値を使用した HTML 制御方法
TuSimple が壊れたとき、私の頭の中には contenteditable="true" と contenteditable="false" しかありませんでした。後で、私が甘すぎることに気づきましたが、新しいドラフトには他にもあることが明確に記載されていました。属性値:
contenteditable 属性は、キーワードが空の文字列 ("")、"events"、"caret"、"typing"、"plaintext-only"、"true" である列挙型属性です。追加の状態が 1 つあり、これは欠落値のデフォルト (および無効な値の継承) です。
聞かないでください。 「イベント」と「キャレット」が何のためにあるのかはわかりませんが、「プレーンテキストのみ」については知っています。エディターにそのエリアにプレーンテキストのみを入力させることはできます。ここではデモは必要ありません。下のボックスを試して、リッチ テキストを作成できるかどうかを確認してください。
contenteditable=""contenteditable="events"contenteditable="caret"contenteditable="plaintext-only"contenteditable="true"contenteditable="false"
つまり、contenteditable="plaintext-only" は、CSS-only -webkit-user-modify: read-write-plaintext-only と同じです。現在、Chrome ブラウザーでのみサポートされています。
<div contenteditable="plaintext-only"></div>
ですから、もしあなたのプロジェクトにまだ多くの IE8 ブラウザ ユーザーがいるのであれば、素晴らしいものをすぐに使用できないのは残念でなりません。最後の手段として、次の方法を模索する必要があります。
4. ペーストイベントを制御するための JS 制御メソッド
単にキーボードをタップした場合、入力内容は実際にはプレーンテキストです。たとえば、いくつかの特別な状況を除いて、IE ブラウザの下の編集ボックスは、修飾された URL アドレスへのリンクを自動的に追加します。リッチテキスト汚染は主にコピー&ペースト時に発生します。そのため、ペースト時にクリップボード内のコンテンツに対して HTML フィルタリングを実行し、コンテンツを手動で挿入できれば、入力できない問題は完全に解決できるのではないでしょうか。リッチテキストに問題がありますか? ?
于是,鄙人不才,一番折腾,弄出了下面的代码:
$('[contenteditable]').each(function() { // 干掉IE http之类地址自动加链接 try { document.execCommand("AutoUrlDetect", false, false); } catch (e) {} $(this).on('paste', function(e) { e.preventDefault(); var text = null; if(window.clipboardData && clipboardData.setData) { // IE text = window.clipboardData.getData('text'); } else { text = (e.originalEvent || e).clipboardData.getData('text/plain') || prompt('在这里输入文本'); } if (document.body.createTextRange) { if (document.selection) { textRange = document.selection.createRange(); } else if (window.getSelection) { sel = window.getSelection(); var range = sel.getRangeAt(0); // 创建临时元素,使得TextRange可以移动到正确的位置 var tempEl = document.createElement("span"); tempEl.innerHTML = "&#FEFF;"; range.deleteContents(); range.insertNode(tempEl); textRange = document.body.createTextRange(); textRange.moveToElementText(tempEl); tempEl.parentNode.removeChild(tempEl); } textRange.text = text; textRange.collapse(false); textRange.select(); } else { // Chrome之类浏览器 document.execCommand("insertText", false, text); } });});
兴趣使然,目前还没再真实项目中实践过,因此,可能还有瑕疵或者缺陷。自己在demo上,IE8+,Chrome等浏览器都测试过,都是可以的。对了,demo要先放出来。
您可以狠狠地点击这里: contenteditable元素纯文本输入控制demo
demo页面有个框框,大家可以试试看,是不是只能弄进去纯文本。
昨晚打篮球,被同事肘击了下巴,开口,血如柱下,缝了3针。其实这点皮外伤没什么的,重要的也是麻烦的是,媳妇知道了,勒令2个月不准打篮球,这次抱大腿都没用了,队友也让我好好服刑。
今天小朋友有些发烧,媳妇有些着急,我评估了下,应该没什么大问题,算是自我成长的第一关吧,加油!
这篇文章实际上插队了,前面还有一篇比较深入的文章,那个要写好久的。
好了,就说这么多。欢迎反馈,感谢阅读!
本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址: http://www.zhangxinxu.com/wordpress/?p=5120
(本篇完)