問答収集 カテゴリ:JavaScriptプログラミング
現在のスレッド一覧 / 新規に質問を投稿
レス数:4 / 状態:解決済み / No:22 / ATOM
1 名前:marbo 日付:2016/06/26(日)04:03:45 ID:9oC627SOPQCi
JavaScriptの初心者です。

Chromeで、NicEditと言うWYSIWYGエディタの起動状態で、子ウィンドウからカーソル(キャレット)
の後続文字列が取得できない問題があります。空文字列?が返され、中身は空です。
しかし、特にエラーは出ません。

FireFox47.0では、後続文字列が選択され、取得出来ます。
Edgeでも一部問題はありますが、取得出来ます。

以下がそのコードです。

function getCursor(){
    var win = window.opener;
    var editor = win.document.getElementById("テキストエリアのID"); //Editor表示領域

    var sel = win.window.getSelection();
    sel.getRangeAt(0).setEndAfter(editor);//ここがChromeで思った通り動作しないように思います。

    window.alert(sel);

    var str_obj = new String(sel);
    var pos = str_obj.toString();

    return pos;
}

お分かりになりましたら、どうぞご教授して下さいませ。
2 日付:2016/06/28(火)06:09:32 ID:Z2fjSFchf0/1
ブラウザによっては、
Selection と Range オブジェクトは、コピー渡しの関係となります。
一般的な、参照で相互接続された状態ではありません。

Range の変更をブラウザに反映するには、
Selection 内の Range リストの更新も必要となります。



<span id="aaa">あいうえお</span>
<span id="bbb">かきくけこ</span>
<span id="ccc">さしすせそ</span>

<script type="text/javascript">

// ------------------------------------------------------------
// Selection オブジェクトを取得
// ------------------------------------------------------------
var selection = window.getSelection();

// ------------------------------------------------------------
// 新しい Range オブジェクトを作成
// ------------------------------------------------------------
var range = document.createRange();

// ------------------------------------------------------------
// "aaa" を選択
// ------------------------------------------------------------
range.selectNode( window["aaa"] );

// ------------------------------------------------------------
// Range リストを更新してブラウザに反映
// ------------------------------------------------------------
selection.removeAllRanges(range);
selection.addRange(range);


// ------------------------------------------------------------
// 2 秒後に実行
// ------------------------------------------------------------
setTimeout(function(){

// ------------------------------------------------------------
// "bbb" を選択
// ------------------------------------------------------------
range.selectNode( window["bbb"] );

// ------------------------------------------------------------
// Range リストを更新してブラウザに反映
// ------------------------------------------------------------
selection.removeAllRanges(range);
selection.addRange(range);

} , 2000);

// ------------------------------------------------------------
// 4 秒後に実行
// ------------------------------------------------------------
setTimeout(function(){

// ------------------------------------------------------------
// 0 番目の Range オブジェクトを取得
// ------------------------------------------------------------
var range = selection.getRangeAt(0);
if(!range) return;

// ------------------------------------------------------------
// "ccc" を選択
// ------------------------------------------------------------
range.selectNode( window["ccc"] );

// ------------------------------------------------------------
// Range リストを更新してブラウザに反映
// ------------------------------------------------------------
selection.removeAllRanges(range);
selection.addRange(range);

} , 4000);

</script>
3 名前:marbo 日付:2016/06/29(水)06:54:44 ID:9oC627SOPQCi
丁寧にご説明頂き、理解は出来ませんでしたが、参考になりました。
別の方法を考えてみます。
誠にありがとうございました。
4 名前:状態変更 日付:2016/06/29(水)06:55:59 ID:9oC627SOPQCi
この質問の状態を『解決』に変更しました。
このスレッドについて
質問の状態 :
解決済み
投稿開始日 :
2016/06/26(日)04:03:45
投稿終了日 :
2016/07/06(水)06:56:29
投稿者 :
marbo
レス総数 :
4
スレッド番号 :
22
MondoCollectionSystem ver.0x00020000 by Hakuhin