1

Firefoxが範囲を選択するように指定したいと思います。range.select();を使用して、IEでこれを簡単に行うことができます。FFXは代わりにdom要素を期待しているようです。私は間違っていますか、それともこれについてもっと良い方法がありますか?

まず、テキストの選択を取得し、それを範囲に変換して(私は思いますか?)、テキストの選択を保存します。これは私が最初から範囲を取得しているところです:

    // Before modifying selection, save it
    var userSelection,selectedText = '';
    if(window.getSelection){
        userSelection=window.getSelection();
    }
    else if(document.selection){
        userSelection=document.selection.createRange();
    }
    selectedText=userSelection;
    if(userSelection.text){
        selectedText=userSelection.text;        
    }
    if(/msie|MSIE/.test(navigator.userAgent) == false){
        selectedText=selectedText.toString();
    }
    origRange = userSelection;

後で選択を変更します(正常に)。私はIEの範囲とffxのdomIDによってそうします。しかし、それを行った後、選択範囲を元の選択範囲に戻したいと思います。

これはIEの魅力のように機能します。

setTimeout(function(){
    origRange.select();
},1000);

私はFFXでこのようなことをしたいと思います:

var s = w.getSelection();
setTimeout(function(){
    s.removeAllRanges();
    s.addRange(origRange);
},1000);

残念ながら、FFXは協力的ではなく、これは機能しません。何か案は?

4

2 に答える 2

1

簡単に言うと、IEと他のブラウザーは、JavaScriptを使用してテキストを選択する実装が異なります(IEには独自のメソッドがあります)。JavaScriptを使用したテキストの選択をご覧ください。

また、MDCのsetSelectionRangeを参照してください。

編集:小さなテストケースを作成した後、問題が明らかになります。

<!DOCTYPE html>
<html>   
  <head> 
    <meta charset="UTF-8">
    <title>addRange test</title>
    <style>
      #trigger { background: lightgreen }
    </style>
  </head>
  <body> 
    <p id="test">This is some (rather short) text.</p>
    <span id="trigger">Trigger testCase().</span>
    <script>
var origRange;

var reselectFunc = function () {
    var savedRange = origRange;
    savedRange.removeAllRanges();
    savedRange.addRange(origRange);
};

var testCase = function () {
    // Before modifying selection, save it
    var userSelection,selectedText = '';

    if(window.getSelection){
        userSelection=window.getSelection();
    }
    else if(document.selection){
        userSelection=document.selection.createRange();
    }
    selectedText=userSelection;
    if(userSelection.text){
        selectedText=userSelection.text;
    }
    if(/msie|MSIE/.test(navigator.userAgent) === false){
        /* you shouldn't do this kind of browser sniffing,
           users of Opera and WebKit based browsers
           can easily spoof the UA string */
        selectedText=selectedText.toString();
    }
    origRange = userSelection;

    window.setTimeout(reselectFunc, 1000);
};

window.onload = function () {
    var el = document.getElementById("trigger");
    el.onmouseover = testCase;
};
    </script>
  </body>
</html>

Firefox、Chromium、およびOperaでこれをテストすると、デバッグツールは、を呼び出しremoveAllRangesた後reselectFuncsavedRangeorigRangeがリセットされることを示します。このようなオブジェクトを使用して呼び出すaddRangeと、Firefoxで例外がスローされます。

キャッチされない例外:[例外..."JavaScript引数arg0を変換できませんでした[nsISelection.addRange]"nsresult: "0x80570009(NS_ERROR_XPC_BAD_CONVERT_JS)"場所:"JSフレーム::file:/// home / mk / tests/addrange。 html::匿名::行19"データ:いいえ]

3つのブラウザすべてで、テキストが選択されていないことは言うまでもありません。

どうやらこれは意図された振る舞いです。(DOM)Selectionオブジェクトが割り当てられたすべての変数は、を呼び出した後にリセットされremoveAllRangesます。

于 2010-04-19T23:37:15.913 に答える
0

マルセルありがとう。そうです、秘訣は範囲を複製してから、特定の元の範囲を削除することです。このようにして、複製された範囲に戻すことができます。あなたの助けが私を以下のコードに導きました。それは選択を他の場所に切り替え、そしてタイムアウトに従って元に戻します。

私はあなたなしではそれを成し遂げることができなかった、そしてあなたにそれに対する正しい答えを与える:D

<!DOCTYPE html>
<html>   
<head> 
    <meta charset="UTF-8">
    <title>addRange test</title>
    <style>
      #trigger { background: lightgreen }
    </style>
  </head>
  <body> 
    <p id="switch">Switch to this text</p>
    <p id="test">This is some (rather short) text.</p>
    <span id="trigger">Trigger testCase().</span>
    <script>
var origRange;
var s = window.getSelection();

var reselectFunc = function () {
     s.removeAllRanges();
     s.addRange(origRange);
};

var testCase = function () {
// Before modifying selection, save it
var userSelection,selectedText = '';

if(window.getSelection){
    userSelection=window.getSelection();
}
else if(document.selection){
    userSelection=document.selection.createRange();
}
selectedText=userSelection;
if(userSelection.text){
    selectedText=userSelection.text;
}
if(/msie|MSIE/.test(navigator.userAgent) === false){
    /* you shouldn't do this kind of browser sniffing,
       users of Opera and WebKit based browsers
       can easily spoof the UA string */
    selectedText=selectedText.toString();
}
origRange = userSelection;




 var range = s.getRangeAt(0);
 origRange = range.cloneRange();
 var sasDom = document.getElementById("switch");
 s.removeRange(range);
 range.selectNode(sasDom);
 s.addRange(range);

window.setTimeout(reselectFunc, 1000);
};
window.onload = function () {
    var el = document.getElementById("trigger");
    el.onmouseover = testCase;
};
    </script>
</body>
</html>
于 2010-04-20T04:48:22.057 に答える