Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка в Опере 9.64, Скрипт работает в 10.62, но в 9.64 нет 
:(
    Опции темы
ApD00
Дата 8.10.2010, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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'

В чём может быть проблема?
PM MAIL   Вверх
magelan
Дата 8.10.2010, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 3
Всего: 16



наверное надо либо так писать:
Код

var body = document.documentElement.getElementsByTagName('body')[0].innerHTML

либо по человечьи:
Код

var body = document.body.innerHTML


у меня 9й оперы нет, увы проверить не могу.
PM MAIL   Вверх
SelenIT
Дата 8.10.2010, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 7
Всего: 401



Зачем такие двойные извраты? Не проще ли вместо поэтапного дробления body.innerHTML (которое, строго говоря, не обязано совпадать с исходной разметкой - регистр тегов, порядок атрибутов и много чего еще браузер вправе менять по-своему), сразу взять document.getElementsByTagName('p')[0]?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
ApD00
Дата 10.10.2010, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.10.2010

Репутация: нет
Всего: нет



Цитата(SelenIT @ 8.10.2010,  18:34)
Не проще ли вместо поэтапного дробления body.innerHTML (которое, строго говоря, не обязано совпадать с исходной разметкой - регистр тегов, порядок атрибутов и много чего еще браузер вправе менять по-своему), сразу взять document.getElementsByTagName('p')[0]?

Про теги я уже догадался, строго говоря - 10ая опера возвращает тег <br/> без закрывающего слеша. Возможно другие версии по другому работают.

Как я понял, ошибка у меня в том, что я получаю объект, а не строку, поэтому сравнение со строкой вызывает ошибку. Не понятно почему, но 10ая опера умеет так сравнивать, а предыдущие версии выдают законную ошибку.


Цитата(magelan @ 8.10.2010, 15:14)

наверное надо либо так писать:
var body = document.documentElement.getElementsByTagName('body')[0].innerHTML

либо по человечьи:
var body = document.body.innerHTML

Как я понимаю, функции возвращают объект, а мне надо получить строку с html кодом открываемой страницы. А ее уже потом можно разбить на строки.

Может я не правильно алгоритм выбрал. Давайте подробнее опишу. Есть сайт, на определенных страницах могут быть записи о времени окончания чего-либо. Мне нужно найти строку "Ручная заточка оружия: 54 мин". И запомнить время в этой строке. Чтобы потом выводить эту информацию уже скриптом на других страницах.

Я вижу решение как получить текст страницы и там уже искать нужную строку и вырезать время. Может как то по другому можно, я не знаю. С JavaScript раньше практически не сталкивался и работа с объектами немного озадачивает.

Это сообщение отредактировал(а) ApD00 - 10.10.2010, 08:48
PM MAIL   Вверх
magelan
Дата 10.10.2010, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 3
Всего: 16



Ну вообще на вашу задачу просятся регулярные выражения, я в них не силен, но народ тут есть, что ими живет.
PM MAIL   Вверх
SelenIT
Дата 11.10.2010, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 7
Всего: 401



Цитата(ApD00 @  10.10.2010,  08:47 Найти цитируемый пост)
функции возвращают объект, а мне надо получить строку с html кодом открываемой страницы

Нет, innerHTML возвращает именно строку. Но не с исходным кодом страницы, а с результатом обратной сериализации отпарсенной DOM. Поэтому полагаться на полное соответствие ее исходнику нельзя.

Если важен именно определенный текст, то его и надо искать, а не привязываться к нюансам разметки. Если эти минуты ни во что специальное не обернуты, то проще всего, имхо, split-нуть строку по всей этой фразе — второй элемент полученного массива будет начинаться как раз с искомого числа...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
ApD00
Дата 11.10.2010, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.10.2010

Репутация: нет
Всего: нет



Цитата
Цитата(ApD00 @  10.10.2010,  08:47 Найти цитируемый пост)
функции возвращают объект, а мне надо получить строку с html кодом открываемой страницы

Нет, innerHTML возвращает именно строку. Но не с исходным кодом страницы, а с результатом обратной сериализации отпарсенной DOM. Поэтому полагаться на полное соответствие ее исходнику нельзя.

Вот в этом и была и проблема.
В коде страницы используется <br/>,
Опера v.10 возвращает <br>,
а Опера v.9 возвращает <BR/>.

Я уже собирался писать своеобразный определитель версии, по тому как идёт возвращение кода.

Цитата

Если важен именно определенный текст, то его и надо искать, а не привязываться к нюансам разметки. Если эти минуты ни во что специальное не обернуты, то проще всего, имхо, split-нуть строку по всей этой фразе — второй элемент полученного массива будет начинаться как раз с искомого числа...


Вот! Огромное спасибо за ваше "имхо". Полностью избавился от циклов перебора и сравнения, а так же теперь код не зависит от того, как браузер возвращает код страницы. Премного благодарен за идею.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0619 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.