Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перемещаем выделенный текст 
V
    Опции темы
YurkaKursant
  Дата 22.9.2009, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 31.7.2009

Репутация: нет
Всего: нет



Есть такая задача: в textarea есть текст. При выделении любого слова, над ним появляется div с кнопкой. Нажимая на кнопку, при помощи "СелектТекст" надо выделенное слово вставить в текстовое поле <input type="text"/>, вырезая его из textarea.
У кого есть идеи, подскажите, пожалуйста. Очень нужно.
PM MAIL   Вверх
Amphiluke
Дата 22.9.2009, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Не очень понял, что значит
Цитата(YurkaKursant)

при помощи "СелектТекст"


Вот примерчик...
Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
   <meta http-equiv="content-type" content="text/html;charset=utf-8" />
   <title>Template</title>
    <script type="text/javascript">
      selObj = null;
      var selTxt = "";
      function showDiv(sender) {
         if (window.getSelection) {
            selObj = {target: sender, start: sender.selectionStart, end: sender.selectionEnd};
            selTxt = sender.value.slice(selObj.start, selObj.end);
         } else {
            selObj = document.selection;
            if (selObj == null) return true;
            var selTxtRng = selObj.createRange();
            selTxt = selTxtRng.text;
         }
         document.getElementById("hint").style.visibility = "visible";
      }
      function cutTxt() {
         if (selObj.clear) {
            selObj.clear();
         } else {
            selObj.target.value = selObj.target.value.slice(0, selObj.start) + selObj.target.value.slice(selObj.end);
         }
         delete selObj;
         document.getElementById("hint").style.visibility = "hidden";
         document.getElementById("selTxtInput").value = selTxt;
         selTxt = "";
      }
   </script>
   
</head>

<body>
   <form action="#">
      Selected text: <input type="text" id="selTxtInput" />
      <input type="button" value="cut" id="hint" onclick="cutTxt();" style="visibility: hidden;" /><br />
      <textarea cols="50" rows="15" onselect="showDiv(this);"></textarea>
   </form>
</body>

</html>

PM   Вверх
YurkaKursant
Дата 23.9.2009, 06:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 31.7.2009

Репутация: нет
Всего: нет



А как сделать, чтобы при повторном записывании в текстовое поле предыдущая запись не удалялась, а к ней просто дописывалась следующая? 
PM MAIL   Вверх
Amphiluke
Дата 23.9.2009, 06:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Цитата(YurkaKursant @  23.9.2009,  06:02 Найти цитируемый пост)
А как сделать, чтобы при повторном записывании в текстовое поле предыдущая запись не удалялась, а к ней просто дописывалась следующая? 

Ну вы даете smile 

Код

document.getElementById("selTxtInput").value += selTxt;


Это сообщение отредактировал(а) Amphiluke - 23.9.2009, 06:41
PM   Вверх
YurkaKursant
Дата 23.9.2009, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 31.7.2009

Репутация: нет
Всего: нет



Блин, действительно) 
Ни как не получается параллельно вставлению слова в текстовое поле возводить первую букву в верхний регистр, вообще реально это реализовать? 
Спасибо!
PM MAIL   Вверх
Amphiluke
Дата 23.9.2009, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Можно так.
Код

document.getElementById("selTxtInput").value += selTxt.charAt(0).toUpperCase() + selTxt.slice(1);

PM   Вверх
YurkaKursant
Дата 23.9.2009, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 31.7.2009

Репутация: нет
Всего: нет



 smile С кнопочкой все понятно. Но повесить div прямо над/под выделенным словом не получается. Да еще нужно, чтобы сразу 2 или 3 кнопочки было в div (такая "своеобразная менюшка"), причем по одной слово перемещается в одно текстовое поле, по другой во второе, по третьей в третье. Есть идеи?
PM MAIL   Вверх
Amphiluke
Дата 23.9.2009, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Сделать появляющийся div — не проблема. Самая главная проблема — определить клиентские координаты выделенного текста в окне браузера. В IE объект TextRange поддерживает атрибуты offsetLeft и offsetTop, так что там проблема решаема (хоть сейчас). А вот в FF как вытянуть координаты, что-то не вспомню. Надо смотреть мануал.

Если желаете могу написать для IE, дальше уж сами «ковыряйтесь» (время дорого).

Добавлено через 2 минуты и 27 секунд
Кстати, если выделение производится только мышью, то тоже легко можно сделать во всех браузерах — использовать атрибуты объекта Event.
PM   Вверх
YurkaKursant
Дата 23.9.2009, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 31.7.2009

Репутация: нет
Всего: нет



Да, выделяем только мышью! Если кроссбраузерность с event реализуема, то это классно)
PM MAIL   Вверх
Amphiluke
Дата 23.9.2009, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Хм. Возникли (решаемые) проблемы с Event. Дело в том, что событие onselect не порождает его экземпляр, который можно было бы использовать для заполучения координат. Пришлось дополнительно навешивать «слушатель» события mouseup — ради только заполучения координат...

В общем, надоело.  smile  Осталось только дело подогнать под конкретные нужды. Вот.
Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
   <meta http-equiv="content-type" content="text/html;charset=utf-8" />
   <title>Template</title>
   
   <style type="text/css">
      #hint {
         background: #FFFFDD;
         border: 1px solid #000000;
         display: none;
         padding: 5px 15px;
         position: absolute;
         width: 300px;
      }
   </style>
   
   <script type="text/javascript">
      selObj = null;
      var selTxtRng;
      var coords = {x:0, y:0};
      var selTxt = "";
      function showDiv(sender) {
         if (window.getSelection) {
            selObj = {target: sender, start: sender.selectionStart, end: sender.selectionEnd};
            selTxt = sender.value.slice(selObj.start, selObj.end);
         } else {
            selObj = document.selection;
            if (selObj == null) return true;
            selTxtRng = selObj.createRange();
            selTxt = selTxtRng.text;
         }
         var hintDiv = document.getElementById("hint");
         with (hintDiv.style){
            left = (selTxtRng) ? selTxtRng.offsetLeft + "px" : coords.x + "px";
            top = (selTxtRng) ? (selTxtRng.offsetTop - 50).toString() + "px" : (coords.y - 35).toString() + "px";
            display = "block";
            sender.focus();
         } 
      }
      function cutTxt(destInput) {
         if (selObj.clear) {
            selObj.clear();
         } else {
            selObj.target.value = selObj.target.value.slice(0, selObj.start) + selObj.target.value.slice(selObj.end);
         }
         delete selObj;
         document.getElementById("hint").style.display = "none";
         document.getElementById(destInput).value += selTxt.charAt(0).toUpperCase() + selTxt.slice(1);
         selTxt = "";
      }
      function storeCoords(evnt) {
         var ev = (evnt) ? evnt : event;
         coords.x = (ev.x) ? ev.x : ev.pageX;
         coords.y = (ev.y) ? ev.y : ev.pageY;
      }
   </script>
   
</head>

<body>
   <form action="#">
      <div id="hint">
         <input type="button" value="Cut -&gt; 1st" onclick="cutTxt('selTxtInput1');" />
         <input type="button" value="Cut -&gt; 2nd" onclick="cutTxt('selTxtInput2');" />
         <input type="button" value="Cut -&gt; 3rd" onclick="cutTxt('selTxtInput3');" />
      </div>
      Selected text #1: <input type="text" id="selTxtInput1" /><br />
      Selected text #2: <input type="text" id="selTxtInput2" /><br />
      Selected text #3: <input type="text" id="selTxtInput3" /><br />
      <textarea cols="50" rows="15" onselect="showDiv(this);" onmouseup="storeCoords(event);"></textarea>
   </form>
   
</body>

</html>

PM   Вверх
YurkaKursant
Дата 23.9.2009, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 31.7.2009

Репутация: нет
Всего: нет



Спасибо большое)
PM MAIL   Вверх
YurkaKursant
Дата 24.9.2009, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 31.7.2009

Репутация: нет
Всего: нет



Есть проблема: В разных браузерах положения div при появлении неприятно удивляет (в разных местах отображается). Как сделать так, чтобы появляющийся div был привязан координатам мыши (выше или ниже нее)????

Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
   <meta http-equiv="content-type" content="text/html; charset=windows-1251" />
   <title>Template</title>
   <STYLE type=text/css>
   #hint {
         background: #CCCCCC;
         border: 1px solid #000000;
         display: none;
         padding: 0px 2px 4px 2px;
         position: absolute;
         width: 114px;
         }
.button  {
background-color: #5B6A90;
border:1px solid #000000;
border-right-color: #000000;
border-bottom-color: #000000;
color:#ffffff;
margin:0px;
margin-left:0px;
font:bold 10px Arial; 
width: 110px;
        }  </style>
   
   <script type="text/javascript">
      selObj = null;
      var selTxtRng;
      var coords = {x:0, y:0};
      var selTxt = "";
      function showDiv(sender) {
         if (window.getSelection) {
            selObj = {target: sender, start: sender.selectionStart, end: sender.selectionEnd};
            selTxt = sender.value.slice(selObj.start, selObj.end);
         } else {
            selObj = document.selection;
            if (selObj == null) return true;
            selTxtRng = selObj.createRange();
            selTxt = selTxtRng.text;
         }
         var hintDiv = document.getElementById("hint");
         with (hintDiv.style){
            left = (selTxtRng) ? selTxtRng.offsetLeft + "px" : coords.x + "px";
            top = (selTxtRng) ? (selTxtRng.offsetTop - -20).toString() + "px" : (coords.y - 35).toString() + "px";
            display = "block";
            sender.focus();
         } 
      }
      function cutTxt(destInput) {
         if (selObj.clear) {
            selObj.clear();
         } else {
            selObj.target.value = selObj.target.value.slice(0, selObj.start) + selObj.target.value.slice(selObj.end);
         }
         delete selObj;
         document.getElementById("hint").style.display = "none";
         document.getElementById(destInput).value += selTxt.charAt(0).toUpperCase() + selTxt.slice(1);
         selTxt = "";
      }
      function storeCoords(evnt) {
         var ev = (evnt) ? evnt : event;
         coords.x = (ev.x) ? ev.x : ev.pageX;
         coords.y = (ev.y) ? ev.y : ev.pageY;
      }
   </script>
</head>

<body>
<form name="form" action="#">
      Автор: <input type="text" style="width: 200px;" id="selTxtInput1" /><br />
      Название: <input type="text" style="width: 200px;" id="selTxtInput2" /><br />
      Ключ. слова: <input type="text" style="width: 200px;" id="selTxtInput3" /><br />
</form>
      
<form name="FormPopUp" action="#">
      <div id="hint"><center>
      <b>ввести в поле:</b></br>
<input type="button" class="button" value="Автор" onclick="cutTxt('selTxtInput1');" onMouseOver="style.color='#ffcc00'" onMouseOut="style.color='white'" style="cursor:pointer;"/><br />
<input type="button" class="button" value="Название" onclick="cutTxt('selTxtInput2');" onMouseOver="style.color='#ffcc00'" onMouseOut="style.color='white'" style="cursor:pointer;"/><br />
<input type="button" class="button" value="Ключевые слова" onclick="cutTxt('selTxtInput3');" onMouseOver="style.color='#ffcc00'" onMouseOut="style.color='white'" style="cursor:pointer;"/><br />
      </center></div>
      
      <textarea cols="50" rows="15" onselect="showDiv(this);" onmouseup="storeCoords(event);">Василий Петрович Косяков 
Новости политики
правила ввода в текстовое поле 
      </textarea>
</form>
   
</body>
</html>

PM MAIL   Вверх
Amphiluke
Дата 24.9.2009, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Ответил в этой теме, поскольку заметил ее первой.
PM   Вверх
YurkaKursant
Дата 25.9.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 31.7.2009

Репутация: нет
Всего: нет



В общем подскажите плиз как реализовать чтобы, если мы щелкаем вне этого div'a то он скрывается, а если внутри div'a то с ним ничего не происходит. В общем как сделать отследить евенты щелчка по и вне div'а.

Как-нибудь так:
Код

document.onClick = function() {
    if (flag) then function showDiv(sender);
else function closeDiv();}



Код

<div id="hint" onmouseover="flag = true;" onmouseout="flag = false;" ></div>

PM MAIL   Вверх
Amphiluke
Дата 25.9.2009, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Вот добавьте примерно такое в скрипт
Код

function clickHandler(evnt) {
   var ev = (evnt) ? evnt : event;
   var sender = (ev.target) ? ev.target : ev.srcElement;
   while (sender.parentNode != null) {
      if (sender.id == "hint") return true;
      sender = sender.parentNode;
   }
   document.getElementById("hint").style.display = "none";
}
      
if (window.addEventListener) {
   window.addEventListener("mousedown", clickHandler, false);
} else {
   window.attachEvent("onmousedown", clickHandler);
}
</script>


P.S. Возможно, вам придется немного доработать. Проверял только в FF.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0620 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.