2016-07-12 13 views
1

選択範囲を取得したら、そのクローンを作成して、選択範囲の元のコンテンツを消去します。なぜクローンオブジェクトはまだ影響を受けますか?範囲のクローニングが機能しない

MozillaのAPIドキュメントを述べ--- https://plnkr.co/edit/A3TADtyyqkS6sI8ZJeaA?p=preview

<p id='test' contenteditable="true">hello world</p> 
function test() { 
    var r = document.getSelection().getRangeAt(0).cloneRange(); 
    console.log(r) 
    $('p').empty(); 
    console.log(r); 
} 

$(function() { 
    $('p').on('click', test) 
}) 

--- EDIT:が返さ私はここでは、コードです

(それがクローン化されたので)、それは独立しただろうと思いましたクローンは参照ではなく値によってコピーされるため、いずれかの範囲の変更は他のものに影響しません。

これはちょうどjqueryのempty()メソッドのクールークですか?

+1

あなたはそれが影響を受けていると言いますか?最初のエコーは、 'Range {startContainer:text、startOffset:4、endContainer:text、endOffset:8、collapsed:false ...}'のように出現し、2番目は 'Range {startContainer:p#test、startOffset:0、endContainer :p#test、endOffset:0、collapsed:true ...} '結果を念頭に置いて、私はあなたの質問を理解できません。 – enhzflep

+0

私は2つのエコーラインが同一であると予想しました。クローンは、ドキュメントの内容に何が行われても完全に独立しているべきではありませんか? – Skyler

+0

私が知る限り、問題は範囲とクローンを作成する方法にあります。トピックのMDNページを参照してください:https://developer.mozilla.org/en-US/docs/Web/API/Range/cloneRange - 範囲取得/クローニングメソッドを使用してあなたの例を実行すると、エコーステートメントは同じです。 ;) - – enhzflep

答えて

0

私は少しGoogleを検索し、この解決策を見つけました。 お願いします。

function test() { 
    var range = document.getSelection().getRangeAt(0); 
    console.log(range) 
    var clone = range.cloneRange(); 
    console.log(clone) 
    range.collapse(true); 
    var markerElement = document.createElement("span"); 
    markerElement.appendChild(document.createTextNode("\ufeff")); 
    range.insertNode(markerElement); 
    var selection = window.getSelection(); 
    selection.removeAllRanges(); 
    selection.addRange(clone); 
    setTimeout(function(){ 
    markerElement.parentNode.removeChild(markerElement); 
    }, 250); 
} 
+0

あなたはそのコードが何をしているのか理解していますか?もしそうなら、説明があればこの答えは良いでしょう([答え]を見てください)。それ以外の場合は、元のソースに帰属することなくコピーして貼り付けるだけでSOのライセンスに反し、盗作と見なすことができます。 –

+0

うーん...本当に助けてくれるのかわからない。私はこのテストを3つの簡単なステップ、すなわち(1)選択範囲のクローン、(2)選択範囲が作成されたソースの変更、(3)先にクローンされた範囲を見てみましょう。シンプルだと思われますが、私は少しこれに新しいので、私は何かが明らかに欠けていると思う – Skyler

関連する問題