Предотвратить циклическую ссылку JavaScript window.getSelection () - PullRequest
1 голос
/ 30 июля 2011

См. Эту демонстрацию (в зависимости от события selectionchange, которое работает в Chrome только в данный момент): http://jsfiddle.net/fyG3H/

Выберите некоторый текст lorem ipsum и затем сфокусируйте ввод текста.В журнале консоли вы увидите, что существует объект DOMSelection.У него есть значение anchorNode HTMLBodyElement, в то время как у него должно быть одно из Text.

. Я не знал, почему это происходило, пока не попробовал строковый объект выделения: http://jsfiddle.net/fyG3H/1/

Это дает следующую ошибку:

Uncaught TypeError: Преобразование круговой структуры в JSON

Знаете ли вы, как я могу предотвратить эту циклическую ссылку, вызванную окном.getSelection ()?

РЕДАКТИРОВАТЬ

Новая демонстрация, которая работает и в других браузерах, но по-прежнему дает неправильный anchorNode: http://jsfiddle.net/fyG3H/5/

И с JSON.stringify: http://jsfiddle.net/fyG3H/6/

Firefox, похоже, возвращает пустой {} вместо выдачи ошибки.

1 Ответ

2 голосов
/ 31 июля 2011

Вам нужно вызвать toString() на getSelection(). Я обновил вашу скрипку , чтобы вести себя так, как вы ожидаете.

var selection;

$('p').bind('mouseup', function() {
    selection = window.getSelection().toString();
});

$('input').bind('focus', function() {
   this.value = selection;
   console.log(selection); 
});

См. Демонстрацию


EDIT:

Причина, по которой вы не получаете правильный узел привязки, заключается в том, что объект DOMSelection передается по ссылке, и когда вы фокусируете внимание на входе, выборка очищается, возвращая, таким образом, значения по умолчанию выбора, соответствующие отсутствию выбора. Один из способов обойти это - клонировать свойства DOMSelection для объекта и ссылаться на него. У вас больше не будет прототипных DOMSelection методов, но в зависимости от того, что вы хотите сделать, этого может быть достаточно.

var selection, clone;

$('p').bind('mouseup', function() {
    selection = window.getSelection();
    clone = {};
    for (var p in selection) {
        if (selection.hasOwnProperty(p)) {
            clone[p] = selection[p];
        }
    }
});

$('input').bind('focus', function() {
   console.dir(clone); 
});

См. Демонстрацию

...