За последние 24 часа нас посетили 19335 программистов и 1647 роботов. Сейчас ищут 1126 программистов ...

BB панелька

Тема в разделе "JavaScript и AJAX", создана пользователем Mr.M.I.T., 16 фев 2008.

  1. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    я вот тут накодил:
    bb - это ББ код типа b или u
    selection - выделенный текст
    [js]function setbb(bb)
    {
    var selection = '';
    if ( window.getSelection )
    {
    selection = window.getSelection();
    }
    else if ( document.selection )
    {
    selection = document.selection.createRange().text;
    }
    else if ( document.getSelection )
    {
    selection = document.getSelection();
    }
    document.getElementById('text_fild').focus();
    document.getElementById('text_fild').value=document.getElementById('text_fild').value.replace('/'+selection+'/','['+bb+']'+selection+'[/'+bb+']'); // вот тут что-то не работает
    document.getElementById('text_fild').blur();
    return;
    }[/js]
    Вобщем почему-то replace() не работает...незнаю почему мб потому что selection не регулярка а выделенный текст...
     
  2. Ивашка

    Ивашка Активный пользователь

    С нами с:
    29 авг 2007
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Щёкино/Тула
    1. Используйте объект RegExp.
    Код (Text):
    1. new RegExp(selection, '')
    2. Если хотите получить выделенный текст из textarea в FF или Opera, getSelection не поможет. Используйте свойства selectionStart и selectionEnd.
     
  3. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Я чесно говоря не очень силён в JS
    Мб поэтому у меня ничего не получается =(
    Но вот selection не пустая проверил через alert()
    Вобще наверно надо написать что мне конкретно нужно:
    Функция JS работающая также как str_replace() в пхп и с помощью неё нужно поставить выделенный текст selection в [bb]selection[/bb] где bb переменная с названием ББ кода
     
  4. Ивашка

    Ивашка Активный пользователь

    С нами с:
    29 авг 2007
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Щёкино/Тула
    Да, window.getSelection() вернет вам выделение, но не то, что нужно (в случае textarea).
    С replace вы сделали все правильно, но регулярное выражение у вас строится из переменной, поэтому литеральная запись здесь не подойдет.
    В общем, вот примерный кроссбраузерный вариант:
    [js]function setbb(bb) {
    var selection = '', ta = document.getElementById('text_fild');
    if(document.selection) {
    selection = document.selection.createRange().text;
    } else {
    selection = ta.value.substring(ta.selectionStart, ta.selectionEnd);
    }
    ta.focus();
    ta.value=ta.value.replace(new RegExp(selection, ''), '['+bb+']'+selection+'[/'+bb+']');
    ta.blur();
    }[/js]
     
  5. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ООО Спасибо ОГРОМНОЕ!!! =) Работает!!!
    опс =) ещё одна проблемка почему-то не заменяет текст вида [ b]123[/b],тоесть если я ещё раз хочу поместить текст с ББ тегами в другие,то ничего не происходит...совершенно хз почему так...
     
  6. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ужс...мне начинает казаться что replace() не заменяет строку а добавляет в общий текст заменённую...
    Кстати есть ещё проблемка если например у меня в тексте 2 одинакодвых слова то заменяется первое вхождение независимо от того выделенно оно или нет...
    ЗЫ. JS меня с ума сведёт...я с пхп столько не сидел =(
     
  7. Ивашка

    Ивашка Активный пользователь

    С нами с:
    29 авг 2007
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Щёкино/Тула
    Главное - не паниковать :)
    Обо всем по-порядку:
    • Свойство text объекта, который возвращает createRange() можно не только читать, но и записывать - следовательно, чтобы избежать замены "не того" куска текста отказываемся от регулярок и делаем так:
      [js]document.selection.createRange().text = '['+bb+']'+document.selection.createRange().text+'[/'+bb+']';[/js]
      Но это только для IE. Для остальных браузеров вспоминаем про selectionStart/selectionEnd. Код приводить не буду, но обрисую логику. Есть текст:
      Код (Text):
      1. [............]
      Выделение:
      Код (Text):
      1. [...selectionStart...selectionEnd...]
      В итоге нам нужно получить:
      Код (Text):
      1. [0...[bb]selectionStart...selectionEnd[/bb]...length-1]
      Дальше думайте сами ;)
     
  8. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Ещё раз вам спасибо! =) Заработало!
    Кстати у меня в Опере работает и document.selection.createRange().text
    ЗЫ. хм..вобще мне кажется что яваскрипт как ни странно сложнее пхп...я вот уже сколько времени с ним сижу а всё на стадии alert() 0_o мб конечно просто инфы по JS не так много как по пхп...
     
  9. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    ты еще Java не видел когда распечатывется стек вызовов...
    гыгыгы