2014-02-05 3 views
0

не эксперт в d3.js, огляделся, не могли найти/понять, как достичь этого:Выделите текст события d3.js

<p class='my-text'> Hi! this is a paragraph!</p> 

пользователь выделяет несколько слов в этом пункте, в котором пожары событие, которое создает линию из верхней части средней части выделения, а затем переходит в окно, в котором пользователь может прокомментировать.

Как это сделать в d3.js? Есть ли ресурс, на который я могу взглянуть, чтобы манипулировать текстом с помощью d3.js?

Спасибо за чтение!

+0

Я не думаю, что вы сможете получить «линию» в поле комментариев для работы; вы смешиваете содержимое HTML (с текстом, который будет переноситься из строки в линию на основе размера окна и шрифта) с элементами рисования SVG (которые всегда абсолютно позиционируются). – AmeliaBR

ответ

1

Интересный вопрос. Я боюсь, что d3 не может сделать ничего уникального, чтобы сделать эту работу именно так, как вы себе представляете, но есть некоторые методы в стандартном Javascript API, которые могут помочь.

Метод документа или окна возвращает выделенный текст с информацией о том, где он находится в дереве документа, как selection object. Однако обратите внимание, что он не поддерживается в IE8 или ниже.

Работая оттуда и используя метод .splitText() и другие основные функции Javascript, можно вставить плавающий редактируемый элемент <div> (или текст ввода) в точке выделенного текста.

В этой скрипке, я отмечаю точку в исходном тексте, который относится к комментарию с красной звездочкой, который показывается при наведении курсора или отредактировать комментарий:

http://fiddle.jshell.net/5sT7t/3/

Код ключа:

function checkSelection(d,i) { 
    var sel = document.getSelection(); 

    if (sel.isCollapsed) return; 
     // The selection doesn't have any content, 
     // i.e., it's just the cursor location, 
     // so don't do anything. 

    var commentBox = document.createElement("div"); 
    var commentMarker = document.createElement("span"); 
    //create new elements, not currently attached to anything 

    d3.select(commentBox) 
     .attr("class", "commentBox") 
     .datum(sel.toString()) //save for later reference?? 
     .text("Comment on \"" + sel.toString() + "\"") 
     .attr("contentEditable", "true") 
     .on("mouseup", stopEvent) 
     .on("keyup", stopEvent); //don't trigger comments within comments! 

    d3.select(commentMarker) 
     .attr("class", "commentMarker"); 

    var split = sel.anchorNode.splitText(sel.anchorOffset); 
    //split the text node containing the start of the selection 
    //into two text nodes, and save the second one 

    sel.anchorNode.parentNode.insertBefore(commentMarker, split); 
    sel.anchorNode.parentNode.insertBefore(commentBox, commentMarker); 
    //insert the comment marker into the paragraph just before 
    //the split point; insert the box just before the marker; 
    //order is important, so that the marker's CSS can be 
    //dependent on the box's hover/focus state 

    sel.anchorNode = split; 
    sel.anchorOffset = 0; 
    //shift the selection to only include content after the split 
    //(this doesn't actually work...) 
} 

Чтобы попытаться найти что-то поближе к тому, что вы просили, я заменил звездочку длинным блоком, действуя как «линия». Однако нет возможности легко установить ширину этого блока для заполнения пробела из произвольной точки в тексте в поле комментариев на границе, поэтому мне пришлось перерегулировать, а затем использовать оболочку, чтобы скрыть переполнение. Высота строки также не соответствует, если есть несколько комментариев, что заставляет поля комментариев больше не выстраиваться в линию с текстом, к которому они прикреплены. Но это то, с чем вы можете поиграть:
http://fiddle.jshell.net/5sT7t/4/

+0

Спасибо за эту амелию! Я так догадался, что с d3 это может быть невозможно, я сделал что-то похожее на то, что у вас здесь, по существу, взял строку, ширину около 80 процентов, используемую для текста, а остальные 20 процентов просто пусты. с getSelection и некоторыми базовыми манипуляциями с диапазонами, можно найти расстояние от верха документа до слова/слова, которое было выделено, как только вы получите высоту, легко нарисовать простую линию границы в 20-процентной области, которая выполняется на стороне, чтобы сделать коробку, такую, что она имеет ту же высоту от верхней части документа, так что появляется рядом! – user1323136

Смежные вопросы