Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 09.07.2012, 16:39
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от Deff
Плюс! - ток в универсальном варианте нун искать все элементы по каждой из 4-x сторон: в порядке(обхода) прилегания
Да, в универсальном варианте придётся делать дополнительные расчёты: например, если не первая в столбце ячейка с rowspan="2" придётся высчитать для неё двух дополнительных соседей.
Сообщение от Deff
учитываешь ли - что эл-т может быть одновременно и rowspan и colspan
здесь это не важно, для универсального варианта придётся учесть
Ответить с цитированием
  #12 (permalink)  
Старый 09.07.2012, 16:39
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,491

Так и знал что кто-нить использует пиксельный метод.
Главный минус его в том, что малейшее изменение стиля - и он перестанет работать.
__________________
29375, 35
Ответить с цитированием
  #13 (permalink)  
Старый 09.07.2012, 16:41
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от Aetae
Так и знал что кто-нить использует пиксельный метод.
Главный минус его в том, что малейшее изменение стиля - и он перестанет работать.
Можно продемонстрировать на данном примере
Ответить с цитированием
  #14 (permalink)  
Старый 09.07.2012, 16:53
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,491

Сообщение от bes Посмотреть сообщение
Можно продемонстрировать на данном примере
Самое простое:
<style>
  table, td {border: solid 1px; cursor: pointer}
 *!* table{border-spacing:6px}*/!*
</style>
 
<table id="table">
    <tr>
        <td rowspan="3">0</td>
        <td>1</td>
        <td rowspan="3">2</td>
        <td colspan="2">3</td>
        <td>4</td>
    </tr>
    <tr>
        <td>5</td>
        <td  rowspan="2">6</td>
        <td>7</td>
        <td>8</td>
    </tr>
    <tr>
        <td id="td">9</td>
        <td>10</td>
        <td>11</td>
    </tr>
</table>​
 
<script>
window.onload = function () {//onload begin
  var table = document.getElementById('table');
  var coord, left, top, right, previous, next;
  var d = 5;//здесь можно уточнить
  var p, n;
 
  table.onclick = function(e) {//onclick begin
    e = e || event;
    var target = e.target || e.srcElement;
 
    if (target.parentNode.tagName == 'TR') {//if begin
      coord = target.getBoundingClientRect();
      left = coord.left + 1;
      top = coord.top + 1;
      right = coord.right;
      previous = document.elementFromPoint(left - d, top);
      next = document.elementFromPoint(right + d, top);
    
      if (previous.parentNode.tagName == 'TR')  {
        p = previous.innerHTML;
      } else {
        p = 'нет';
      }
 
       if (next.parentNode.tagName == 'TR')  {
         n = next.innerHTML;
       } else {
         n = 'нет';
       }
       
       alert('предыдущий: ' + p + '\nследующий: ' + n)
 
      }//if end
 
  }//onclick end
    
}//onload end
</script>
__________________
29375, 35
Ответить с цитированием
  #15 (permalink)  
Старый 09.07.2012, 17:05
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Я поэтому и закомментировал строчку (var d = 5;//здесь можно уточнить), имея в виду, что можно более точно рассчитать расстояние между ячейками (задача чётко попасть в ячейку, а не в промежуток между ними).
Допустим рассчитали, какие могут быть ещё варианты изменения стилей, чтобы скрипт потерял работоспособность?
Ответить с цитированием
  #16 (permalink)  
Старый 09.07.2012, 18:14
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Ну пиксельный имхо не АЙС, суть в том что Фактически, еще раз Фактичекси - все пикселы и координаты определяются столбцом и строкой якобы встроенных в ячейку - одного или нескольких ячеек с colspan и rowspan =1, поэтому на пикселы разменивацо смысла нет

координаты "Писксела" в таблице - есть координаты ячейки(столбец-строка) с размерами colspan-rowspan 1Х1 вписанного реального(если элемент соответствует 1Х1) или псевдо(если размеры больше) подобного элемента

И ширина - высота тоже в ячейках

Последний раз редактировалось Deff, 09.07.2012 в 18:49.
Ответить с цитированием
  #17 (permalink)  
Старый 09.07.2012, 19:43
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Ячейки таблицы не такие уж и маленькие, чтобы в них не попасть.
Чем меньше размер ячейки, тем выше вероятность промаха, но вероятность того, что будут работать с чрезвычайно уменьшенной таблицей мала (естественно, данный способ не подходит для скрытых таблиц).
Если нужна абсолютная точность, можно подстраховаться, попиксельно (в смысле, увеличивая или уменьшая координату на 1) пройдя в цикле от самой ячейки до первой встретившейся (если такая есть) в нужном направлении.
Проще решения для произвольной таблицы с ячейками с rowspan и colspan, на мой взгляд, пока не видно.

Последний раз редактировалось bes, 09.07.2012 в 19:45.
Ответить с цитированием
  #18 (permalink)  
Старый 09.07.2012, 20:18
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

bes,
я имхо не про размер -
Я про идеологию
Ну взять подложить под текущую таблицу такую же, но чисто с одно ячеистой структурой
Ответить с цитированием
  #19 (permalink)  
Старый 09.07.2012, 20:48
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от Deff
Ну взять подложить под текущую таблицу такую же, но чисто с одно ячеистой структурой
Для огромных (как пишет ТС) таблиц хотелось бы более элегантного решения.
PS: я выше также предлагал выровнять структуру, что, кстати, наверное реально (пройтись по таблице и добавить недостающие ячейки с display: none).

А, кстати, это наверное неплохое решение, только проходя по таблице, добавлять не просто ячейки с display: none, а также и с соответствующим содержимым (тогда расчёт вообще простой).

Последний раз редактировалось bes, 09.07.2012 в 20:57.
Ответить с цитированием
  #20 (permalink)  
Старый 09.07.2012, 20:57
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

bes,
Ну моё предложение прозвучало - проставить каждой ячейке индивидуальный класс
затем обойти и добавить классы соседских, добавляем только первый класс в списке, тады у нас классы всех сторон в атрибуте класс и поиск соседних перебором всех классов в текущей ячейке, нaчиная со второго в списке

Создание уникального класса элемента - номер строки + через букву номер столбца

Выяснить отсутствие соседей, зная класс текущего элемента и общее колво строк и столбцов и его соllspan, rowspan - тоже сложностей не представляет

Последний раз редактировалось Deff, 09.07.2012 в 21:10.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить значение переменной из callback функции? Хиросим AJAX и COMET 5 24.04.2012 09:32
Как в ВKонтакте сделано проигрывание при серфинге? iMichaeli7 Элементы интерфейса 9 18.05.2011 17:47
Как получить raw data с image? lyapharov Общие вопросы Javascript 2 07.04.2011 00:20
Как получить название композиции из Windows Mepia Plyaer alx99 Javascript под браузер 1 18.02.2011 16:21
Как сделать? При выходе мышкой за пределы окна браузера, начинает грузится другая стр alb Events/DOM/Window 13 01.09.2010 12:19