Подтвердить что ты не робот

Выберите текст в столбце таблицы html.

Можно ли выбрать текст (т.е. выделить его так, чтобы он мог быть скопирован + вставлен) каждой ячейки в одном вертикальном столбце таблицы HTML.

Есть ли метод JavaScript или, возможно, эквивалент в некоторых браузерах для ярлыка Alt-Click-Drag, используемого во многих текстовых редакторах?

Или это невозможно?

4b9b3361

Ответ 1

То, что вы ищете, называется Range object (TextRange в IE).

Update: Вот рабочий код, чтобы сделать то, что вы предлагаете: http://jsfiddle.net/4BwGG/3/

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

Примечание:

  • Работает нормально в FF 3 и выше
  • IE (до 9) и Chrome не поддерживают множественный выбор.
  • Chrome не выделяет все ячейки (но захватывает все содержимое). То же самое касается IE9
  • IE 7 и 8 выдадут ошибку.

Альтернативой является применение стиля CSS, который имитирует выделение при щелчке заголовка столбца и циклическое перемещение по всем ячейкам для их содержимого. Внешний вид этого подхода может отличаться от внешнего вида выбора (если вы каким-то образом не захватите выбранное событие и не измените его).

Затем используйте плагин jQuery copy, чтобы скопировать их в буфер обмена.

Ответ 2

Некоторые средства проверки кода реализуют это, чтобы разрешить копирование и вставку кода с одной стороны разного типа. Я посмотрел, как ReviewBoard отключает его.

Суть заключается в следующем:

  • Когда начинается выбор столбца, создайте ячейки во всех остальных столбцах с user-select: none (и его префиксными вариантами при необходимости). Это создает вид выбора столбца. Остальные столбцы по-прежнему тайно выбираются, поэтому вам нужно...
  • Перехватите событие copy и измените его полезную нагрузку, чтобы отобразить содержимое выбранного столбца.

Код ReviewBoard для этого состоит из этот CSS и этот JavaScript.

Я вытащил его в довольно минимальную jsbin demo.

Здесь CSS, чтобы создать вид выделения из одного столбца (вы добавляете класс selecting-left в таблицу при выборе левого столбца или selecting-right для права):

.selecting-left  td.right,
.selecting-left  td.right *,
.selecting-right td.left,
.selecting-right td.left *,
  user-select: none;
}

.selecting-left  td.right::selection,
.selecting-left  td.right *::selection,
.selecting-right td.left::selection,
.selecting-right td.left *::selection,
  background: transparent;
}

Здесь JavaScript, чтобы перехватить событие copy и подключить к одному столбцу значение данных:

tableEl.addEventListener('copy', function(e) {
  var clipboardData = e.clipboardData;
  var text = getSelectedText();
  clipboardData.setData('text', text);
  e.preventDefault();
});

function getSelectedText() {
  var sel = window.getSelection(),
      range = sel.getRangeAt(0),
      doc = range.cloneContents(),
      nodes = doc.querySelectorAll('tr'),
      text = '';

  var idx = selectedColumnIdx;  // 0 for left, 1 for right

  if (nodes.length === 0) {
    text = doc.textContent;
  } else {
    [].forEach.call(nodes, function(tr, i) {
      var td = tr.cells[tr.cells.length == 1 ? 0 : idx];
      text += (i ? '\n' : '') + td.textContent;
    });
  }

  return text;
}

Там также есть несколько менее интересный код для добавления классов selecting-left и selecting-right в начале выбора. Это потребует немного больше работы для обобщения таблиц n-столбцов.

Это, кажется, хорошо работает на практике, но удивительно, насколько это сложно!

Ответ 3

У вас может быть div, который заполняется данными столбца при нажатии и применяет класс css, чтобы дать столбцам возможность выбора

что-то вроде этого:

var $mytable = $("#mytable"),
    $copydiv = $("#copy_div");

$mytable.find("td").click(function(){

    //get the column index
    var $this = $(this),
        index = $this.parent().children().index($this);

    //find all cells in the same column
    $mytable.find("tr:nth-child(" + index + ")").removeClass("selected").each(function () {
        var $this = $(this);
        $this.addClass("selected");
        $copydiv.html($this.html() + "<br />");
    });
});

или у вас может быть отдельная таблица для каждого столбца, но я не думаю, что это того стоило.