На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ElcnU, ANDLL, fatalist
  
> Доступ к выделенному тексту
    Помогите пожалуйста !!
    Пишу скрипт для добавления новостей. В поле text area нужно вводить новость, для форматирования текста есть кнопки (например B-жырный и т д), нужно чтобы когда я выделяю мышью текст и нажимаю кнопку форматирования в начале и в конце виделения появлялись тэги, например <b>Выделенный текст</b>, а если ничего не выделено, то на месте курсора должен появляться открывающий тэг (или закрывающий - в зависимости был ли открывающий).
    Вообщем точно так же как это сделано на этом форуме и многих других :)
      Вот скрипт:

      ExpandedWrap disabled
        <FORM NAME="myForm">
        <TEXTAREA NAME="myArea" COLS="40" ROWS="4"></TEXTAREA>
        </FORM>
         
        <script LANGUAGE="JavaScript">
        <!--
         
        function display() {
          if (document.getSelection) {
            var str = document.getSelection();
          } else if (document.selection && document.selection.createRange) {
            var range = document.selection.createRange();
            var str = range.text;
          } else {
            var str = "Sorry, this is not possible with your browser.";
          }
          document.myForm.myArea.value = str;
        }
         
        if (window.Event)
          document.captureEvents(Event.MOUSEUP);
        document.onmouseup = display;
         
        // -->
        </SCRIPT>


      Но учти, это работает не под всеми браузерами! Напрмер, любимая Опера не поддерживает. =(
        А теперь я должен во всём тексте найти str и в её начале вставить <b>, а вконце </b>?
          Цитата
          Demon_id, 22.08.04, 10:21

          Это лучше будет сделать на стороне сервера.
          На PHP, например, проблема решается использованием функции strtr().
          У тебя на сайте предусматривается использование каких-либо серверных языков?

          Если же использование JS обязательно, то используем функцию, которую приводил
          Rom@nych
          ExpandedWrap disabled
             
            function strtr(str, what, _with) {
               var temp = '';
               if (typeof(_with) != 'undefined')
               {
                  var t = what;
                  var what = new Array();
                  what[t] = _with;
               }//if
              
               for (var _what in what)
               {
                  temp = '';
                  for (var i = 0; i < str.length; i++)
                  {
                     var sub = str.substr(i, _what.length);
                     if (typeof(what[sub]) != 'undefined')
                     {
                        temp += what[sub];
                        i += _what.length - 1;
                     }//if
                     else {
                        temp += str.charAt(i);
                     }//else
                  }//for
                  str = temp;
               }//for
              
               return temp;
            }//function
             
            var smiles = new Array();
            smiles[':)'] = '<img src="1.gif" />';
            smiles[';)'] = '<img src="2.gif" />';
            smiles[':\'('] = '<img src="3.gif" />';
             
            var message = 'Hello:) How are you;)';
            message = strtr(message, smiles);
            !
            Для личный переписки существует приват

            на премодерацию тебя
            Сообщение отредактировано: SergeS -
              Вот написал что-то вроде...

              ExpandedWrap disabled
                <script LANGUAGE="JavaScript">
                 
                function strtr(str, what, _with) {
                   var temp = '';
                   if (typeof(_with) != 'undefined')
                   {
                      var t = what;
                      var what = new Array();
                      what[t] = _with;
                   }//if
                  
                   for (var _what in what)
                   {
                      temp = '';
                      for (var i = 0; i < str.length; i++)
                      {
                         var sub = str.substr(i, _what.length);
                         if (typeof(what[sub]) != 'undefined')
                         {
                            temp += what[sub];
                            i += _what.length - 1;
                         }//if
                         else {
                            temp += str.charAt(i);
                         }//else
                      }//for
                      str = temp;
                   }//for
                  
                   return temp;
                }//function
                </script>
                 
                <script>
                function display()
                {
                  if (document.getSelection)
                  {
                    var str = document.getSelection();
                  }
                  else if (document.selection && document.selection.createRange)
                  {
                    var range = document.selection.createRange();
                    var str = range.text;
                  }
                  str2="<b>"+str+"</b>";
                  message1 = document.myForm.myArea.value;
                  message = strtr(message1, str,str2);
                  document.myForm.myArea.value=message;
                }
                 
                </script>
                <html>
                <FORM NAME="myForm">
                <TEXTAREA NAME="myArea" COLS="40" ROWS="4"></TEXTAREA>
                </FORM>
                </html>
                 
                <a href='javascript:display()'>заменить</a>
                Цитата Argentum @ 22.08.04, 09:16
                Но учти, это работает не под всеми браузерами! Например, любимая Опера не поддерживает. =(

                Любимая Опера (7.60 preview 1) научилась, наконец работать с range'ами. Естественно, в формате DOM.

                Пустой range создаётся просто - document.createRange(), но понятно, что он никому нафиг не сдался. Проблема в том, что я никак не могу найти способ получить этот range по текущему выделению. В Мозилле всё просто - window.getSelection() выдаёт этот самый DOM Range, но в Опере такого метода нет. Есть только метод document.getSelection() - но он всегда возвращает пустую строку.

                Никто не знает способа получить выделение в Опере 7.60 форме DOM Range?
                  Цитата
                  Но учти, это работает не под всеми браузерами! Напрмер, любимая Опера не поддерживает. =(
                  :wacko: У меня твой пример работает во всех семёрках!

                  Добавлено
                  Цитата UNV, 18.10.04, 06:01
                  юбимая Опера (7.60 preview 1) научилась, наконец работать с range'ами

                  Разве? Кто тебе сказал?
                  Тут ничего не говорится о range.
                    Цитата Mixxx @ 18.10.04, 10:00
                    Разве? Кто тебе сказал?
                    Тут ничего не говорится о range.

                    Ну, на сайте Оперы сказано, что у неё улучшена поддержка всяких стандартов. Конечно, конкретно про range'и не упоминается. Однако не подумай, что я её не скачал и не попробовал. document.createRange() работает. С помощью этого range действительно можно ходить по dom-дереву, можно зайти в TextArea и произвести различные операции с текстом (текст - это её дочерний элемент). Но получить выделенный фрагмент в виде range я не смог - не нашёл соответствующего метода.
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0395 ]   [ 15 queries used ]   [ Generated: 27.04.24, 18:55 GMT ]