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

HTML+CSS+JavaScript

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

 

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

вид форума:
Линейный форум Структурный форум

тема: Скрипт поиска текста в <TEXTAREA>
 
 автор: DDK   (04.02.2006 в 11:41)   письмо автору
 
 

Не подскажете ли скрипт поиска заданного текста по <textarea> ? В данный момент пользуюсь криво выдранным из vBuleetin-админки "поисковиком", но выдран он очень криво, поэтому работает он только в IE, и то с грехом на пополам. Вот скрипт, который имею на руках:

<script language="JavaScript">
function findInPage(str)
{
var userAgent = navigator.userAgent.toLowerCase();
var is_opera  = (userAgent.indexOf('opera') != -1);
var is_saf    = ((userAgent.indexOf('applewebkit') != -1) || (navigator.vendor == "Apple Computer, Inc."));
var is_webtv  = (userAgent.indexOf('webtv') != -1);
var is_ie     = ((userAgent.indexOf('msie') != -1) && (!is_opera) && (!is_saf) && (!is_webtv));
var is_ie4    = ((is_ie) && (userAgent.indexOf("msie 4.") != -1));
var is_moz    = ((navigator.product == 'Gecko') && (!is_saf));
var is_kon    = (userAgent.indexOf('konqueror') != -1);
var is_ns     = ((userAgent.indexOf('compatible') == -1) && (userAgent.indexOf('mozilla') != -1) && (!is_opera) && (!is_webtv) && (!is_saf));
var is_ns4    = ((is_ns) && (parseInt(navigator.appVersion) == 4));
var win = window;
var n = 0;

var txt, i, found;
    if (str == '')
    {
        return false;
    }
    if (is_ns || is_moz)
    {
        if (!win.find(str, false, true))
        {
            while(win.find(str, false, true))
            {
                n++;
            }
        }
        else
        {
            n++;
        }
        if (n == 0)
        {
            alert('Ничего не найдено !');
        }
    }
    if (is_ie)
    {
        txt = win.fetch_object('ta_template').createTextRange();
        for (i = 0; i <= n && (found = txt.findText(str)) != false; i++)
        {
            txt.moveStart('character', 1);
            txt.moveEnd('textedit');
        }
        if (found)
        {
            txt.moveStart('character', -1);
            txt.findText(str);
            txt.select();
            txt.scrollIntoView(true);
            n++;
        }
        else
        {
            if (n > 0)
            {
                n = 0;
                findInPage(str);
            }
            else { alert('Ничего не найдено !'); }
        }
    }
    return false;
}
</script>

   
 
 автор: DDK   (08.02.2006 в 15:07)   письмо автору
 
   для: DDK   (04.02.2006 в 11:41)
 

Э... хотелось бы поднять тему... Вопрос для меня актуален до сих пор.

   
 
 автор: 12345   (08.02.2006 в 15:35)   письмо автору
 
   для: DDK   (08.02.2006 в 15:07)
 

Да просто замени на поиск по .value, и будет работать везде. В простом случае .value.indexOf('cтрока'), а чтобы выделить, придётся использовать Range, textRange, select() (не будет в Опере до 8-й версии)

   
 
 автор: DDK   (08.02.2006 в 16:57)   письмо автору
 
   для: 12345   (08.02.2006 в 15:35)
 

Ээ... а поподробней можно ? :)

   
 
 автор: 12345   (08.02.2006 в 18:18)   письмо автору
 
   для: DDK   (08.02.2006 в 16:57)
 

Тема поиска - разноплановая, каждый раз хочется алгоритм улучшить, пока он не превратится в довольно увесистый. Давайте коллективно: пишу основу для ie:
Поиск в textarea<br><br>
<script>d=document;
function findInTextarea(t,tc){
    tc.style.backgroundColor='';
    var r=t.createTextRange();
    if(r.findText(tc.value)){r.scrollIntoView(!0);r.select();}
    else tc.style.backgroundColor='#eebbbb';
}
</script>
<textarea id=ta1 rows=8 cols=70>12345








67890
</textarea><br>
<input type=button value=Find:
    onclick=findInTextarea(d.getElementById('ta1'),d.getElementById('in1'))>
    <input id=in1 value=67>
Он находит первое обнаружение строки и повторяет исходный (только вместо алерта - подсветка фона поля ввода при неудаче).

   
 
 автор: 12345   (08.02.2006 в 19:20)   письмо автору
 
   для: 12345   (08.02.2006 в 18:18)
 

Ээ... Э-э-эе!
Ну где прогресс? :)
Для мозиллы/FF такой аппендикс. Подобным образом и Оперу можно обделать (и ie), но есть в FF такой недостаток - нет прокрутки к видимой области. Делать грубой силой - считать строки - не хочется. Но если есть практическая задача, то вы догадались о пути её решения.

Тут решали подобное: http://blog.existence.ru/exception@2005.06/exception@2005.06.11:5$4

Поиск в textarea<br><br>
<script>d=document;
function findInTextarea(t,tc){
    tc.style.backgroundColor='';
    if(d.all){var r=t.createTextRange();
        if(r.findText(tc.value)){r.scrollIntoView(1);r.select();}
        else tc.style.backgroundColor='#eebbbb';
    }else{
        var c=tc.value;
        var i=t.value.indexOf(c);
        if(i>=0)t.setSelectionRange(i, i+c.length)
        else tc.style.backgroundColor='#eebbbb';
    }
}
</script>
<textarea id=ta1 rows=8 cols=70>12345








67890




</textarea><br>
<input type=button value=Find:
    onclick=findInTextarea(d.getElementById('ta1'),d.getElementById('in1'))>
    <input id=in1 value=67>

   
Rambler's Top100
вверх

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