Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: работа с буфером в JS (скопировать значение в переменную)

Сообщения:  [1-6] 

 
 автор: CNT   (08.09.2007 в 02:33)   письмо автору
 
   для: localGhost   (07.09.2007 в 13:49)
 

Как я понял задачу, вы выделяете мышью какой-то участок HTML-страницы и затем хотите получить через буфер "исходный код выделенного вами фрагмента страницы" (и уже из этого HTML-кода хотите "вытаскивать" src картинок).

Эта фича ("получение HTML-кода выделенного фрагмента на странице") реализована в браузере FF - там можно выделить что-угодно на странице (картинки вместе с текстом), затем правой кнопкой мыши вызвать контекстное меню, в котором есть пункт "Просмотр исходного кода выделенного вами фрагмента страницы", клик по которому вызывает открытие встроенного в FF текстового редактора, в котором и виден код фрагмента - обычно он, если маленький по размеру, показывается только как этот фрагмент кода; если велик, то показывается весь код страницы, а код, соответствующий содержанию, выделенному на странице, показан выделенным (синий фон, белый шрифт).

Я правильно понял вашу задачу?

Если правильно, то скажу сразу: решение эта задача ИМЕЕТ, но только не напрямую через использование буфера.
Ибо в буфере одновременно могут находиться только данные одного типа - или только текст (практически любого объёма - зависит от свободной на этот момент оперативной памяти), или только картинка (причём всегда одна). Т.е. буфер здесь просто НЕ ПОЛУЧИТСЯ использовать.

Реализация задачи в браузере MSIE (и Opera) не просто сложна, но ОЧЕНЬ СЛОЖНА. Сделать можно, наверно, ещё и под FF, но смысла особого не вижу - ибо реализовано это в самом движке.

Принцип решения следующий:
1. Получаете innerHTML документа (т.е. тега <html>)
2. Вытаскиваете из него ТЕКСТ документа, при этом не тупо парсите HTML-код, отбрасывая теги и оставляя только текст, а пытаетесь сопоставить текст структуре страницы.
Это самая сложная часть работы, потому остановлюсь подробнее.
Представьте себе страницу из двух дивов, расположенных вертикально, т.е. так:
+------------+---------------+
|            |               |
|  Див_1     |  Див_2        |
|  aaaaa     |  11111        |
|  bbbbb     |  22222        |
|  ccccc     |  33333        |
+------------+---------------+

В HTML-коде эта страница будет выглядеть так:
<div style="float: left">Див_1<br>aaaaa<br>bbbbb<br>ccccc</div>
<div style="float: right">Див_2<br>11111<br>22222<br>33333</div>

Если "тупо" вытащите текст страницы из кода, то получите следующую последовательность слов:
Див_1 aaaaa bbbbb ccccc Див_2 11111 22222 33333

А при выделении мышью последовательность слов текста у вас будет совсем иная, сравните с предыдущим текстом:
Див_1 Див_2 aaaaa 11111 bbbbb 22222 ccccc 33333

Мысль поняли?
Это я к тому, что соответствие между текстом HTML-кода и текстом выделенного напрямую определить весьма трудно - порядок представления текста на странице из-за форматирования страницы очень редко совпадает с порядком текста HTML-кода.

Так вот, если решите эту локальную задачу, т.е. из HTML-кода каким-то образом получите текст в той последовательности, в какой он и будет отображаться на странице, то, считайте, что общая задача уже решена: ищете место совпадения первого выделения с местом в HTML-коде и, соответственно, место последнего совпадения - этот HTML-код и "вываливаете" для последующей обработки (т.е. вытаскиваете оттуда всё что вам угодно, в т.ч. и src картинок)

Подсказываю, повторяясь, - эта задача решена для браузера FF, причём решена именно средствами JS. Коды FF открыты и имеются у вас на компьютере (если там установлен FF).
Пошукайте там и реализованное решение для FF обнаружите - после вам придется только адаптировать это решение под другие браузеры.

PS. Я давным-давно решАл эту задачу для MSIE (когда браузера FF ещё просто не было в природе). И решение (вроде как и работающее даже) где-то у меня на каком-то из компов есть... Но вам вряд ли это поможет, даже если найду этот файл.
Решение там содержит где-то порядка трёх (а то и - четырёх) тысяч строк JScript-кода.
Вряд ли вы ожидали такого, и к этому готовы и вряд ли будете в таком огромном чужом коде разбираться... "я так думаю!"(с)

PS2. Кстати, вспомнил, что решал я эту задачу и ещё раз, но принципиально иным способом (а не тем что изложен выше) - я отслеживал процесс выделения мышью, запуская код через onselectstart, начав запись абсолютных координат мыши по onselectionchange. Ну а по завершению выделения записанный массив координат сопоставлял с абсолютными координатами ВСЕХ объектов страницы и запоминал объекты, через которые мышь проходила, и вот их outerHTML выдавал для обработки. Но там тоже только для IE и код тоже сложен и велик, ибо мышью можно двигать только по одному краю страницы (и даже где-то посередине, и вверх и вниз, и возвращаясь...) да и на любом этапе можно выделение продолжить, используя клавиатуру - Шифт и стрелки...

   
 
 автор: bronenos   (07.09.2007 в 19:58)   письмо автору
 
   для: sim5   (07.09.2007 в 19:10)
 

для фф надо оперировать с .selectionStart, .selectionEnd, .selectionLength

   
 
 автор: sim5   (07.09.2007 в 19:10)   письмо автору
 
   для: localGhost   (07.09.2007 в 18:48)
 

Попробуйте этот пример - для IE и NN, под FF надо будет корректировать видимо.

<head>
<SCRIPT LANGUAGE="JavaScript">
<!-- Original: Ronnie T. Moore -->
var text = "";
function getActiveText(e) { 
// Sets text MSIE or Netscape active 
text = (document.all) ? document.selection.createRange().text : document.getSelection();
document.theform.text.value = text;
return true;
}

document.onmouseup = getActiveText;
if (!document.all) document.captureEvents(Event.MOUSEUP);
</script>
</head>

<body>
<input type=text name=demo value="Выделить текст в INPUT" size="20"> или <textarea rows="3" cols="20"
name="doost">выделить текст в TEXTAREA</textarea>
<br>Или просто текст на странице.
<br>
<form name=theform>
Выделен текст: <input type=text name=text value="" size="35" readonly>
</form>
</body>

   
 
 автор: localGhost   (07.09.2007 в 18:48)   письмо автору
 
   для: bronenos   (07.09.2007 в 13:58)
 

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

   
 
 автор: bronenos   (07.09.2007 в 13:58)   письмо автору
 
   для: localGhost   (07.09.2007 в 13:49)
 

катит в ие, либо
var html = document.body.innerHTML;

   
 
 автор: localGhost   (07.09.2007 в 13:49)   письмо автору
 
 

Ломаю голову над следующей задачей:
в буфер копируется содержимое некой HTML страницы, потом надо содержимое буфера (с форматированием) скопировать в переменную (JS, для последующего извлечения значения аттрибутов src у тэгов img). Как реализовать копирование из буфера? пробовал эксперементировать с execCommand('paste') и clipboardData.getData('text').. но ничего путного не вышло

   

Сообщения:  [1-6] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования