2010-11-30 8 views
1

実際には、は、HTMLエディタ(contenteditable iframeを使用します)内の特定のノードにカーソルを設定しようとしています。たとえば、いくつかの段落があり、カーソルを前の段落の先頭に移動したいとします。 不幸にも、Internet Explorerの範囲オブジェクトはsetStartBeforesetStartAfterをサポートしていません。 The ierange projectはオプションではありません。私が探している解決策は、そのままの状態でIEで動作する必要があります。IE(7-8)を使用してHTMLエディタでカーソルを設定するには

IEでカーソルを設定するにはどうすればよいですか? Firefoxので

解決策は単純です:

// sets the cursor position (start defines, if cursor is needed at the start or end of the node) 
function setCursor(editor, node, start){ 

var tn = editor.getDoc().createTextNode("."); // gets the editors document 
    if (start){ 
    node.insertBefore(tn, node.firstChild); 
    } 
    else node.appendChild(tn); 

    rng = editor.selection.getRng(); // gets the browsers range object for the users selection 
    rng.selectNode(tn); 
    rng.setStartBefore(tn); 
    rng.setStartAfter(tn); 

    ed.selection.setRng(rng); 
    node.removeChild(tn); // removes the caret node - curser is placed now 
} 

答えて

2

あなたはこのために私のRangyプロジェクトを使用することができます。コードはその後、すべてのブラウザで同じようになります:

また
function setCursor(element, start) { 
    var doc = element.ownerDocument || element.document; 
    var win = doc.defaultView || doc.parentWindow; 

    rangy.init(); 
    var range = rangy.createRange(doc); 
    range.selectNodeContents(element); 
    range.collapse(start); 
    rangy.getSelection(win).setSingleRange(range); 
} 

、この特定のケースでは、ライブラリなしで、あまりにもトリッキーではありません。

function setCursor(element, start) { 
    var doc = element.ownerDocument || element.document; 
    if (typeof doc.createRange != "undefined") { 
     var range = doc.createRange(); 
     range.selectNodeContents(element); 
     range.collapse(start); 
     var win = doc.defaultView || doc.parentWindow; 
     var sel = win.getSelection(); 
     sel.removeAllRanges(); 
     sel.addRange(range); 
    } else if (typeof doc.body.createTextRange != "undefined") { 
     var textRange = doc.body.createTextRange(); 
     if (start) { 
      textRange.moveToElementText(element); 
      textRange.collapse(start); 
     } else { 
      var markerEl = doc.createElement("span"); 
      markerEl.innerHTML = "\u00A0"; 
      element.appendChild(markerEl); 
      textRange.moveToElementText(markerEl); 
      element.removeChild(markerEl); 
     } 
     textRange.select(); 
    } 
} 
+0

ありがとう、作品(テストFF、IE8、Google Chrome)。 IE8がstartがfalseのときに次の行の先頭にカーソルを置く理由を知っていますか(FFは現在の段落の終わりまで設定します)? – Thariama

+0

これは、IEのTextRangeと選択処理のものが独特で迷惑なものだからです。実際にIEでは、ダミー要素が必要な場合があります。私は試して修正します。 –

+0

改訂........ –

0

Working with the Cursor Position (このソリューションはIE、FirefoxとOperaで私の作品)

+0

それはテキストエリアと特異的に扱っているため、ページが無関係であることと、一般的な編集可能なHTMLコンテンツではありません(これが質問の内容です)。また、それはあまり良くありません。 –

+0

@Tim:あなたは正しいですが、カーソルを設定するアプローチは、おそらく適合(+1) – Thariama

関連する問題