Javascript-форум (https://javascript.ru/forum/)
-   Библиотеки/Тулкиты/Фреймворки (https://javascript.ru/forum/library-toolkit-framework/)
-   -   Полноэкранный букридер / Пагинация текста (https://javascript.ru/forum/library-toolkit-framework/35680-polnoehkrannyjj-bukrider-paginaciya-teksta.html)

coventgarden 18.02.2013 15:37

Полноэкранный букридер / Пагинация текста
 
Привет!
Задача сделать пагинацию длинного текста средствами js
Все плагины, что я нашел, жутко красивые, но с увеличением объема текста (200+ страниц) так же жутко тормозят.

Необходима самая простая и быстрая библиотека: разбивка на страницы с % высотой от высоты экрана и стрелки вперед / назад.

Спасибо!

coventgarden 18.02.2013 15:49

Я не против платных решений,
Но все пагинаторы типа http://1.s3.envato.com/files/44575421/fullscreen.html имеют примеры исключительно с парой-тройкой страниц.

DjDiablo 18.02.2013 23:39

Я думаю, разбор двухсот страниц текста в любом случае будет тяжёлой для клиента задачей. Мгновенного разбиения на страницы вы так и так не получите.

Deff 18.02.2013 23:45

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

coventgarden 19.02.2013 04:43

Ну например такой концепт:
Считаем количество строк на страницу,
Создаем первые 3 страницы, прекращаем выполнение скрипта, остальное скрываем, при перелистывании второй - делаем тоже самое с еще одной пачкой строк, и так до конца.

В аяксе пока не вижу ничего продвинутого, зачем делать много запросов, если можно один?

Так как для личного сайта, может стоить поэкспериментировать.

Цитата:

Я думаю, разбор двухсот страниц текста в любом случае будет тяжёлой для клиента задачей. Мгновенного разбиения на страницы вы так и так не получите.
Ну ок. Но пагинации с вменяемым прелоадером я тоже не видел. Возникает вопрос, почему хром грузит и открывает мегабитные .док или .пдф, а все решения на js для простого текста вгоняют браузер в кому.

Через мульти-колумнс, кстати, никак нельзя?

Deff 19.02.2013 05:11

Цитата:

Сообщение от coventgarden
В аяксе пока не вижу ничего продвинутого, зачем делать много запросов, если можно один?

Есть lLocalStorage, по мере скролла грузи и грузи новые страницы, коли не скроллит, то и не грузим - нафег 100, если будет просмотрено 2 ?
И с другой стороны - просмотрели 100, - если нужно подгрузить старое - взяли из Кеша, с третьей стороны - на каждой странице проставляем - время жизни - если истекло - подгружаем заново... минимальная нагрузка и на сервер и на клиента... Вопрос ток один - объём этой сотни страниц

danik.js 19.02.2013 08:54

Цитата:

Сообщение от coventgarden
почему хром грузит и открывает мегабитные .док или .пдф, а все решения на js для простого текста вгоняют браузер в кому

Ну ты еще пожалуйся что до сих пор не сделали нормальной игры на js типа Crysis )) Или аналог Photoshop на javascript ))))

Цитата:

Сообщение от coventgarden
но с увеличением объема текста (200+ страниц) так же жутко тормозят

Скорее всего потому-что все страницы одновременно присутствуют в DOM-модели. Загляни в DOM-инспектор (F12 или Ctr+Shift+I)

DjDiablo 19.02.2013 17:14

Цитата:

Через мульти-колумнс, кстати, никак нельзя?
согласен, интересно. Это могло бы дать хорошую скорость

Pavel M. 19.02.2013 17:58

разбиение на колонки не везде пока работает http://caniuse.com/#search=column-count

Deff 20.02.2013 11:36

Дзен-трансгуманист, -Симпатично,

Думаю удобнее втыкивать следующую станицу в div , скрытый z-index(ом) и заполнять страницу текстом до достижения нужной высоты, для контроля нужной высоты использовать отслеживание «onresize» на элементе http://habrahabr.ru/post/166321/

DjDiablo 20.02.2013 13:17

сто пудово лучше. И сто пудого медленнее.
Кому нелень попробуйте ))))))))))))

Deff 20.02.2013 13:21

DjDiablo, Если про мою идею,
Cто пудово - нет, iframe - пустой, пустой iframe подгружается за 100ms на ИЕ6-7

DjDiablo 20.02.2013 14:40

чего нет ? :blink:
причём тут iframe

Deff 20.02.2013 17:12

Цитата:

Сообщение от Дзен-трансгуманист
Можно просто этот див не запихивать в документ,

Хм - а как не запихивая - считать реальную высоту( особливо если резиново (по ширине в % от реального экрана)
И если подгружаем сразу намеренно контент - до и после текущей страницы, операции мон делать не суетясь во время просмотра текущей...
Клик по пагинатору не менее 0.3 - 0.5 сек

Deff 20.02.2013 17:42

Цитата:

Сообщение от Дзен-трансгуманист
Я почему-то думал, что можно посчитать реальные размеры листа (дива), который отображен на странице, установить такую же ширину несвязанному диву и измерять его bounding rect или чего там у него есть

Можно, но не думаю что в скрытом z-index(ом) div - медленнее - чем саморендинг, по идее многотекст без картинок быстро рендицо

Deff 20.02.2013 18:03

Дзен-трансгуманист,
у меня просто воспоминания о самодельном чате, с рендингом архива мессагов в скрытом div, страниц не было, но контент подгружался по скроллу с запасом(вверх и вниз) - очевидных задержек - не наблюдалось

DjDiablo 20.02.2013 18:31

Цитата:

Сообщение от Дзен-трансгуманист
Но мне лень.

Цитата:

Сообщение от DjDiablo
Кому нелень попробуйте ))))))))))))

Цитата:

Сообщение от Deff
у меня просто воспоминания

нерешаемая задача :D

Цитата:

А измерять можно добавляя сперва целые абзацы, а затем более точно
угу

coventgarden 20.02.2013 19:23

Вау, в моем топике кипит жизнь.

Трансгуманисту респект.

Пока перечитывал Хэмингуэя, возникло подозрение, что можно
1) посчитать количество символов и строк в документе,
2) выяснить среднее количество символов на строку
3) выяснить количество строк в экране
4) умножить среднее количество символов в документе на количество строк в экране.
5) вставить это число в p.adjust

Deff 20.02.2013 20:24

Ну ежели с Dom работать, то сыпешь небольшими блоками (из подгруженного в storage) как попало, и зыришь событие изменения высоты заготовки страницы - тогда либо просто убираешь последний, либо возишься с ним и сокращаешь высоту последнего

Deff 20.02.2013 22:10

Цитата:

Сообщение от Дзен-трансгуманист
Чтобы обеспечить межстраничную непрерывность текста, придется пересчитать весь предшествующий контент. Я уже задумывался об этом сценарии.

Хм - странно - если грузить в storage непрерывный текст, и начинать парсить с 1-й страницы, (перепарсенные границы просто помечаешь в сохранненом тексте bound - вставками (не показываемых и не учитываемых) - то вроде проблем не возникало там сотня страниц за секунду две(если ток текст, то чтраницы с текстом можно рендить в уменьшенном масштабе, сокращая пропорционально межстрочный и буквы)

coventgarden 20.02.2013 22:33

Такой вопрос, для общего развития
Есть длинный хтмл текст
<div class="wrapper"><div class="text">
Long time ago...
</div></div>

wrapper = fixed, 100%, 100%, overflow:hidden;

Пишу скрипт, который
Берет высоту wrapper (800)

Делаем для text отступ (margin-top:-800) - получаем вторую страницу.
При каждом нажатии на стрелки увеличиваем или уменьшаем margin-top на высоту wrapper, двигаемся по страницам.

При ресайзе окна вставляю на верхнюю строку на экране (текущий отступ / 20) div c якорем, выясняю на какой строке якорь, делаю отступ.

Что я упустил?

Deff 20.02.2013 22:43

ксать забавно, если wrapper = fixed, 100%, 100%;overflow-y:hidden;
То возможно можно скрыто ресайзить и в оверлее, контент вне окна

coventgarden 20.02.2013 23:48

а как выбрать нпр 120 и 160 строку текста и окружить все между ними в <div></div>?

Deff 21.02.2013 02:58

coventgarden,
Хм... а что строки уже в тегах ? Лучше изначально засунуть весь контент в storage, скопировать в переменную.
Из переменной(типо стек) заполняем поблочно ( допустим блоками по 300 cимволов), коли высота <div> cтала больше положенной, последний блок удаляем и пихаем его посимвольно, - остаток символов снова в стек, в storage помечаем - вставляем невидимый разделитель для очередной созданной страницы

Pavel M. 21.02.2013 15:31

может быть посмотреть как в популярных online читалках сделано?

Deff 25.02.2013 07:08

Вот тут cхоже по теме: (пример из топика http://javascript.ru/forum/misc/3583...j-verstke.html
Контроль изменения высоты любого из span, как критерий перехода в новыю колонку( новый span), либо еще каких-нибудь действий

(Закидываем в один из span контент больше максимально-допустимой его высоты
<!DOCTYPE>
<html>
<head>

</head>
<body>

<style>
html, body, div{height: 100%;margin:0;padding:0;}
.wrp span{
    margin: 0;
    vertical-align: top;
    display: inline-block;
    white-space:pre-wrap;
    word-wrap: break-word;
    min-height: 200px;
    max-height: 202px;
    width:200px;
    border: 1px solid red;
}
.wrp{
    position:absolute;
    border: 1px solid blue;
    white-space:nowrap;
    padding:0;
    height: auto;


}
</style>
<div class=wrp><iframe name="frame" width="88"  height="100%" style="margin:0;position:absolute;border:green solid 1px;/*z-index:-1*/"></iframe>
    <span></span>
    <span></span>
    <span id=third></span>
    <span></span>
    <span></span>
    <span></span>
    <span></span>
    <span></span>
    <span></span>
    <span></span>
    <span></span>
    <span></span>
    <span></span>
    <span></span>
</div>

<script type="text" id="scr00">
вввввввввввввввввввввввввввввввввввввввввв
вввввввввввввввввввввввввввввввввввввввввв
вввввввввввввввввввввввввввввввввввввввввв
вввввввввввввввввввввввввввввввввввввввввв
вввввввввввввввввввввввввввввввввввввввввв
вввввввввввввввввввввввввввввввввввввввввв
вввввввввввввввввввввввввввввввввввввввввв
вввввввввввввввввввввввввввввввввввввввввв
вввввввввввввввввввввввввввввввввввввввввв 
</script>
<script type="text/javascript">
setTimeout(function(){ // Отработка задержки фрейма (для FF и ИЕ)
   var timerResize='first';
   frame.onresize = function(){ // frame,  - Имя фрейма (name=frame)  - cм начало Кода;
     if(timerResize!=='first')clearTimeout(timerResize);
     timerResize=setTimeout( function(){  //  Задержка для очистки  чрезмерных срабатываний;
         alert('Высота div class=wrp изменена.'); // Тело обработки события «onresize»;

     },20)  // Параметр 20(ms) , - зависит от нужной скорости реагирования на повторные события;
            // актуально при плавных изменениях размера элемента,   
            // либо почти одновременное изменением размера несколькими разными процессами.
  }
},200);


setTimeout(function(){  //Докидываем контент в третий span 
  document.getElementById("third").innerHTML=document.getElementById("scr00").innerHTML;
},7000);

</script>


</body>
</html>

danik.js 25.02.2013 08:05

Deff реально больной...

Deff 25.02.2013 08:14

danik.js, - реально
Задрал, если пишу, не для тебя, помимо есть люди


Часовой пояс GMT +3, время: 12:09.