как получить тот кусок текста который сейчас видно на экране ?
есть большой текст. весь он не помещается на экран.
мне нужно получить в переменную только тот кусов который сейчас видно. Ума не приложу как это сделать ( |
блин есть способ но надо чтобы ты разбирался потому что там чуть што ни так то ты сразу не поймешь
|
посчитай прокрутку элемента с текстом посчитай размер шрифта и.т.п.
размер экрана, перносы строк и.т.п. а вообще я не знаю как это сделать |
прокрутка и шрифт не пойдет. мало того что в разных браузерах все несколько по разному, дак еще и на большом тексте мне кажется ошибка накопится большая.
|
даже не знаю как те помочь а зачем вообще такая задача?
|
вот тут описано примерно то что мне нужно. Но оно не совсем работает. Нормально работает если текст видно сначала, но если его промотать то работает не правильно.
|
:write: крутим кликаем по тексту )))
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> - jsFiddle demo</title> <script src="http://code.jquery.com/jquery-latest.js"></script> <link rel="stylesheet" type="text/css" href="/css/normalize.css"> <link rel="stylesheet" type="text/css" href="/css/result-light.css"> <style type='text/css'> .textnode { padding:1px; margin:0 1px; height:16px; float:left; } </style> <script type='text/javascript'> $(window).load(function(){ $(function(){ var tmp_id = 1; $('body div').contents().each(function(){ if(this.nodeType == 3) { var _this = $(this); var _swap = $('<div id="textnodewrapper' + tmp_id + '" />'); $.each(_this.text().split(' '),function(i,val){ if($.trim(val).length > 0) { _swap.append('<span class="textnode">' + val + '</span>'); } }); _swap.insertBefore(_this); _this.remove(); } tmp_id++; }); $('body').click(function(){ var screen_bottom = $(window).height(); var screen_scroll = $(window).scrollTop(); var on_screen_words = []; $('.textnode').each(function(){ if(($(this).position().top + $(this).height()) < (screen_bottom+screen_scroll)&& $(this).position().top>(screen_scroll-$(this).height())) { on_screen_words.push($(this).text()); } }); alert(on_screen_words.join(' ')); }) }); }); </script> </head> <body> <div> "Call me Ishmael," Moby-Dick begins, in one of the most recognizable opening lines in English-language literature. The narrator, an observant young man setting out from Manhattan, has experience in the merchant marine but has recently decided his next voyage will be on a whaling ship. On a cold, gloomy night in December, he arrives at the Spouter-Inn in New Bedford, Massachusetts, and agrees to share a bed with a then-absent stranger. When his bunk mate, a heavily tattooed Polynesian harpooner named Queequeg, returns very late and discovers Ishmael beneath his covers, both men are alarmed, but the two quickly become close friends and decide to sail together from Nantucket, Massachusetts on a whaling voyage. In Nantucket, the pair signs on with the Pequod, a whaling ship that is soon to leave port. The ship’s captain, Ahab, is nowhere to be seen; nevertheless, they are told of him — a "grand, ungodly, godlike man,"[26] who has "been in colleges as well as 'mong the cannibals," according to one of the owners. The two friends encounter a mysterious man named Elijah on the dock after they sign their papers and he hints at troubles to come with Ahab. The mystery grows on Christmas morning when Ishmael spots dark figures in the mist, apparently boarding the Pequod shortly before it sets sail that day. The ship’s officers direct the early voyage while Ahab stays in his cabin. The chief mate is Starbuck, a serious, sincere Quaker and fine leader; second mate is Stubb, happy-go-lucky and cheerful and always smoking his pipe; the third mate is Flask, short and stout but thoroughly reliable. Each mate is responsible for a whaling boat, and each whaling boat of the Pequod has its own pagan harpooneer assigned to it. Some time after sailing, Ahab finally appears on the quarter-deck one morning, an imposing, frightening figure whose haunted visage sends shivers over the narrator. “ He looked like a man cut away from the stake, when the fire has overrunningly wasted all the limbs without consuming them, or taking away one particle from their compacted aged robustness... Threading its way out from among his grey hairs, and continuing right down one side of his tawny scorched face and neck, till it disappeared in his clothing, you saw a slender rod-like mark, lividly whitish. It resembled that perpendicular seam sometimes made in the straight, lofty trunk of a great tree, when the upper lightning tearingly darts down it, and without wrenching a single twig, peels and grooves out the bark from top to bottom ere running off into the soil, leaving the tree still greenly alive, but branded. ” One of his legs is missing from the knee down and has been replaced by a prosthesis fashioned from a sperm whale's jawbone. Soon gathering the crewmen together, with a rousing speech Ahab secures their support for his single, secret purpose for this voyage: hunting down and killing Moby Dick, an old, very large sperm whale, with a snow-white hump and mottled skin, that crippled Ahab on his last whaling voyage. Only Starbuck shows any sign of resistance to the charismatic but monomaniacal captain. The first mate argues repeatedly that the ship’s purpose should be to hunt whales for their oil, with luck returning home profitably, safely, and quickly, but not to seek out and kill Moby Dick in particular — and especially not for revenge. Eventually even Starbuck acquiesces to Ahab's will, though harboring misgivings. The mystery of the dark figures seen before the Pequod set sail is explained during the voyage's first lowering for whales. Ahab has secretly brought along his own boat crew, including a mysterious harpooneer named Fedallah (also referred to as 'the Parsee'), an inscrutable figure with a sinister influence over Ahab. Later, while watching one night over a captured whale carcass, Fedallah gives dark prophecies to Ahab regarding their twin deaths. Moby Dick The novel describes numerous "gams," social meetings of two ships on the open sea. Crews normally visit each other during a gam, captains on one vessel and chief mates on the other. Mail may be exchanged and the men talk of whale sightings or other news. For Ahab, however, there is but one relevant question to ask of another ship: “Hast seen the White Whale?” After meeting several other whaling ships, which have their own peculiar stories, the Pequod enters the Pacific Ocean. Queequeg becomes deathly ill and requests that a coffin be built for him by the ship’s carpenter. Just as everyone has given up hope, Queequeg changes his mind, deciding to live after all, and recovers quickly. His coffin becomes his sea chest, and is later caulked and pitched to replace the Pequod's life buoy. Soon word is heard from other whalers of Moby Dick. The jolly Captain Boomer of the Samuel Enderby has lost an arm to the whale, and is stunned at Ahab's burning need for revenge. Next they meet the Rachel, which has seen Moby Dick very recently. As a result of the encounter, one of its boats is missing; the captain’s youngest son had been aboard. The Rachel's captain begs Ahab to aid in the search for the missing boat, but Ahab is resolute; the Pequod is very near the White Whale now and will not stop to help. Finally the Delight is met, even as its captain buries a sailor who had been killed by Moby Dick. Starbuck begs Ahab one final time to reconsider his thirst for vengeance, but to no avail. The next day, the Pequod meets Moby Dick. For two days, the Pequod's crew pursues the whale, which wreaks widespread destruction, including the disappearance of Fedallah. On the third day, Moby Dick rises up to reveal Fedallah tied to him by harpoon ropes, clearly dead. Even after the initial battle on the third day, as Moby Dick swims away from the Pequod, Starbuck exhorts Ahab one last time to desist, observing that "Moby-Dick seeks thee not. It is thou, thou, that madly seekest him!" Ahab ignores this voice of reason and continues with his ill-fated chase. As the three boats sail out to hunt him, Moby Dick damages two of them, forcing them to go back to the ship and leaving only Ahab's vessel intact. Ahab harpoons the whale, but the harpoon-line breaks. Moby Dick then rams the Pequod itself, which begins to sink. As Ahab harpoons the whale again, the unfolding harpoon-line catches him around his neck and he is dragged into the depths of the sea by the diving Moby Dick. The boat is caught up in the whirlpool of the sinking ship, which takes almost all the crew to their deaths. Only Ishmael survives, clinging to Queequeg’s coffin-turned-life buoy for an entire day and night before the Rachel rescues him. </div> </body> </html> |
хм. Вроде как работает. Не могли бы вы пояснить что там происходит ?
|
mitiya,
текст разбивается на блоки -- если блок входит в видимый диапазон - позиция больше скрола но меньше (скрол + высота окна) - набирается массив подходящих под это условие |
рони, прикольно. Следует понимать, что не стоит использовать это на больших объемах текста, иначе все будет тормозить.
|
рони,
ха, точно, мы же так определяли фзическую позицию курсора в textarea, все забыли а ты крут) |
мне вот как раз надо на большом тексте (1-2 миллиона знаков).
надо бы придумать что-то. я вот если честно все равно не совсем понимаю как это работает. вот тут я так понимаю происходит разбиение на блоки $('body div').contents().each(function(){ if(this.nodeType == 3) { var _this = $(this); var _swap = $('<div id="textnodewrapper' + tmp_id + '" />'); $.each(_this.text().split(' '),function(i,val){ if($.trim(val).length > 0) { _swap.append('<span class="textnode">' + val + '</span>'); } }); _swap.insertBefore(_this); _this.remove(); } tmp_id++; }); я так понимаю делится по словам. в принципе мне не нужна точность до слова. можно по 5 бить, плюс это вообще можно сделать сразу один раз и вообще на сервере. но вот как сделать так чтоб при определении видно или нет кусок, не приходилось пробегать весь текст. на ум пока приходит только иерархическая разбивка |
var _this = $(this); var $this = $(this); |
$.each(_this.text().split(' '),function(i,val){ if($.trim(val).length > 0) { _swap.append('<span class="textnode">' + val + '</span>'); } }); не пойму что-то от куда это val берется, и i тоже? |
mitiya, это передаются аргументы в функцию
|
|
В каких браузерах это должно работать? Есть метод document.elementFromPoint, который поможет отфильтровать элементы и затем уже применить способ рони
|
хотя бы во всех современных, включая мобильные
|
А вариант использования моноширинного шрифта не подходит?
|
с моноширинным шрифтом все не так просто как кажется.
в тесте встречаются еще и символы переноса строки, иногда несколько подряд. На таком большом тексте это вызывает большую ошибку при попытке посчитать где какой символ находится. Вообще, document.elementFromPoint вроде как работает во всех браузерах сейчас, так что это может быть каким не каким решением. |
Цитата:
|
почему это не проблема ?
каков алгоритм ? на пальцах хотя бы |
Потому что их можно подсчитывать.
|
во-первых что бы их подсчитать надо перебрать весь текст по символам.
во-вторых не достаточно знать просто их количество, в тексте с 2 миллионами символов их может набраться на пару страниц, но если они используются по одному это одно, а если где-то их много подряд это вызовет приличное смещение текста только после этого куска, и тд. |
Ну ок, если вариант с 100 000 dom-элементами вас устраивает.
С моноширинным шрифтом можно без особых проблем определить где какое слово находится. Ну да, придется пройтись по тексту, но не обязательно по каждому символу. |
Вообще задача не тривиальная и интересная)
danik.js, а ты ваще чо какой умный ты ж не новичек)? ты аву поменял я всех по аве только знаю напомни какая старая была? |
Цитата:
Цитата:
|
Вариант решения ... смотреть только в ие ... это просто макет ... точность последнее предложение ...
<!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> </head> <body onclick="go()">ПОКОЛЕНИЕ "П" Когда-то в России и правда жило беспечальное юное поколение, которое улыбнулось лету, морю и солнцу - и выбрало "Пепси". Сейчас уже трудно установить, почему это произошло. Наверно, дело было не только в замечательных вкусовых качествах этого напитка. И не в кофеине, который заставляет ребятишек постоянно требовать новой дозы, с детства надежно вводя их в кокаиновый фарватер. И даже не в банальной взятке - хочется верить, что партийный бюрократ, от которого зависело заключение контракта, просто взял и полюбил эту темную пузырящуюся жидкость всеми порами своей разуверившейся в коммунизме души. Скорей всего, причина была в том, что идеологи СССР считали, что истина бывает только одна. Поэтому у поколения "П" на самом деле не было никакого выбора, и дети советских семидесятых выбирали "Пепси" точно так же, как их родители выбирали Брежнева. Как бы там ни было, эти дети, лежа летом на морском берегу, подолгу глядели на безоблачный синий горизонт, пили теплую пепси-колу, разлитую в стеклянные бутылки в городе Новороссийске, и мечтали о том, что когда-нибудь далекий запрещенный мир с той стороны моря войдет в их жизнь. Прошло десять лет, и этот мир стал входить - сначала осторожно и с вежливой улыбкой, а потом все уверенней и смелее. Одной из его визитных карточек оказался клип, рекламирующий "Пепси-колу", - клип, который, как отмечали многие исследователи, стал поворотной точкой в развитии всей мировой культуры. В нем сравнивались две обезьяны. Одна из них пила "обычную колу" и в результате оказалась способна выполнять некоторые простейшие логические действия с кубиками и палочками. Другая пила пепси-колу. Весело ухая, она отъезжала в направлении моря на джипе в обнимку с девицами, которые явно чихать хотели на женское равноправие (когда приходится тесно общаться с обезьянами, лучше просто не думать о подобных вещах, потому что равноправие и неравноправие будут одинаково тяжелы для души). Если вдуматься, уже тогда можно было понять, что дело не в пепси-коле, а в деньгах, с которыми она прямо связывалась. К этому выводу приводили, во-первых, классическая фрейдистская ассоциация, обусловленная цветом продукта; во-вторых, логическое умозаключение - поглощение пепси-колы позволяет приобретать дорогие машины. Но мы не собираемся глубоко анализировать этот клип (хотя, может быть, именно здесь нашлось бы объяснение того, почему так называемые шестидесятники упорно называют поколение "П" говнососами). Для нас важно только то, что окончательным символом поколения "П" стала обезьяна на джипе. Немного обидно было узнать, как именно ребята из рекламных агентств на Мэдисон-авеню представляют себе свою аудиторию, так называемую target group. Но трудно было не поразиться их глубокому знанию жизни. Именно этот клип дал понять большому количеству прозябавших в России обезьян, что настала пора пересаживаться в джипы и входить к дочерям человеческим. Глупо искать здесь следы антирусского заговора. Антирусский заговор, безусловно, существует - проблема только в том, что в нем участвует все взрослое население России. Так что "Пепси-кола" здесь совершенно ни при чем. Случившееся было частью всемирного процесса, отраженного во множестве книг (достаточно вспомнить "Ожидание обезьян" Андрея Битова или "Браззавильский пляж" Вильяма Бойда). Не обошел этот процесс и Америку, хотя там все произошло совсем иначе - "Кока-кола" полностью, окончательно и необратимо вытеснила "Пепси-колу" с красного цветового поля, что для понимающего человека равнозначно победе при Ватерлоо. Это было связано с деятельностью религиозных правых, которые очень сильны в Соединенных Штатах. Они не признают эволюции; "Кока-кола" лучше вписывается в их картину мира, потому что пьющая ее обезьяна так и остается обезьяной. Впрочем, мы слишком долго говорим об обезьянах - а собирались ведь искать человека. Вавилен Татарский родился задолго до этой исторической победы красного над красным. Поэтому он автоматически попал в поколение "П", хотя долгое время не имел об этом никакого понятия. Если бы в те далекие годы ему сказали, что он, когда вырастет, станет копирайтером, он бы, наверно, выронил от изумления бутылку "Пепси-колы" прямо на горячую гальку пионерского пляжа. В те далекие дни детям положено было стремиться к сияющему шлему пожарного или белому халату врача. Даже мирное слово "дизайнер" казалось сомнительным неологизмом, прижившимся в великом русском языке по лингвистическому лимиту, до первого серьезного обострения международной обстановки. Но в те дни в языке и в жизни вообще было очень много сомнительного и странного. Взять хотя бы само имя "Вавилен", которым Татарского наградил отец, соединявший в своей душе веру в коммунизм и идеалы шестидесятничества. Оно было составлено из слов "Василий Аксенов" и "Владимир Ильич Ленин". Отец Татарского, видимо, легко мог представить себе верного ленинца, благодарно постигающего над вольной аксеновской страницей, что марксизм изначально стоял за свободную любовь, или помешанного на джазе эстета, которого особо протяжная рулада саксофона заставит вдруг понять, что коммунизм победит. Но таков был не только отец Татарского, - таким было все советское поколение пятидесятых и шестидесятых, подарившее миру самодеятельную песню и кончившее в черную пустоту космоса первым спутником - четыреххвостым сперматозоидом так и не наставшего будущего. Татарский очень стеснялся своего имени, представляясь по возможности Вовой. Потом он стал врать друзьям, что отец назвал его так потому, что увлекался восточной мистикой и имел в виду древний город Вавилон, тайную доктрину которого ему, Вавилену, предстоит унаследовать. А сплав Аксенова с Лениным отец создал потому, что был последователем манихейства и натурфилософии и считал себя обязанным уравновесить светлое начало темным. Несмотря на эту блестящую разработку, в возрасте восемнадцати лет Татарский с удовольствием потерял свой первый паспорт, а второй получил уже на Владимира. <SCRIPT > function go() { var html = document.documentElement; window.clearInterval(timer); var rng = document.body.createTextRange(); rng.moveToPoint(html.clientWidth-5,html.clientHeight-5); rng.expand('sentence'); rng.select(); var word_end = rng.text; var reg = new RegExp(word_end+"$"); rng.moveToPoint(0,0); rng.expand("word"); var timer = window.setInterval(function () { rng.moveEnd("word", 1); rng.select(); if (reg.test(rng.text)) { window.clearInterval(timer); alert(rng.text); } },20) } </SCRIPT> </body> </html> |
Часовой пояс GMT +3, время: 20:48. |