Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Парсинг данных (https://javascript.ru/forum/events/4976-parsing-dannykh.html)

alk0v 03.09.2009 23:15

Парсинг данных
 
Приветствую, уважаемые. Помогите разрешить следующую проблему:

Есть необходимость парсить данные, находящиеся в конце документа и обрабатывать их в дальнейшем, написал такой скрипт:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html><head>
<body onLoad="init()">
<script language='javascript'>
var settings = null;
var setid = null;
function init()
{
var elements = document.body.getElementsByTagName("settings");
settings = elements;
}
</script>

<input onclick="window.alert(settings[0].Out22);" value="press" type="button">

</body></html>
<settings
 Out11 = "1"
 Out22 = "0"
 Out33 = "0"
 Out44 = "1"
/>
/>


скрипт нормально работает в IE и возвращает 0, но не работает в firefox, пишет undefined,
для того, чтобы он заработал, нужно было поменять строку
<input onclick="window.alert(settings[0].Out22);" value="press" type="button">

на
<input onclick="window.alert(settings[0].attribute[1].value);" value="press" type="button">

но тогда он не работает в IE, подскажите пожалуйста, где косяк?

Kolyaj 03.09.2009 23:47

А зачем передавать параметры в DOM, если можно прямо в JS и написать?

alk0v 04.09.2009 00:22

Задумка в том, чтобы сервер (железка на микроконтроллере) менял текстовый файл с настройками, а страничка его уже забирала и с согласно настройкам меняла состояние элементов формы, либо, если не получится с отдельным файлом, просто дописывала в конец страницы а не растыкивала элементы по всему html

p.s.: в IE8 заработали оба варианта

Kolyaj 04.09.2009 00:26

С железкой все понятно. Зачем данные формировать в виде тега, если можно в виде JS-объекта?

alk0v 04.09.2009 00:31

Может я Вас не так понял, подскажите тогда решение... Суть в следующем, есть коробочка с 4-мя релейными выходами, которая управляется через веб-интерфейс, просто 4 чекбокса стоят, которыми можно включать и выключать реле, но если реле уже включено, на форме нужно, чтобы галочка в соответствующем чекбоксе тоже стояла. Из всех известных мне вариантов передачи информации с сервера на страницу без глобального изменения самого шаблона страницы на сервере, в голову пришел только такой вариант. Скрипт парсит кусок с настройками и соответсвующим образом расставляет галочки... Буду благодарен за любой дельный совет по данному вопросу

alk0v 04.09.2009 00:38

Вы предлагаете использовать файл со скриптом, в котором просто определить переменные, соответствующие настройкам?

alk0v 04.09.2009 00:52

Большое спасибо за совет, действительно все оказалось элементарно просто... Идея с парсингом была взята из случая, когда есть массив таких элементов, а у меня один всего, определил переменные во внешнем скрипте и все заработало

Kolyaj 04.09.2009 09:41

Я имел в виду, написать вместо
Цитата:

Сообщение от alk0v
<settings Out11 = "1" Out22 = "0" Out33 = "0" Out44 = "1" />

<script type="text/javascript">var settings = {out11: 1, out22: 0};</script>

alk0v 11.09.2009 02:24

возникла еще одна проблема, теперь связанная с обновлением данных. По Вашему совету сделал следующее:
в заголовке html добавил строку
<script type="text/javascript" src="files/settings.txt"></script>

в файле settings.txt все мои переменные объявлены как глобальные и я с ними нормально работаю, вот его содержимое:
var outs = [1,0,1,0];
var uptime = 199141000;
var sens = [0,'01:10:34 10.12.2009','05:10:34 10.12.2009',0];


т.е. и sens и outs у меня массивы с четырьмя элементами в каждом.

Но появилась необходимость опрашивать значение переменной sens раз в секунду (устройство при изменении состояния просто перезаписывает этот файл настроек, т.е. он может обновляться в процессе работы)

Решения, как переинициализировать глобальные переменные раз в секунду без полной перезагрузки страницы я не нашел, поэтому сделал отдельный файл sens.txt в котором содержится следующая запись:
[0,'01:10:34 10.12.2009','05:10:34 10.12.2009',0]
; и устройство, соответственно, перезаписывает только этот файл sens.txt

данный файл я запрашиваю 1 раз в секунду с помощью процедуры XMLHttpRequest, а затем делаю присвоение
sens = responseText, но строка возвращается в виде одной стринговой переменной "[0,'01:10:34 10.12.2009','05:10:34 10.12.2009',0]"
Можно ли ее как-то обратно преобразовать в массив с четырьмя элементами, или может есть альтернативное решение?

alk0v 11.09.2009 03:14

нашел решение, периодически вызываю следующий скрипт:

var scr = document.createElement('script');
scr.setAttribute('src','files/settings.txt');
document.body.appendChild(scr);


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


Часовой пояс GMT +3, время: 20:37.