Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 17.02.2016, 18:26
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,081

обьединение ячеек таблицы
AciDWarrioR, запустить код, подождать 3 секунды, долго думать.
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
     td{
  width: 50px;
  border: 1px solid #000000;
  text-align: center;
  height: 50px;
}

  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
  <script>
 $(function() {
    var mytable = $("<table/>");
    $.each(Array(10), function(i, myData) {
        $(mytable).append($("<tr/>").append($.map(Array(10), function(a, num) {
            return $("<td/>", {
                text: num
            })
        })))
    });
    $("body").append(mytable);

    function fn(data, table) {
        var del = [];
        Object.keys(data).forEach(function(key) {
            var tr = $("tr", table).eq(key);
            Object.keys(data[key]).forEach(function(i) {
                var td = $("td", tr).eq(i);
                var len = data[key][i];
                td[0].colSpan = len;
                var temp = td.next();
                for (var k = 1; k < len; k++) {
                    temp.length && del.push(temp);
                    temp = temp.next()
                }
            })
        });
        $.each(del, function(i, td) {
            td.remove()
        })
    }
    var data = {
        0: {
            0: 2,
            5: 2
        },
        1: {
            0: 2,
            5: 2
        }
    };
    window.setTimeout(function() {
        fn(data, mytable)
    }, 3E3)
});
  </script>
</head>

<body>

</body>

</html>
Ответить с цитированием
  #12 (permalink)  
Старый 17.02.2016, 18:56
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от AciDWarrioR
это проблемы не решит.
Ну блин, если бы была сложная таблица, то есть объединение ячеек в колонках (не строках) было бы динамическое в зависимости от данных к примеру, ну тогда еще были бы трудности.

В данном же случае все "культурно идеально", что стоит прописать это в условиях? А добавлять строки и ячейки уж если JS, хватит методов insertRow() и insertCell(), и чтобы в одном цикле не писать портянки, а вставлять сразу ячейки, то число итераций должно быть Строк * Колонок. Что-то типа этого:

<html> 
<head> 
<style>
table {
    border-collapse: separate;
}
td {
    padding: 5px 10px;
    border: 1px solid #777;
}
</style> 
</head> 
<body>
<script> 
var c = 11, r = 16, T = document.createElement("table"), C, R;
document.body.appendChild(T);

for(var i = 0, k = c * r, n; i<k; i++) {

    if(!(i % c)) {
       n = i / c;
       R = T.insertRow(-1);
    }

    C = R.insertCell(-1);
    
    if((!(n % 4) || (n & 3) == 1) && R.cells.length == c) {
          R.cells[0].colSpan = 2;
          R.cells[4].colSpan = 2;
          R.deleteCell(-1);
          R.deleteCell(-1);
       }
}
</script>
</body> 
</html>

Последний раз редактировалось laimas, 17.02.2016 в 19:24.
Ответить с цитированием
  #13 (permalink)  
Старый 18.02.2016, 08:39
Аватар для AciDWarrioR
Кандидат Javascript-наук
Отправить личное сообщение для AciDWarrioR Посмотреть профиль Найти все сообщения от AciDWarrioR
 
Регистрация: 11.11.2015
Сообщений: 136

рони,
Реально долго думать!!! Я что то пока вообще не вдупляю, что там происходит.
laimas,
Воооо, это уже разговор)))
Ну вот разбирая код:
Сообщение от laimas
k = c * r, n;
- как это понимать. Не встречал записи через запятую.
Всё догнал!) Сейчас разбирать буду)

Последний раз редактировалось AciDWarrioR, 18.02.2016 в 08:44.
Ответить с цитированием
  #14 (permalink)  
Старый 18.02.2016, 09:19
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,081

AciDWarrioR,
var data = {
        0: { //индекс строки
            0: 2, //индекс ячейки с которой начать обьединение и количество ячеек для обьединения
            5: 2  //индекс ячейки с которой начать обьединение и количество ячеек для обьединения
        },
        1: {
            0: 2,
            5: 5
        }
    };
    window.setTimeout(function() {
        fn(data, mytable) //функция обьединения ячеек (обьект с данными для обьединения, таблица в которой необходимо это сделать)
    }, 3E3)
Ответить с цитированием
  #15 (permalink)  
Старый 18.02.2016, 09:24
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,081

AciDWarrioR,
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
        td{
  width: 50px;
  border: 1px solid #000000;
  text-align: center;
  height: 50px;
}
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>

  <script>
   $(function(){
       function fn(data, table) {
        var del = [];
        Object.keys(data).forEach(function(key) {
            var tr = $("tr", table).eq(key);
            Object.keys(data[key]).forEach(function(i) {
                var td = $("td", tr).eq(i);
                var len = data[key][i];
                td[0].colSpan = len;
                var temp = td.next();
                for (var k = 1; k < len; k++) {
                    temp.length && del.push(temp);
                    temp = temp.next()
                }
            })
        });
        $.each(del, function(i, td) {
            td.remove()
        })
    }

        var data = {
        1: { //индекс строки
            0: 2 //индекс ячейки с которой начать обьединение и colSpan
        },
        2: {
            0: 3
                }
    };
    window.setTimeout(function() {
        fn(data, $('table')) //функция обьединения ячеек (обьект с данными для обьединения, таблица в которой необходимо это сделать)
    }, 3E3)
   })
  </script>
</head>

<body>
   <table>
   	<thead>
   		<tr>
   			<th>Title 1</th>
   			<th>Title 2</th>
   			<th>Title 3</th>
   		</tr>
   	</thead>
   	<tbody>
   		<tr>
   			<td>Cell 1.1</td>
   			<td>Cell 1.2</td>
   			<td>Cell 1.3</td>
   		</tr>
   		<tr>
   			<td>Cell 2.1</td>
   			<td>Cell 2.2</td>
   			<td>Cell 2.3</td>
   		</tr>
   	</tbody>
   </table>
</body>

</html>
Ответить с цитированием
  #16 (permalink)  
Старый 18.02.2016, 09:29
Аватар для AciDWarrioR
Кандидат Javascript-наук
Отправить личное сообщение для AciDWarrioR Посмотреть профиль Найти все сообщения от AciDWarrioR
 
Регистрация: 11.11.2015
Сообщений: 136

рони,
Я вот пока пытаюсь laimas, пример сделать, мне с моим опытом он более понятен. Спасибо, что разъяснил, теперь понятно.
А такой вопрос: почему мой изначальный вариант то разваливался? Есть идеи?
Ответить с цитированием
  #17 (permalink)  
Старый 18.02.2016, 09:50
Аватар для AciDWarrioR
Кандидат Javascript-наук
Отправить личное сообщение для AciDWarrioR Посмотреть профиль Найти все сообщения от AciDWarrioR
 
Регистрация: 11.11.2015
Сообщений: 136

Сообщение от laimas
 if((!(n % 4) || (n & 3) == 1) && R.cells.length == c)
Вот с этим условием запара у меня. Зачем побитовое сравнение?
Ответить с цитированием
  #18 (permalink)  
Старый 18.02.2016, 10:02
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,081

Сообщение от AciDWarrioR
А такой вопрос: почему мой изначальный вариант то разваливался? Есть идеи?
для меня твой код, такой же мой для тебя - увы не осилил, просто незнаю что твой код делает.
Ответить с цитированием
  #19 (permalink)  
Старый 18.02.2016, 10:45
Аватар для AciDWarrioR
Кандидат Javascript-наук
Отправить личное сообщение для AciDWarrioR Посмотреть профиль Найти все сообщения от AciDWarrioR
 
Регистрация: 11.11.2015
Сообщений: 136

рони,
Тебе карму не могу добавить, хотя laimas добавилось. В общем сделал таблицу. Походу проблема была в том, что у меня ячейки были пустые. Сейчас делал по шаблону laimas и была та же проблема. Начал заполнять блоки и таблица выпрямилась.
Ответить с цитированием
  #20 (permalink)  
Старый 18.02.2016, 11:53
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от AciDWarrioR
Воооо, это уже разговор
А до этого я о другом говорил?

Нужно построить таблицу с объединением ячеек в строке. Такое объединение легкое, в отличие от объединения ячеек в колонке, и изначально количество ячеек во всех строках равно. Можно построить так:

а) обходом двумя циклами - по количеству строк и количеству ячеек в каждой строке
б) обходом одним циклом с количеством итераций равных числу ячеек в таблице

Касаемо строки, то нужно только знать когда создавать новую, что вполне не сложно узнать, а следовательно двух циклов не нужно.

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

Я думаю, что это естественно, глядя на "портянки" обязательно возникнет вопрос "почему"?

Сообщение от AciDWarrioR
Вот с этим условием запара у меня. Зачем побитовое сравнение?
В таблице 16 строк (индексы от 0 до 15). Написать все в столбик и, если трудно эти индексы "читать" в бинарном виде, можно преобразовать. После преобразования еще раз посмотреть на них. Здесь & 3 выбор по маске. Теперь понятно для чего?
Ответить с цитированием
Ответ



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

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