2010-11-26 2 views
3

Эй, поэтому я работаю с диапазонами, я пытаюсь ограничить выбор, который пользователь может сделать на странице. Я имею в виду, что пользователь может выбирать все, что захочет, но выбор не может превышать границы, которые я установил.Странное поведение firefox/javascript с использованием диапазонов

Сначала я определяю «границы» с определенным диапазоном. Затем я сравниваю текущий пользовательский выбор с заданным диапазоном, если текущий запуск выбора находится ниже границ ИЛИ текущий конец выбора выше границ, которые я настраиваю соответственно, чтобы выбор пользователя никогда не превышал определенный диапазон границ/выбор.

Функция ниже работает только если выход I начинается предупреждение перед процессом, если я удалить предупреждение, то светлячок ведет себя странно (как выбрать другую часть страницы и т.д.)

вопрос: почему следующий код работает с предупреждением и почему он не работает так, как ожидалось, без предупреждения?

Спасибо!

var range = document.createRange(); // this is the boundaries range 
range.selectNodeContents(document.getElementById("container")); 

function test(){ 
      alert("let's go"); // if I remove this alert, the code doesn't work as expected, WHY?! 
      if(window.getSelection().rangeCount == 0){ 
       return; 
      } 
      var curRange = window.getSelection().getRangeAt(0); 
      if(curRange.compareBoundaryPoints(Range.START_TO_START, range) < 0){ 
       curRange.setStart(range.startContainer,range.startOffset); 
      } 

      if(curRange.compareBoundaryPoints(Range.END_TO_END, range) > 0){ 
       curRange.setEnd(range.endContainer,range.endOffset); 
      } 
     } 
+0

Что вызывает «тест»? – Pointy 2010-11-26 16:47:15

+0

A кнопка на странице – carlosdubusm 2010-11-26 16:48:57

ответ

5

Во-первых, работать в других браузерах (кроме IE < = 8, которая имеет совершенно другой способ сделать это вещи) вам необходимо повторно выбрать диапазон. Во-вторых, чтобы заставить его работать в Firefox, вам нужно работать с клоном исходного выбранного диапазона:

function test(){ 
    var sel = window.getSelection(); 
    if (sel.rangeCount == 0) { 
     return; 
    } 
    var curRange = sel.getRangeAt(0).cloneRange(); 
    if (curRange.compareBoundaryPoints(Range.START_TO_START, range) < 0) { 
     curRange.setStart(range.startContainer,range.startOffset); 
    } 
    if (curRange.compareBoundaryPoints(Range.END_TO_END, range) > 0) { 
     curRange.setEnd(range.endContainer,range.endOffset); 
    } 
    sel.removeAllRanges(); 
    sel.addRange(curRange); 
} 
Смежные вопросы