Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как получить первую видимую строку в переменную ? (https://javascript.ru/forum/misc/29441-kak-poluchit-pervuyu-vidimuyu-stroku-v-peremennuyu.html)

mitiya 28.06.2012 02:14

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

Aetae 28.06.2012 07:51

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

Gvozd 28.06.2012 10:22

вы что HTML не учите?!
<a name="ancor1">тут</a>

<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>

<a name="ancor2">там</a>

<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>

<a href="#ancor1" >туда</a>
<a href="#ancor2" >в тама</a>

mitiya 28.06.2012 11:16

Aetae,
можно по подробней? я в общем-то не еще только разбираюсь в js.

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

Deff 28.06.2012 11:23

mitiya,
Цитата:

Сообщение от mitiya
есть текст на несколько экранов, нужно сделать что-то типа закладок.
хочу как-то сделать так что бы первые 2-3 слова из самой верхней видимой в данный момент строки попадали в переменную, а потом чтобы можно было запустить поиск по тексту и прокрутить до этого места.
Запоминать вместо текста положение вертикального ползунка не вариант ибо, при изменении размера окна это не сработает.
но как найти именно первую видимую строку я ума не приложу (

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

Deff 28.06.2012 12:04

Есть более продвинутая метода вертикальная таблица во фрейме на 10 экранов и узенькая по ширине, при очередном скролле кликаем по табле на уровне Верхней границы экрана, номер строки запоминам, фрейм position:absolute;z-index:-1000;height:100%;

Aetae 28.06.2012 12:44

>вертикальная таблица во фрейме на 10 экранов и узенькая по ширине
Ты съел мой мозг.

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

Раз такое дело, то мои бредни имеют больше шансов на жизнь:
Видимый элемент на вскидку можно получить с помощью elementFromPoint, затем сделать с него range, и получить позицию первого видимого символа в этом элементе(как - пока не ясно, но по идее можно). Запоминать соответственно абсолютный номер ноды и позицию в тексте.
При последующей загрузке находить ноду, делать range, вставлять в позицию невидимый якорь и скролить к нему.

Как-то так.)

Deff 28.06.2012 12:54

Aetae,

:) Для текущего Аккаунта - достаточно удобная вещь - посколь во фрейме тут жа можно отправить форму с данными скролла для этого юзера - как то делал для просмотра архивов чата Администратором
Архивы бывают на 10-30 листов
Для многопользовательского сайта мон организовать записью в кук текущего юзера двумерным массивом
где первый индекс - ссылка на таблицу с адресами страниц, второй - номер строки фреймо таблицы, ксать тады её стоит ставить не фреймом, а div overflow-y:hidden, посколь на фрейме с куками проблемы

Deff 28.06.2012 13:17

Цитата:

Сообщение от Aetae
они зависимы от разрешения экрана, оп сказал что ему нужен независимый вариант.

Ерунда - высота ячейки заранее определена! к примеру 20px

А метод с запоминанием скролла от ближайщего якоря - реализован здесь - кликните дважды на произвольное место в топике => http://forumd.ru/viewtopic.php?id=1225
И перезагрузите страницу

Aetae 28.06.2012 13:21

Цитата:

Сообщение от Deff (Сообщение 184796)
Aetae,
Для многопользовательского сайта мон организовать записью в кук текущего юзера двумерным массивом
где первый индекс - ссылка на таблицу с адресами страниц, второй - номер строки фреймо таблицы, ксать тады её стоит ставить не фреймом, а div overflow-y:hidden, посколь на фрейме с куками проблемы

Ещё раз говорю - опу нужно независимое от разрешение решение.
Ваш метод и так то весьма приблизителен, а в случае если такая ссылка будет сохранена при разрешении 1024х764, а открыта например при 1280х800 - попадание будет даже не близко. Такое решение будет работать только если весь тест состоит из абзацев по одной коротенькой строкеэ(и то не факт) либо если ширина строго фиксирована.

upd
Цитата:

Сообщение от Deff (Сообщение 184810)
А метод с запоминанием скролла от ближайщего якоря - реализован здесь - кликните дважды на произвольное место в топике => http://forumd.ru/viewtopic.php?id=1225
И перезагрузите страницу

Убогая мелкая фиксированная ширина, о чём я и говорю.

Попробуйте двойной клик, затем Ctrl+++ чтоб появились переносы строки, а затем обновить. Прам пам пам.

Deff 28.06.2012 13:31

Цитата:

Сообщение от Aetae
Убогая мелкая фиксированная ширина, о чём я и говорю.

Ну, а) ТС не говорил про резиновый сайт
Цитата:

Сообщение от Aetae
Убогая мелкая фиксированная ширина, о чём я и говорю.

b) Попробуйте с мобилы

Aetae 28.06.2012 13:45

Цитата:

Сообщение от Deff (Сообщение 184816)
Ну, а) ТС не говорил про резиновый сайт

Цитата:

Сообщение от mitiya (Сообщение 184716)
Запоминать вместо текста положение вертикального ползунка не вариант ибо, при изменении размера окна это не сработает.

Цитата:

Сообщение от Deff (Сообщение 184816)
b) Попробуйте с мобилы

И что я там увижу? (Не люблю мобилой пользоваться для интернета - пальцы-сосиски не способствуют. Максимум книжки читаю.:))

Deff 28.06.2012 13:46

Цитата:

Сообщение от Aetae
Запоминать вместо текста положение вертикального ползунка не вариант ибо, при изменении размера окна это не сработает.

Не явное указание - ибо ползунок относится к размеру экрана, а не к свойствам сайта

Aetae 28.06.2012 13:48

Бедный оп смотрит на нас и охреневает.)

Deff 28.06.2012 13:51

Фиг сым - Допустим Вы правы -
Тогда считать кол-во точек до данной строки - цифра короче, нежели текстовая переменная

mitiya 28.06.2012 14:14

если честно я ничего не понял )))

Aetae 28.06.2012 17:14

Цитата:

Сообщение от Deff (Сообщение 184826)
Фиг сым - Допустим Вы правы -
Тогда считать кол-во точек до данной строки - цифра короче, нежели текстовая переменная

Так причём тут текст. Я предлагаю запоминать 2 числа:
абсолютный номер ноды и позицию в тексте. Это даёт 100% точность в отличие от любого из ваших предложений.

Deff 28.06.2012 17:19

Цитата:

Сообщение от Aetae
Так причём тут текст. Я предлагаю запоминать 2 числа:
абсолютный номер ноды и позицию в тексте. Это даёт 100% точность в отличие от любого из ваших предложений.

Согласен :) Ток сейчас прочел и проникся - перед этим был занят отмахиванием от наезда

Aetae 28.06.2012 17:38

Поспорили и разошлись, а оп остался один и недоумевает: "Ээээ, а реализовать то хоть как-нибудь?.. ". =)

Deff 28.06.2012 18:09

mitiya,
Если на jQuery устроит - могу реализовать - если дадите ссылку на страницу - посколь оптимизировать стоит под конкретику,

mitiya 28.06.2012 18:58

Deff,
jQuery устроит разумеется. ссылки нет я только начал и тут же споткнулся. Да и самому все равно надо разбираться.
Мне хоть примерный код. Я к примеру не пойму что за нода О:)

Deff 28.06.2012 19:00

Цитата:

Сообщение от mitiya
что за нода О

Любой первый ближаший тег чуть впереди первой строки видимой на экране,
Потом смотрим его абсолютный номер среди подобных тегов на странице
===========================================
в jQuery я бы распарсил родителей и получил дерево вложенности body div.tryam div.post span.eq(13)
===========================================
Идея такова:
После очередного скролла или загрузки страницы - вычисляем координаты левого верхнего угла экрана относительно верха страницы
var Top=$(window).scrollTop( );
var Left=$(window).scrollLeft( );
далее перебираем крупнопанельные элементы страницы и изучаем попадают ли они в область видимости с заходом выше экрана или точно по верхней кромке - как только нашли такой элемент - парсим внутри его ближайший элемент к верхнему краю, как нашли - запоминаем его и смотрим есть ли текст в самом элементе, если нет - ищем текст в ближайшем за ним

mitiya 30.06.2012 23:09

Цитата:

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

Deff 30.06.2012 23:29

mitiya,
Для этого, - я и просил взглянуть на реальную страницу


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