![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| ApD00 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 8.10.2010 Репутация: нет Всего: нет |
Скрипт пользовательский, специально заточен под один сайт. Анализирует страницу в поисках нужного текста. В новой опере работает без ошибок, а в 9.64 стопорится на вот этом куске:
var body = document.getElementsByTagName('body')[0].innerHTML body_1 = body.split('<p>'); body_11 = body_1; body_1 = body_11[1].split('<br>'); for (var i = 7; i < 40; i++) { if (body_1[i].substr(0,23)=="Ручная заточка оружия: ") { break; } // Поиск строки } Вот какую ошибку пишет Опера 9.64: User Javascript thread Error: name: TypeError message: Statement on line 57: Cannot convert undefined or null to Object Backtrace: Line 57 of User JS script body_1 = body_1[1].split('<br>'); stacktrace: n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace' В чём может быть проблема? |
|||
|
||||
| magelan |
|
||||
![]() потерял xPath ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 5.4.2010 Репутация: 3 Всего: 16 |
наверное надо либо так писать:
либо по человечьи:
у меня 9й оперы нет, увы проверить не могу. |
||||
|
|||||
| SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 7 Всего: 401 |
Зачем такие двойные извраты? Не проще ли вместо поэтапного дробления body.innerHTML (которое, строго говоря, не обязано совпадать с исходной разметкой - регистр тегов, порядок атрибутов и много чего еще браузер вправе менять по-своему), сразу взять document.getElementsByTagName('p')[0]?
-------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
| ApD00 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 8.10.2010 Репутация: нет Всего: нет |
Про теги я уже догадался, строго говоря - 10ая опера возвращает тег <br/> без закрывающего слеша. Возможно другие версии по другому работают. Как я понял, ошибка у меня в том, что я получаю объект, а не строку, поэтому сравнение со строкой вызывает ошибку. Не понятно почему, но 10ая опера умеет так сравнивать, а предыдущие версии выдают законную ошибку.
Как я понимаю, функции возвращают объект, а мне надо получить строку с html кодом открываемой страницы. А ее уже потом можно разбить на строки. Может я не правильно алгоритм выбрал. Давайте подробнее опишу. Есть сайт, на определенных страницах могут быть записи о времени окончания чего-либо. Мне нужно найти строку "Ручная заточка оружия: 54 мин". И запомнить время в этой строке. Чтобы потом выводить эту информацию уже скриптом на других страницах. Я вижу решение как получить текст страницы и там уже искать нужную строку и вырезать время. Может как то по другому можно, я не знаю. С JavaScript раньше практически не сталкивался и работа с объектами немного озадачивает. Это сообщение отредактировал(а) ApD00 - 10.10.2010, 08:48 |
||||
|
|||||
| magelan |
|
|||
![]() потерял xPath ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 5.4.2010 Репутация: 3 Всего: 16 |
Ну вообще на вашу задачу просятся регулярные выражения, я в них не силен, но народ тут есть, что ими живет.
|
|||
|
||||
| SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 7 Всего: 401 |
Нет, innerHTML возвращает именно строку. Но не с исходным кодом страницы, а с результатом обратной сериализации отпарсенной DOM. Поэтому полагаться на полное соответствие ее исходнику нельзя. Если важен именно определенный текст, то его и надо искать, а не привязываться к нюансам разметки. Если эти минуты ни во что специальное не обернуты, то проще всего, имхо, split-нуть строку по всей этой фразе — второй элемент полученного массива будет начинаться как раз с искомого числа... -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
| ApD00 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 8.10.2010 Репутация: нет Всего: нет |
Вот в этом и была и проблема. В коде страницы используется <br/>, Опера v.10 возвращает <br>, а Опера v.9 возвращает <BR/>. Я уже собирался писать своеобразный определитель версии, по тому как идёт возвращение кода.
Вот! Огромное спасибо за ваше "имхо". Полностью избавился от циклов перебора и сравнения, а так же теперь код не зависит от того, как браузер возвращает код страницы. Премного благодарен за идею. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |