Диапазон Rangy, содержащийся в селекторе jquery - PullRequest
0 голосов
/ 25 июня 2011

Я работаю над оболочкой JavaScript для плагина Rangy JavaScript .Что я пытаюсь сделать: учитывая селектор jQuery и диапазон, определить, содержится ли диапазон в селекторе.Это для пространства, где пользователь будет читать документ и иметь возможность комментировать определенные разделы.Итак, у меня есть div с id="viewer", который содержит документ, и у меня есть область кнопок, которые делают что-то после того, как пользователь выберет какой-то текст.Вот (сломанная) функция:

function selectedRangeInRegion(selector) {
    var selectionArea = $(selector);
    var range = rangy.getSelection().getRangeAt(0);
    var inArea = (selectionArea.has(range.startContainer).length > 0);

    if (inArea) {
        return range;
    } else {
        return null;
    }
}

Похоже, что selectionArea.has(range.startContainer) возвращает массив размера 0. Я пробовал оборачивать как: $(range.startContainer).Любые советы?


Я разработал решение для этой проблемы.Это предполагает, что у вас есть селектор div и что у вашего контента нет div:

function containsLegalRange(selector, range) {
  var foundContainingNode = false;

  var container = range.commonAncestorContainer

  var nearestDiv = $(container).closest("div");    
  if (nearestDiv.attr("id") == selector) {
    return true
  }
  else {
    return false
  }
}

Ответы [ 2 ]

2 голосов
/ 26 июня 2011

Это не так, как has() работает: передаваемый ему параметр является либо строкой селектора, либо элементом DOM, тогда как range.startContainer является узлом DOM, который на практике может быть текстовым узлом или элементом.

Не думаю, что найдется способ, который так прост, как вы надеетесь.Следующее настолько просто, насколько я могу себе представить, с головы до головы.

jsFiddle: http://jsfiddle.net/TRVCm/

Код:

function containsRange(selector, range, allowPartiallySelected) {
    var foundContainingNode = false;
    $(selector).each(function() {
        if (range.containsNode(this, allowPartiallySelected)) {
            foundContainingNode = true;
            return false;
        }
    });
    return foundContainingNode;
}
0 голосов
/ 25 июня 2011

.has () иногда может быть странным и выдавать .length == 0, когда это не предполагается. Попробуйте вместо этого:

function selectedRangeInRegion(selector) {
  var range = rangy.getSelection().getRangeAt(0);
  var selectionArea = selector + ':has(\'' + range.startContainer + '\')';
  var inArea = $(selectionArea).length > 0);
  if (inArea) {
    return range; 
  }
  else {
    return null;
  }
}
...