Как загрузить 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 в переменной? |
упд. додумался вот так сделать:
$.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? ненайду никак, :( может кто что посоветует? |
$('div').length |
или я не понял или плохо объяснил, я загружаю даные в переменную, мне нужно их обработать, обработчик уже работает, но его нужно преминить к каждому див в переменной с определным ид, сколько их будет в файле зарание не известно, вопрос как именно сосчитать не все дивы а именно секционые тоесть те у которых ид = msg_1, msg_2, msg_..., msg_N
|
var num = 0; $('div').each(function () { var id = $(this).attr('id'); if (id.test(/msg_/)) num++; }); В синтаксисе test не уверен (не помню точно), но суть ясна. |
ок, спасибо, идею понял, вот только как такое применить к переменной в которой хтмл код?
|
Если этот код лежит в переменной и это строка то это ещё проще:
var str = /*Ваша строка*/; var array = str.split('msg_');//Превращаем строку в массив, разбивая члены массивов вашим идентификатором var num = array.length; //длинна этого массива и будет количеством дивов |
отлично! Работает, хоть и возращает на единицу больше, но это поправимо, спасибо
|
Еще вопрос по тому же самому, а как можно разбить сообщение в массив без обрамляющего тега <div id="msg_1">? то есть чтобы элементы массива были содержание этого дива, но не он сам?
|
Тут 2 основных пути:
1) Регулярные выражения и возможно пользование split 2) Использование методов replace и split; В регулярных выражениях я не силен, можете спросить об этом в разделе "Общие вопросы javascript", там часто спрашивают про выражения. Если изберете второй путь, то почитайте про эти методы, это не сложно разобрать. Что не получится - помогу. |
выкинул этот див вобще и заменил на ":::" сплит по нему разделил что мне нужно, не совсем то что спрашивал, но цели достиг :)
|
теперь конструкция поиска контента див не работает :( как то может не так запрашиваю?
У меня элемент состоит теперь из трех дивов (контент с тегами): <div class="time1"> 12:00 </div> <div class="time2"> 13:00 </div> <div class="msg"> Обедать </div> - как можно вычленить содержимое дивов? ... alert(MyArray[i].find('.msg').html()); несрабатывает почемуто... |
MyArray - это что?
|
это мой массив:
var MyArray = data.split(':::'); где data это переменная куда загрузил содержимое файла элемент массива это 3 дива, пытаюсь достучаться до их содержания через такую конструкцию: $.each(MyArray, function (i, element) { //alert(MyArray[i].filter().find('.msgbody').html()); alert(element.find('.msg').html()); }); |
Не называйте массив с большой буквы. С большой буквы принято называть классы.
Пользуйтесь console.log для вывода отладочной информации. Попробуйте написать свою функцию в консоле. Поработайте со своей функцией. Почитайте об операциях со строками. Если элемент массива MyArray - это строка с 3-мя дивами, то методы filter, find и т. д. здесь не будут работать, так как они работают с элементами html |
Для примера несколько методов для работы со строками:
search, test, replace, split; Каждая строка в свою очередь - это массив символов, изучите методы работы с массивами. Т.е. к каждой строке мы можем обратиться методом length и получить количество символов в ней, можем обратиться к любому символу строки str[num];//где num - номер символа Все это базовые навыки работы с javascript (да и с любым другим языком программирования). Изучайте массивы и строки. |
Собственно тут есть важный вопрос. Для чего вам нужна эта строка? вы добавляете её на сайт из файла или с сайта забираете информацию?
|
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); }); |
Цитата:
|
Цитата:
Вопрос в том, что мне нужно переодически просматривать файл и выводить или прятать собщения из него на этой странице - для красоты я прикрутил бегущию строку и все прекрасно работает, если собщение одно, но технически их может быть и 200, но указываеться время когда собщение должно показываться и до скольки. Вот я и пытаюсь прочесть файл с собщениями и их временами и обработать, чтоб вывести в свой див только актуальное собщение, а не весь файл. Все что мне нужно - это вычленить из дивов время чтобы знать выводить или прятать собщение и собственно само собщение, которое к тому же может содержать html код типа размера букв, шрифт, цвет и т.д. - все уже работает когда собщение одно, а вот с несколькими еще нет |
а почему не положить в массив изначально при создании переменной каждый див отдельным элементом массива?
|
как раз счас над этим работаю, разобрался с консолью - действительно удобно! :) но все равно интересно если есть дивы в переменой как с ними удобно работать то...
|
Создайте асоциативный массив и работайте с ним. Например:
var messegeData = { messeges: ['Завтракать', 'Обедать', 'Ужинать'], timesStart: ['12:00','16:00','20:00'], timesEnd: ['12:30','16:40','20:55'] } |
Для такого объекта добавление сообщения на сайт будет выглядеть:
$('body').append('<div>' +messegeData.messeges[i] + '</div>'); В таком формате время через которое надо удалить сообщение можно задать сразу, при создании элемента, и вам не надо будет проверять пришло ли время его удалить. Надо будет отслеживать только момент при котором необходимо создать этот элемент. |
ну для ассоциативного массива нужно считаное распарсить, можно конечно, но как то не изящно :)
а насчет вставления я делаю так: $('#msg').html("сообщение")или это не правильно? див уже прописан с ид мсг |
А чем не изящно распарсить на удобные объекты? Потом ими удобно пользоваться.
|
Более того, можно сделать события создания новых сообщений, и тогда вам не надо будет проверять каждые н секунд пора ли создавть сообщение. Можно разложить сообщения на объекты и каждое сообщение само будет знать когда ему пора создаваться и когда ему надо удалиться.
|
у меня есть возможность сразу в файл формировать собщения как только может быть нужно, вот и хочеться сразу ими пользоваться, не переиначивая.
насчет проверки и событий - можно поподробнея? на данный момент я дергаю файл каждые 10секунд и проверяю содержимое - бо сообщения могут поменяться, тогда нужно пепегрузить все, еслиб удалось прикрутить евент на файл с собщениями и как то заметить что он изменился - то не нужноб было его загружать в память каждые 10сек... |
Ок, вы можете писать в html напрямую, так? Но тогда вы можете писать скрипт из своей программы! Вы же можете написать в html файл в body тег script и в него прописать объекты сообщений и времени. Например по модели описанной выше. И парсить тогда ничего не надо.
|
впринципе да, но мне это не кажеться безопасным, все это дело будет крутиться на сервере, юзер будет иметь доступ к странице, а софт генерить собщения, в строго определенное место, контролировать софт будут другие люди, не точтобы они специально вредили, но технически они смогут изменить код и тогда все пепестанет работать...
|
вообщем можно создать объект вида
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", "Обед") |
В безопасности вы ничего не теряете, ведь в странице будет только объект с данными и все (разница в том что его не надо парсить). К тому как будет создаваться этот объект пользователю доступа не будет.
С кодом приведённым выше, вам надо просто создать экземпляр для каждого сообщения с соответствующими параметрами, а сообщения будут сами создаваться и удаляться. |
С английским у меня не очень)
|
Часовой пояс GMT +3, время: 07:34. |