Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Как загрузить html в переменую и распарсить по дивам? (https://javascript.ru/forum/jquery/37122-kak-zagruzit-html-v-peremenuyu-i-rasparsit-po-divam.html)

Kvark 08.04.2013 15:30

Как загрузить html в переменую и распарсить по дивам?
 
Всем привет, надеюсь на помощь гуру - не получаеться разобраться самому :(

есть файлик по структуре такой:
<div id="msg_1">
   <div class="time1">
      12:00
   </div>
   <div class="time2">
      13:00
   </div>
   <div class="msg">
       Обедать
   </div>
</div>
...
<div id="msg_N">
   ...
</div>


хочу в переменые собрать значения из этих тэгов. (могут присутсвовать стили и другие тэги)

вот мой код:
function showMsg()
{ 		
	$.get('msg.txt', function(data) 
		{
			var fileMsg1 = "";
			var fileMsg2 = "";
			fileMsg1 = $(data).filter('#msg_1').html();
			fileMsg2 = $(fileMsg1).filter('.msg').html();
			
		}	
};

В fileMsg1 получаю содержимое дива msg_1 как и ожидаю, а вот в fileMsg2 - пусто - что я не так делаю?
Еще заковырка - зарание не извесно сколько собщений, как можно сосчитать количество div id в переменной?

Kvark 08.04.2013 20:34

упд. додумался вот так сделать:
$.get('msg.txt', function(data) 
	{
		var fileMsg = $(data).filter('#msg_1').find('.msg').html();
		var msgshowtime = $(data).filter('#msg_1').find('.time1').html();
		var msghidetime = $(data).filter('#msg_1').find('.time2').html();
	}

вроде хорошо получилось, а вот как можно сосчитать количество дивов определенного формата ид
<div id="msg_1"></div>
<div id="msg_2"></div>
<div id="msg_3"></div>
<div id="msg_4"></div>

сосчитать = 4?

ненайду никак, :( может кто что посоветует?

tsigel 09.04.2013 09:23

$('div').length

Kvark 09.04.2013 12:01

или я не понял или плохо объяснил, я загружаю даные в переменную, мне нужно их обработать, обработчик уже работает, но его нужно преминить к каждому див в переменной с определным ид, сколько их будет в файле зарание не известно, вопрос как именно сосчитать не все дивы а именно секционые тоесть те у которых ид = msg_1, msg_2, msg_..., msg_N

tsigel 09.04.2013 12:05

var num = 0;
$('div').each(function () {
  var id = $(this).attr('id');
  if (id.test(/msg_/)) num++;
});


В синтаксисе test не уверен (не помню точно), но суть ясна.

Kvark 09.04.2013 12:29

ок, спасибо, идею понял, вот только как такое применить к переменной в которой хтмл код?

tsigel 09.04.2013 12:33

Если этот код лежит в переменной и это строка то это ещё проще:
var str = /*Ваша строка*/;
var array = str.split('msg_');//Превращаем строку в массив, разбивая члены массивов вашим идентификатором
var num = array.length; //длинна этого массива и будет количеством дивов

Kvark 09.04.2013 12:41

отлично! Работает, хоть и возращает на единицу больше, но это поправимо, спасибо

Kvark 09.04.2013 13:13

Еще вопрос по тому же самому, а как можно разбить сообщение в массив без обрамляющего тега <div id="msg_1">? то есть чтобы элементы массива были содержание этого дива, но не он сам?

tsigel 09.04.2013 13:23

Тут 2 основных пути:
1) Регулярные выражения и возможно пользование split
2) Использование методов replace и split;

В регулярных выражениях я не силен, можете спросить об этом в разделе "Общие вопросы javascript", там часто спрашивают про выражения.

Если изберете второй путь, то почитайте про эти методы, это не сложно разобрать. Что не получится - помогу.

Kvark 09.04.2013 13:35

выкинул этот див вобще и заменил на ":::" сплит по нему разделил что мне нужно, не совсем то что спрашивал, но цели достиг :)

Kvark 09.04.2013 13:48

теперь конструкция поиска контента див не работает :( как то может не так запрашиваю?
У меня элемент состоит теперь из трех дивов (контент с тегами):
<div class="time1">
   12:00
</div>
<div class="time2">
   13:00
</div>
<div class="msg">
   Обедать
</div>

- как можно вычленить содержимое дивов?
...
alert(MyArray[i].find('.msg').html());

несрабатывает почемуто...

tsigel 09.04.2013 13:53

MyArray - это что?

Kvark 09.04.2013 13:59

это мой массив:
var MyArray = data.split(':::');

где data это переменная куда загрузил содержимое файла
элемент массива это 3 дива, пытаюсь достучаться до их содержания через такую конструкцию:
$.each(MyArray, function (i, element) 
	{
		//alert(MyArray[i].filter().find('.msgbody').html());
		alert(element.find('.msg').html());
	});

tsigel 09.04.2013 14:44

Не называйте массив с большой буквы. С большой буквы принято называть классы.
Пользуйтесь console.log для вывода отладочной информации. Попробуйте написать свою функцию в консоле. Поработайте со своей функцией. Почитайте об операциях со строками. Если элемент массива MyArray - это строка с 3-мя дивами, то методы filter, find и т. д. здесь не будут работать, так как они работают с элементами html

tsigel 09.04.2013 14:49

Для примера несколько методов для работы со строками:
search, test, replace, split;
Каждая строка в свою очередь - это массив символов, изучите методы работы с массивами.
Т.е. к каждой строке мы можем обратиться методом length и получить количество символов в ней, можем обратиться к любому символу строки
str[num];//где num - номер символа

Все это базовые навыки работы с javascript (да и с любым другим языком программирования). Изучайте массивы и строки.

tsigel 09.04.2013 14:52

Собственно тут есть важный вопрос. Для чего вам нужна эта строка? вы добавляете её на сайт из файла или с сайта забираете информацию?

Kvark 09.04.2013 14:55

ok, попробую - пока без понятия как этой консолью пользоваться :(
а насчет методов - они прекрасно работают если строка содержит html:
<div id="msg_1">
<div class="time1">
   12:00
</div>
<div class="time2">
   13:00
</div>
<div class="msg">
   Обедать
</div>
</div>

и тогда такой код прекрасно работает, а если убрать обрамляющий див - неработает :( значит ошибка где то в синтаксе я полагаю...
$.each(myArray, function (i, element) 
	{
		var fileMsg = $(element).filter('#msg_1').find('.msg').html();
		alert(fileMsg);
	});

Kvark 09.04.2013 14:59

Цитата:

Сообщение от tsigel (Сообщение 245040)
Все это базовые навыки работы с javascript (да и с любым другим языком программирования). Изучайте массивы и строки.

Да, спасибо. Но я свободно програмирую на С++ и VB.Net и вот теперь изучаю джиквери. Тоесть я хочю сказать что методика и алгоритмика мне понятны, и проблем не возникает с логикой обработки, но вот приминение методов яваскрипта к елементам дом для меня пока еще что то непонятное. В чем и пытаюсь разобраться с вашей помощью.

Kvark 09.04.2013 15:06

Цитата:

Сообщение от tsigel (Сообщение 245041)
Собственно тут есть важный вопрос. Для чего вам нужна эта строка? вы добавляете её на сайт из файла или с сайта забираете информацию?

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

tsigel 09.04.2013 15:30

а почему не положить в массив изначально при создании переменной каждый див отдельным элементом массива?

Kvark 09.04.2013 15:36

как раз счас над этим работаю, разобрался с консолью - действительно удобно! :) но все равно интересно если есть дивы в переменой как с ними удобно работать то...

tsigel 09.04.2013 15:40

Создайте асоциативный массив и работайте с ним. Например:
var messegeData = {
   messeges: ['Завтракать', 'Обедать', 'Ужинать'],
   timesStart: ['12:00','16:00','20:00'],
   timesEnd: ['12:30','16:40','20:55']
}

tsigel 09.04.2013 15:42

Для такого объекта добавление сообщения на сайт будет выглядеть:
$('body').append('<div>' +messegeData.messeges[i] + '</div>');


В таком формате время через которое надо удалить сообщение можно задать сразу, при создании элемента, и вам не надо будет проверять пришло ли время его удалить.

Надо будет отслеживать только момент при котором необходимо создать этот элемент.

Kvark 09.04.2013 15:48

ну для ассоциативного массива нужно считаное распарсить, можно конечно, но как то не изящно :)
а насчет вставления я делаю так:
$('#msg').html("сообщение")
или это не правильно? див уже прописан с ид мсг

tsigel 09.04.2013 15:51

А чем не изящно распарсить на удобные объекты? Потом ими удобно пользоваться.

tsigel 09.04.2013 15:56

Более того, можно сделать события создания новых сообщений, и тогда вам не надо будет проверять каждые н секунд пора ли создавть сообщение. Можно разложить сообщения на объекты и каждое сообщение само будет знать когда ему пора создаваться и когда ему надо удалиться.

Kvark 09.04.2013 16:03

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

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

tsigel 09.04.2013 16:07

Ок, вы можете писать в html напрямую, так? Но тогда вы можете писать скрипт из своей программы! Вы же можете написать в html файл в body тег script и в него прописать объекты сообщений и времени. Например по модели описанной выше. И парсить тогда ничего не надо.

Kvark 09.04.2013 16:13

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

tsigel 09.04.2013 16:36

вообщем можно создать объект вида
var Messege = function (timeStart, timeEnd, messege) {
  this.timeStart = timeStart;
  this.timeEnd = timeEnd;
  this.messege = messege;
  this.createInit();//Запускаем инициализацию создания элемента 
}

Messege.prototype.createInit = function () {
  if (/*время создания уже наступило*/) {
    this.createAsTime();
  } else {
    this.createAsTime(this.currentTimeToCreate()); //рассчитываем время до создания (в мс) 
  }
}

Messege.prototype.createAsTime = function (time) {
  if (time != null) {
    setTimeout(this.addElement, time);
  } else {
  /*функция создания элемента*/
  }
}

Messege.prototype.addElement = function () {
  $(/*место*/).append('<div>' + this.messege + '</div>');
  this.$ = $(/*место*/).find('div').last();
  this.removeMessegeInit();
}

Messege.prototype.removeMessegeInit = function () {
  this.removeAsTime(this.currentTimeToRemove()); //рассчитываем время до удаления (в мс)
}

Messege.prototype.removeAsTime = function (time) {
  setTimeout(this.remove, time);
}

Для каждого сообщения создаем экземпляр класса Messege, и у каждого будут вышеперечисленные методы.
Создаем экземпляр:
var a = new Messege("10:00", "15:00", "Обед")

tsigel 09.04.2013 16:46

В безопасности вы ничего не теряете, ведь в странице будет только объект с данными и все (разница в том что его не надо парсить). К тому как будет создаваться этот объект пользователю доступа не будет.

С кодом приведённым выше, вам надо просто создать экземпляр для каждого сообщения с соответствующими параметрами, а сообщения будут сами создаваться и удаляться.

tsigel 09.04.2013 16:49

С английским у меня не очень)


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