私はcontenteditable div
を持っており、現在のキャレット位置にある単語を知る必要があります。私はthis solutionを試しましたが、問題は、@
と~
のような特殊文字は認識されません。だから、~fool
のように、~
で始まる単語は、となりますが、私は~fool
です。だから私は、選択を元に戻した後に遭遇した文字がスペースではない場合、スペースに遭遇するまで後方に移動し続けることを考慮して、解決策を修正しようとしました。それは選択の始まりになります。同様に、私はスペースを見つけるまで前進し続け、それは選択の終わりを示すでしょう。それから、その選択は私にその言葉を与えるだろう。キャレット位置を取得するために、私はthis solutionを使用しました。私のコードは以下のようになります:コンテンツ編集可能divのキャレットに特殊文字で始まる単語を取得
function getCaretPosition(editableDiv) {
var caretPos = 0,
sel, range;
if (window.getSelection) {
sel = window.getSelection();
if (sel.rangeCount) {
range = sel.getRangeAt(0);
if (range.commonAncestorContainer.parentNode == editableDiv) {
caretPos = range.endOffset;
}
}
} else if (document.selection && document.selection.createRange) {
range = document.selection.createRange();
if (range.parentElement() == editableDiv) {
var tempEl = document.createElement("span");
editableDiv.insertBefore(tempEl, editableDiv.firstChild);
var tempRange = range.duplicate();
tempRange.moveToElementText(tempEl);
tempRange.setEndPoint("EndToEnd", range);
caretPos = tempRange.text.length;
}
}
return caretPos;
}
function getCurrentWord() {
var sel, word = "";
if (window.getSelection && (sel = window.getSelection()).modify) {
var selectedRange = sel.getRangeAt(0);
sel.collapseToStart();
sel.modify("move", "backward", "word");
while (sel.toString() != " " && getCaretPosition($("#editor").get(0)) != 0) {
sel.modify("move", "backward", "character");
(sel = window.getSelection()).modify;
}
sel.modify("move", "forward", "character");
sel.modify("extend", "forward", "word");
word = sel.toString();
// Restore selection
sel.removeAllRanges();
sel.addRange(selectedRange);
} else if ((sel = document.selection) && sel.type != "Control") {
var range = sel.createRange();
range.collapse(true);
range.expand("word");
word = range.text;
}
return word;
}
$(function() {
$(document).on('keyup keydown paste cut mouseup',"#editor", function() {
var word = getCurrentWord();
console.log(word);
});
});
しかし、これはまったく機能しません。それは問題ではありません。問題2は、画像に画像があり、ユーザが画像をクリックしても、ハンドラは画像の前に最後の単語を戻し続けますが、空の文字列が必要です。誰も私がこれら2つの問題を解決するのを助けることができます
私はその男であることを憎むが、それはあなたが一緒にあなたのニーズに合わせて作業溶液を入れるために必要なすべてを持っている2件の回答の間のように聞こえます。いずれかの答えをマークする必要はありません。あなた自身のために何かを稼働させるための十分なソリューションがあると思ってください。P –
私は自分自身で何かを試しています。 – SexyBeast
私の謝罪、私はあなたが怠け者であることを暗示するつもりはなかった。ちょうど2つの答えの間に私は答えが潜んでいると思うことを意味した。 –