Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Найти текст внутри div-a


Автор: Sunvas 16.5.2007, 23:07
Есть <div class="divclass" id='dicid'>{какой-то текст}</div>. Нужно написать функцию которая определяла бы есть ли заданый текст внутри div-a или нет. Если есть - вернуть его позицию, если нет - вернуть 0. Желательно кроссбраузерность.  smile 
Код

function istextindiv(divid,text){
//Дальше не знаю что писать
}


Автор: Burrr 16.5.2007, 23:41
Код
<script type="text/javascript">
function istextindiv(divId, text) {
    var div = document.getElementById(divId);
    var divText = div.innerText ? div.innerText : div.textContent;
    if (typeof divText == 'undefined') divText = "";
    return divText.indexOf(text) == -1 ? 0 : divText.indexOf(text);
}
</script>
<div id='dicid_1'>{какой-то текст}</div>
<div id='dicid_2'>цуцуцу</div>
<div id='dicid_3'></div>
<script type="text/javascript">
// Проверка
alert(
    istextindiv("dicid_1", "текст") + "\n" +
    istextindiv("dicid_2", "текст") + "\n" +
    istextindiv("dicid_3", "текст")
);
</script>


Проверил в ИЕ6, ФФ1.5 и Опера 9.01

Автор: Stampede 17.5.2007, 00:03
Burrr, ты зря воспринял "спецификацию заказчика" слишком близко к сердцу. Он просто не подумал, что позиция найденного текста может быть нулевой. Как он в таком случае будет определять, вернули ли ему ноль потому что строка не найдена, или потому что она стоит в самом начале?

В итоге ты написал функцию, с которой неизвестно как работать, да еще к тому же дважды вычисляешь indexOf() в случае нахождения строки.

Мораль: никогда не принимайте требования заказчика за чистую монету. Чаще всего они сами не представляют, чего хотят. Добивайтесь от них, чтоб было как в анекдоте: "ты не умничай, ты пальцем покажи" smile

Автор: Burrr 17.5.2007, 00:18
На основании этого кода всё доработать можно легко, основное и так понятно.
Stampede, почему неизвестно как? Что хотели, то и получили. Если хотим, можем получать просто return divText.indexOf(text);
А от 2-х вызовов indexOf еще никто не умирал ;)
Но за совет спасибо, то что я пропустил возврат нулевой позиции однозначно косяк.

Автор: Stampede 17.5.2007, 00:40
Мой пойнт был: из функции возвращать непосредственно результат divText.indexOf(text), а 
Sunvas'у объяснить в популярной форме, что это для его же блага smile

Цитата(Burrr @  16.5.2007,  15:18 Найти цитируемый пост)
А от 2-х вызовов indexOf еще никто не умирал ;)


А вот это уже отнюдь не безобидное заявление. Тут уже пахнет мировоззренческими разногласиями. И я прямо скажу: с таким подходом недолго и прокидаться. Безо всяких смайлов. Так что предлагаю задуматься.

Автор: Sunvas 17.5.2007, 07:25
Цитата(Stampede @  17.5.2007,  00:03 Найти цитируемый пост)
Он просто не подумал, что позиция найденного текста может быть нулевой

Stampede, нулевой это как? Или в JavaScript-e все считается с 0? Просто привык все считать с 1.

Burrr, +1.

Автор: Burrr 17.5.2007, 09:53
Sunvas, да, в JavaScript первое вхождение стоящее в начале строки имеет нулевую позицию, поэтому лучше юзай такой вариант:
Код
<script type="text/javascript">
function istextindiv(divId, text) {
    var div = document.getElementById(divId);
    var divText = div.innerText ? div.innerText : div.textContent;
    if (typeof divText == 'undefined') divText = "";
    return divText.indexOf(text);
}
</script>
<div id='dicid_1'>{какой-то текст}</div>
<div id='dicid_2'>цуцуцу</div>
<div id='dicid_3'></div>
<script type="text/javascript">
// Проверка
alert(
    istextindiv("dicid_1", "текст") + "\n" +
    istextindiv("dicid_2", "текст") + "\n" +
    istextindiv("dicid_3", "текст")
);
</script>

Если нода пустая или  совпадений нет, то вернется -1. Если совпадение есть, то вернется его позиция.


Stampede, к таким вещам надо относится проще и дело не в мировозрении. При написании той строки я выбирал между двумя вариантами:
Код
return divText.indexOf(text) == -1 ? 0 : divText.indexOf(text);
// или
var position = divText.indexOf(text);
return position == -1 ? 0 : position;

И выбрал первый, чтобы не плодить лишнюю строчку кода, т.к. на скорость работы скрипта вычисление 2-х indexOf особо не влияет. Вообщем-то совсем не влияет. Если бы вместо indexOf стоял стояла функция или более медленные вычесления, был бы выбран второй вариант написания.
Всё.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)