JavaScript ранжирование пошло не так - PullRequest
0 голосов
/ 15 сентября 2009

Следующий код дает мне действительно странную ошибку в Firefox:

Ошибка: необработанное исключение: [Исключение ... »Индекс или размер отрицательный или больше допустимого сумма "код:" 1 "nsresult: «0x80530001 (NS_ERROR_DOM_INDEX_SIZE_ERR)» location: "file: /// G: /test.html Строка: 13" ]

<html>
<head>
    <title>test</title>

   <script>
function xxx() {

   var myList = document.getElementsByTagName("div");

   var range = document.createRange();
   var start = myList[0];
   var end = myList[0];
   range.setStart(start, 1); // Edit: this is (presumably) line 13
   range.setEnd(end, 3); 

   window.getSelection().addRange(range);
}
   </script>
</head>

<body onload="xxx();">

   <div>abcddasdsadasda</div>
   <div>2312321</div>

</body>
</html>

Что я делаю не так?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 15 сентября 2009

Вам необходимо расширить функцию xxx для поддержки IE, чего в настоящее время нет. Функции document.createRange и window.getSelection не работают в этой среде.

Как насчет:

function xxx()
{
  var myList = document.getElementsByTagName("div");    

  if(window.getSelection)
  {
    var range = document.createRange();

    var start = myList[0];
    var end = myList[0];

    range.setStart(start, 0);
    range.setEnd(end, 1);
    window.getSelection().addRange(range);      
  }
  else
  if(document.selection)
  {
    document.selection.empty();
    var txt = document.body.createTextRange();
    txt.moveToElementText(myList[0]);
    txt.setEndPoint("EndToEnd", txt);
    var start;
    txt.moveStart('character', start);

    if (length + start > myList[0].innerHTML.length) 
    {
      length = myList[0].innerHTML.length - start;
    }

    txt.moveEnd('character', -(myList[0].innerHTML.length - start - length));
    txt.select();
  } 
} 

Код выделит весь текст элемента DIV. Вам нужно будет поиграть с конечными точками, чтобы получить возможность выбирать только часть этого диапазона.

1 голос
/ 15 сентября 2009

Во-первых, я настоятельно рекомендую Firebug для отладки Javascript в FireFox. Он сразу указал мне на строку setEnd.

Теперь к получению ответа. Вторым параметром setStart и setEnd является глубина узла для выбора. Поскольку у вас есть только два тега div без дочерних узлов, у вас есть только глубины 0 и 1. Для myList [0] ваша глубина 0 - это сам тег div, а глубина 1 - это текстовый узел внутри div.

Поскольку я не уверен, что вы пытаетесь выбрать здесь, будет исправленный код для выделения всего текста в обоих тегах div.

   var end = myList[1];
   range.setStart(start, 0);
   range.setEnd(end, 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...