Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471

Добавление и удаление элементов

28.07.2016, 10:26. Показов 1456. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Прошу помощи. Есть опция на ресурсе 10 последних комментариев. все происходит в блоке
HTML5
1
<div id="10Com"></div>
Выводится при загрузке страницы, а далее, при появлении новых они автоматически подгружаются вверх данного блока:
JavaScript
1
2
3
var elem = document.createElement('div');
            elem.innerHTML = this.req.responseText;
            this.target.insertBefore(elem, this.target.children[0]);
this.target - это див c id 10Com.

Комментарии добавляются ввиде блоков:

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
<div  style="min-height: 65px; display: inline-block;">
         <div style="display: inline-block;vertical-align: top;height:30px;width: auto;">
         <div style="text-align: center; width:auto;">
         <div id="ava" style="position:relative;display:inline-block;"><?=$ava?><?if($onlineIm){?><div class="ic-online" title="Пользователь онлайн"></div> <?}?></div>
        </div>
        </div>
 
     <div  class="s22" style="display: inline-block;padding-left: 5px;">Автор: <b><?=$Row['name']?></b><br /> Дата: <?=$Row['da']?> <?=$mounthName?> в <?=$Row['ho']?>:<?=$Row['mi']?></div>
    <div  class="s22" style="display: inline-block;padding-left: 60px;"> Новость: <a href="/news/<?=$Row['news_id']?>" targe="_blank" style="width:190px;word-wrap: break-word;"><?=$title?></a></div>
     <div style="padding-top:35px;border-bottom:1px solid #BDBDBD;width:240px;word-wrap: break-word;"><?$bb -> parse($Row['text']);
          $Row['text'] = $bb->get_html(); echo $Row['text'];?></div>
     <div style="width: 10px; display: inline-block;"></div>
       </div>
И теперь главный вопрос. Как правильно организовать добавление новых комментариев, чтобы самые последние из списка удалялись? Чтобы в списке всегда оставалось 10 комментариев?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.07.2016, 10:26
Ответы с готовыми решениями:

Добавление/удаление элементов
У меня есть список элементов (select, список способов доставки). Т.к. система позволяет добавить несколько способов (есть предложенные,...

Двумерный массив добавление и удаление элементов
Добрый день. Занялся изучением основ. Заступорился на двумерных массивах. Подскажите, пожалуйста, каким образом осуществляется...

Добавление и удаление элементов в документ
Добрый день ув. пользователи! Как можно по клику на кнопку добавить на стр. два зависимых текстовых поля с возможной оба удалить и...

17
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
28.07.2016, 10:58
вроде так
JavaScript
1
2
3
4
5
6
7
8
var elem = document.createElement('div');
elem.innerHTML = this.req.responseText;
var cnt = this.target.children.length;
while(cnt >= 10) {
    --cnt;
    this.target.removeChild(this.target.children[cnt]);
}
this.target.insertBefore(elem, this.target.children[0]);
0
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471
28.07.2016, 14:11  [ТС]
Цитата Сообщение от Cra3y Посмотреть сообщение
вроде так
Спасибо, вроде работает, но не надо ли как-то эти блоки обернуть во что-то чтобы удалять конкретно их?
А то он получается удаляет любые элементы в конце данного блока?
И еще одна проблема.
Даже если новых комментариев нет, то на страницу все-равно создается пустой div и естественно удаляются последние комментарии, а новых нет.
Пробовал делать так:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
if(this.req.responseText!= ''){
                alert(this.req.responseText);
            var elem = document.createElement('div');
            elem.innerHTML = this.req.responseText;
            var cnt = this.target.children.length;
            while(cnt >= 10) {
            --cnt;
           this.target.removeChild(this.target.children[cnt]);
           }
           this.target.insertBefore(elem, this.target.children[0]);
             }
Но все-равно происходит добавление пустого дива. При алерте alert(this.req.responseText); вылетает пустой алерт. Ничего не могу понять почему так...

Добавлено через 16 минут
Поправил код. Теперь если данных для обновления нет делаю в php файле
PHP
1
return false;
и потом делаю проверку
JavaScript
1
2
3
4
5
6
7
8
9
10
11
if(this.req.responseText!= false){
                alert(this.req.responseText);
            var elem = document.createElement('div');
            elem.innerHTML = this.req.responseText;
            var cnt = this.target.children.length;
            while(cnt >= 10) {
            --cnt;
           this.target.removeChild(this.target.children[cnt]);
           }
           this.target.insertBefore(elem, this.target.children[0]);
             }
Добавлено через 6 минут
Зато такую проблему заметил. Если новых комментариев выдало больше одного, то они все помещаются в один див блок и соответственно, будут удалены потом как один элемент

Добавлено через 1 час 2 минуты
В моем случае все "портит"
JavaScript
1
var elem = document.createElement('div');
Если бы без этого дива можно было просто вставлять данные, тогда бы у меня все работало как надо.
Есть какой-то выход из сложившейся ситуации?
0
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471
28.07.2016, 14:36  [ТС]
https://www.cyberforum.ru/atta... 1469705709
На скрине попытался показать что сейчас и как надо, для того чтобы все работало как надо
Миниатюры
Добавление и удаление элементов  
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
28.07.2016, 15:57
MirDj, накидал прототип скрипта обновления
comments.js
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/**
 * @param tag {string}
 * @param attr {Array}
 * @return {Element}
 */
function createElement(tag, attr) {
    var elem = document.createElement(tag);
    for(var name in attr) {
        elem.setAttribute(name, attr[name]);
    }
    return elem
}
 
/**
 * @param container {string}
 * @param url {string}
 * @param maxCount {Number}
 * @constructor
 */
function ComList(container, url, maxCount) {
    this.container = document.getElementById(container);
    this.comments = createElement('div', {});
    this.url = url;
    this.timerId = -1;
    this.run = false;
    this.maxCount = maxCount;
}
ComList.prototype = {
    toggle:function () {
        this.run ? this.stop() : this.start();
    },
    start:function () {
        if (this.run) return;
        this.run = true;
        this.getUpdates();
        this.timerId = setInterval(this.getUpdates.bind(this), 10000);
    },
    stop:function () {
        if (!this.run) return;
        this.run = false;
        clearInterval(this.timerId);
    },
    getUpdates:function () {
        var self = this;
        new Ajax().GET({
            url: self.url,
            /**
             * @param e {Event}
             */
            callback: function (e) {
                /** @var req {XMLHttpRequest} */
                var req = e.target;
                switch (req.readyState){
                    case XMLHttpRequest.DONE:
                        var txt = req.responseText.trim();
                        if (txt === '') return;
                        self.comments.innerHTML = txt + self.comments.innerHTML;
                        self.removeOld();
                        self.container.innerHTML = self.comments.innerHTML;
                        break;
                }
            }
        });
    },
    removeOld:function () {
        var cnt = this.comments.children.length;
        while (cnt > this.maxCount) {
            --cnt;
            this.comments.removeChild(this.comments.children[cnt]);
        }
    }
};
function Ajax() {
    this.sender = new XMLHttpRequest();
}
Ajax.prototype = {
    send:function (options) {
        this.sender.open(options.method, options.url, true);
        this.sender.onreadystatechange = options.callback;
        this.sender.send(options.data);
    },
    GET:function (options) {
        options.method = 'GET';
        this.send(options);
    },
    POST:function (options) {
        options.method = 'POST';
        this.send(options);
    }
}

Инициализация
JavaScript
1
2
3
4
5
6
var ComListInstance = new ComList(
    'com_list', // id контейнера
    'ajax.php', // скрипт обработчик
    6 // макс количество комментариев
);
ComListInstance.toggle();// переключение таймера
тестовый ajax.php
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
 
$count = random_int(0,2);
 
for ($i = 0; $i < $count; ++$i):
 
?><div  style="min-height: 65px; display: inline-block;">
    <div style="display: inline-block;vertical-align: top;height:30px;width: auto;">
        <div style="text-align: center; width:auto;">
            <div id="ava" style="position:relative;display:inline-block;"></div>
        </div>
    </div>
 
    <div  class="s22" style="display: inline-block;padding-left: 5px;">Автор: <b><</b><br /> Дата:</div>
    <div  class="s22" style="display: inline-block;padding-left: 60px;"> Новость: <a href="/news/" targe="_blank" style="width:190px;word-wrap: break-word;"></a></div>
    <div style="padding-top:35px;border-bottom:1px solid #BDBDBD;width:240px;word-wrap: break-word;"></div>
    <div style="width: 10px; display: inline-block;"></div>
</div><?php
endfor;
?>
Контейнер
HTML5
1
2
3
4
5
6
7
    <div class="row content">
        <!-- контейнер для комментариев -->
        <div id="com_list"></div>
        <!-- другие элементы -->
        <div></div>
    </div>
    <script src="comments.js"></script>
1
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471
29.07.2016, 10:40  [ТС]
Спасибо за проделанную работу. Не мог раньше добраться до интернета, по этому сейчас спрошу.
Два момента интересует.
А как обмен данными происходит на запрос новых комментариев?
У меня было что при загрузке страницы в переменную сохраняется id последнего комментария, потом я его аяксом передаю скрипту и тот делает выборку что если есть id больше этого, то их выводим. И затем возвращаем на исходную страницу id нового последнего комментария. А здесь каким образом?
И должно ли из php скрипта какие-то данные возвращаться js скрипту для его работы?

И каким образом осуществляется первичный вывод 10-ки комментариев? Также как и раньше, на исходной странице запросом? Или вашим скриптом по таймеру?
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
29.07.2016, 11:50
Цитата Сообщение от MirDj Посмотреть сообщение
А как обмен данными происходит на запрос новых комментариев?
А никак. Обмен еще прописать надо. Метод getUpdates требует доработки.
Цитата Сообщение от MirDj Посмотреть сообщение
И каким образом осуществляется первичный вывод 10-ки комментариев?
Тут возможны варианты автоматического и ручного обновления.
start - запуск обновления по таймеру/stop - остановка
метод toggle позволяет переключать автообновление ON/OFF
getUpdates - единичный запрос на обновление

сообщения хранятся во внутреннем контейнере comments(this.comments = createElement('div', {});)
При обновлении сначала добавляются туда,
затем содержимое основного контейнера заменяется(self.container.innerHTML = self.comments.innerHTML)
0
Superposition
 Аватар для Padimanskas
950 / 615 / 256
Регистрация: 27.10.2013
Сообщений: 2,083
29.07.2016, 12:04
Цитата Сообщение от MirDj Посмотреть сообщение
А как обмен данными происходит на запрос новых комментариев?
Цитата Сообщение от MirDj Посмотреть сообщение
И должно ли из php скрипта какие-то данные возвращаться js скрипту для его работы?
php управляет сервером, а сервер отправляет данные по протоколу http. Этими данными могут быть как html, так и xml, json, binary и все что угодно. Поэтому можно отправлять асинхронные(неблокирующие) запросы со страницы к серверу и принимать например формат json. Cra3y написал некоторую реализацию асинхронного приема/передачи. Хотя мне не очень нравится код(сильно связан и объекты знают друг о друге слишком много), но вполне функционален и подойдет для подхвата комментариев (все аккуратно, даже jsdoc есть )
0
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471
29.07.2016, 13:12  [ТС]
залил все это дело у себя на сервак, где я один все тестирую, все ок... А заливаю туду где пользователей онлайн по 6 000 человек и сервак сразу в аут уходит

Добавлено через 6 минут
Запускается куча процессов apache и каждый жрет по 15-17 процентов.
Заливаю прежние файлы и все ок. Может цикл какой получается вечный или еще что....

Добавлено через 32 минуты
На странице где вывод комментариев - делаю так:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
<script src="/js/comments.js"></script>
<script>
 
var ComListInstance = new ComList(
    'com_list', // id контейнера
    '/return/comments.php?actcom=upd10Com', // скрипт обработчик
    10 // макс количество комментариев
);
ComListInstance.toggle();// переключение таймера
 
 
</script>
html
HTML5
1
2
3
4
5
6
7
 <div class="newComm">
 <h2>10-ка последних комментариев</h2>
 
            <div id="com_list"></div>
             
 
 </div
ну и в самом скрипте обработчике:
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
if($actcom == 'upd10Com'){
  $com_sql = $sql->run("select * from ".MY_PREFIX."_comments where id > ? order by id DESC",array($_REQUEST['idcom']));
 
  if($com_sql->rowCount() > 0){
  $small=true;
          ////// Подключаем библиотеку бб кодов
          require_once ''.PATH_BB_CONF.'';
          $config = new XbbEditorConfig;
          require_once $config->pathToParser;
          ////// Подключаем библиотеку бб кодов
          $bb = new bbcode;
          $dx='0';
 
          while ($Row = $com_sql->fetch()) {
     $title = $func->GetOne("title","".MY_PREFIX."_news","id",$Row['news_id']);
     $ava_url = $func->GetOne("ava_url","".MY_PREFIX."_users","id",$Row['user_id']);
     if($ava_url=='') {$ava_url=DOMEN_LINK.'/images/no_avatar.jpg';}
     $ava="<img src='".$ava_url."' style='border: 1px solid #C9C9C9; width: 50px; height:auto;'>";
     $dx++;
     $mounth=$Row['mo'];
     $mounthName = makeDateName($mounth);
     if($dx=='1'){
     $id = $Row['id'];
     }
     ?>
     <div id="<?=$Row['id']?>">
     <div  style="min-height: 65px; display: inline-block;">
     <!-- Левый блок с аватаркой и номером комментария -->
         <div style="display: inline-block;vertical-align: top;height:30px;width: auto;">
         <div style="text-align: center; width:auto;">
         <div id="ava" style="position:relative;display:inline-block;"><?=$ava?><?if($onlineIm){?><div class="ic-online" title="Пользователь онлайн"></div> <?}?></div>
        </div>
        </div><!-- Закрытие блока с аватаром -->
 
     <div  class="s22" style="display: inline-block;padding-left: 5px;">Автор: <b><?=$Row['name']?></b><br /> Дата: <?=$Row['da']?> <?=$mounthName?> в <?=$Row['ho']?>:<?=$Row['mi']?></div>
    <div  class="s22" style="display: inline-block;padding-left: 60px;"> Новость: <a href="/news/<?=$Row['news_id']?>" targe="_blank" style="width:190px;word-wrap: break-word;"><?=$title?></a></div>
     <div style="padding-top:35px;border-bottom:1px solid #BDBDBD;width:240px;word-wrap: break-word;"><?$bb -> parse($Row['text']);
          $Row['text'] = $bb->get_html(); echo $Row['text'];?></div>
     <div style="width: 10px; display: inline-block;"></div>
       </div>
       </div>
          <?
   }
     
   }
 
 }


Как только обновляю страницу загружаются 10 комментариев и сразу apache подскакивает до 10% это только один процесс и при том что я один. Удаляю comments.js обновляю страницу и все ок.
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
29.07.2016, 14:17
MirDj, к запросу в базу добавьте LIMIT 10
в comments.js
в
JavaScript
1
function ComList(container, url, maxCount) {
добавить строку
JavaScript
1
    this.ajax = new Ajax();
в getUpdates:function ()
заменить
JavaScript
1
new Ajax()
на
JavaScript
1
this.ajax
1
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471
29.07.2016, 14:33  [ТС]
Сейчас вроде все работает. Спасибо огромное.А насчет обновления по id предыдущего последнего комментария думаю это лишнее? Ведь можно реально просто запрашивать все последние 10 комментариев, новые добавятся, а старые сами уйдут, без всяких id
0
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471
18.08.2016, 16:02  [ТС]
Cra3y, а подскажи пожалуйста, по твоему скрипту.
А если я хочу отправить какие либо данные, например текст сообщения и методом post, то как это реализовать?
Вот я добавил свои переменные:
JavaScript
1
2
3
4
5
6
7
8
9
10
function QuoteReturn(url,updDate,news,msg,msgId,idquote,dx) {
    this.url = url
    this.updDate = updDate
    this.news = news
    this.msg = msg
    this.msgId = msgId
    this.idquote = idquote
    this.dx = dx
    this.ajax = new Ajax();
}
на исходной странице я их добавил:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
var msg = $("#edit").val();
     var msg = encodeURIComponent(msg);
    var QuoteReturnInstance = new QuoteReturn(
    '/return/comments.php?actcom=selectMsg',
    ''+dateUpd+'',
    '<?=$news_id;?>',
    ''+msg+'',
    ''+msgId+'',
    ''+idquote+'',
    ''+dx+''
    );
Если я правильно понял, то метод POST нужно сделать аналогично:
JavaScript
1
 this.ajax.POST
вместо GET
А как передать остальные данные, чтобы не добавлять их в строку с урлом?

Добавлено через 8 минут
я думал так, после :
JavaScript
1
 url: self.url,
вставить это:
JavaScript
1
data:{'updDate':self.updDate,'news':self.news,'msg':self.msg,'msgId':self.msgId,'idquote':self.idquote,'dx':self.dx},
Но это или я не правильно сделал или принимать их уже нужно не
PHP
1
$_REQUEST['news']
, а как-то иначе?
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
18.08.2016, 16:14
Цитата Сообщение от MirDj Посмотреть сообщение
А как передать остальные данные, чтобы не добавлять их в строку с урлом?
Нужно передать в опциях параметр data
что то вроде
JavaScript
1
2
3
4
5
ajax.post({
    url:'https://httpbin.org/post',
    data: 'a=b&c=d'
    on_load: function(e) { console.log(e); }
});
Цитата Сообщение от MirDj Посмотреть сообщение
$("#edit").val();
Раз уж у вас подключена jQuery, то почему бы не использовать ее функции
примерно так
JavaScript
1
2
3
4
5
6
7
8
$.post(
  'https://httpbin.org/post',
  {
    a: b,
    c: d
  },
  function(e) { console.log(e); }
);
А мой велосипед можно выкинуть. он почти не на что не годится.
0
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471
19.08.2016, 09:33  [ТС]
Цитата Сообщение от Cra3y Посмотреть сообщение
data: 'a=b&c=d'
Если я передаю данные таким образом, то никак не могу их потом принять.
В консоли смотрю данные запроса:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Request URL:http://true@*.ru/return/comments.php?actcom=selectMsg
Request Method:POST
Status Code:200 OK
Remote Address:192.168.1.10:808
Response Headers
view source
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:Keep-Alive
Content-Type:text/html; charset=UTF-8
Date:Fri, 19 Aug 2016 06:25:56 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive:timeout=5, max=98
Pragma:no-cache
Server:Apache/2.2.22 (Debian)
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Powered-By:PHP/5.4.4-14+deb7u7
Request Headers
view source
Accept:*/*
Accept-Encoding:gzip, deflate
Accept-Language:ru,en;q=0.8
Content-Length:84
Content-Type:text/plain;charset=UTF-8
Cookie:
Host:*.ru
Origin:http://*.ru
Proxy-Connection:keep-alive
Referer:http://*.ru/news/682562/
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 YaBrowser/16.7.1.20937 Yowser/2.5 Safari/537.36
Query String Parameters
view source
view URL encoded
actcom:selectMsg
Request Payload
updDate=20160819092551&news=682562&msg=dfdffdsfsdfsdfsd%0A%0A&msgId=0&idquote=0&dx=0
Т.е данные передаются не как обычно через Form Data а через Request Payload. И я никак их не могу принять в php
PHP
1
$_REQUEST
не выводит ничего,
PHP
1
$_POST
тоже. Пробовал
PHP
1
2
3
4
$params = json_decode($_POST['data']);
     $res = array("NewDate" => $datenow,"newCount" => "0","msg"=>$params['msg']);
     $QuoteReturn = json_encode($res);
      echo  $QuoteReturn;
PHP
1
$params = json_decode($_REQUEST['data']);
и возвращаю это json(ом) и в консоли смотрю результат:
Code
1
{"NewDate":"20160819092556","newCount":"0","msg":null}
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
19.08.2016, 21:36
Цитата Сообщение от MirDj Посмотреть сообщение
Если я передаю данные таким образом, то никак не могу их потом принять.
Используйте jQuery.post
Мой "класс" Ajax пригоден только для простых случаев.
Для более серьезного использования ему требуется жесткая доработка напильником.
В частности для отправки данных POST-методом нужно правильно выставлять заголовки, а этой функции у меня нет.
немного допилил, но не до конца
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/**
 * XMLHttpRequest wrapper
 *
 * @constructor
 * @this {Ajax}
 */
function Ajax() {
    /**
     * @type {XMLHttpRequest}
     */
    this.sender = new XMLHttpRequest();
}
Ajax.prototype = ({
    /**
     * send new request
     * @param options {Object}
     * @this {Ajax}
     */
    send: function (options) {
        this.sender.open(options.method, options.url, true);
        if ('POST' == options.method) {
            this.sender.setRequestHeader('Content-Type', options.type);
        }
        this.sender.onload = options.on_load;
        this.sender.send(options.data);
    },
    /**
     * send 'GET' request
     * @param options {Object}
     * @this {Ajax}
     */
    get: function (options) {
        options.method = 'GET';
        this.send(options);
    },
    /**
     * send 'POST' request
     * @param options {Object}
     * @this {Ajax}
     */
    post: function (options) {
        options.method = 'POST';
        options.type = options.type || 'application/x-www-form-urlencoded';
        this.send(options);
    }
});
0
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471
22.08.2016, 12:39  [ТС]
Цитата Сообщение от Cra3y Посмотреть сообщение
немного допилил, но не до конца
Спасибо, я решил
сделать так:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
function QuoteReturn(url,updDate,news,msg,msgId,idquote,dx) {
     document.getElementById('imgLoad').style.display = 'block'; // Выводим изображение прелоадера
    $.ajax({
type: "POST",
url: url,
data:'updDate='+updDate+'&news='+news+'&msg='+msg+'&msgid='+msgId+'&idquote='+idquote+'&dx='+dx,
success: function(html) {
     document.getElementById('imgLoad').style.display = 'none'; // Отключаем прелоадер
 
var data = JSON.parse ( html ); // Парсим данные
 
                          if(data.newCount){var count = data.newCount;}else{var count = data.length;}// Получаем кол-во строк
                          if(count > 0){ 
                          window.dateUpd = data[0].NewDate;
                          if(data[0].NOTIF == '1'){ // Если требуется выводить визуальное оповещение
 
                          if(data[0].QC > 0){var msgQ = 'Есть новые ответы на комментарии('+data[0].QC+' шт.)';}else{var msgQ = 'Новых ответов на комментарии нет';}
                          if(data[0].CC > 0){var msgC = 'Есть новые комментарии('+data[0].CC+' шт.)';}else{var msgC = 'Новых комментариев нет';}
 
                          document.getElementById('notifQuote').style.display = 'block';
                          document.getElementById('notifQuote').innerHTML = msgC+'<br /><br />'+msgQ;
 
                            
                          }
                          setTimeout(function(){document.getElementById('notifQuote').innerHTML = ''; document.getElementById('notifQuote').style.display = 'none';}, 10000);
                          if(data[0].SOUND == '1'){// Если требуется выводить звуковое оповещение
 
                          document.getElementById('muz').innerHTML='<audio autoplay="autoplay" ><source src="/sound/notify.ogg" type="audio/ogg"><source src="/sound/notify.mp3" type="audio/mpeg"><source src="/sound/notify.wav" type="audio/wav"></audio>';
                          setTimeout(function(){document.getElementById('muz').innerHTML = '';}, 10000);
 
                          }
                         
                          for (var i = 0; i < count; i++) { // Обрабатываем массив
                          if(data[i].QID > 0){// Если это ответ на какой-то комментарий
                          if(document.getElementById('quoteMsg'+data[i].QID)){ // Проверяем наличие контейнера куда пойдет ответ
                         var elems = createElement('div', {}); elems.innerHTML = data[i].text;
                         document.getElementById('quoteMsg'+data[i].QID).appendChild(elems);
                         var border = document.getElementById('border'+data[i].QID).innerHTML;
                         if(border == ''){
                         document.getElementById('border'+data[i].QID).innerHTML='<div style="text-align:center; border-top: 2px dashed #B1B1B1;"></div>'
                         }
                         }
                          }else{ // Если это не ответ, а комментарий
                          target = document.getElementById('newComments');
                          var elem = createElement('div', {});
                          elem.innerHTML =  '<a href="#msg'+data[i].ID+'" id="click_scroll'+data[i].ID+'"></a><div id="msg'+data[i].ID+'"> <div style="width: 100%; min-height: 150px; height: auto; border-bottom:1px solid #BDBDBD;margin:0 auto;">'+data[i].text+'<div id="quoteMsg'+data[i].ID+'"><div id="border'+data[i].ID+'"> </div> </div> </div></div><div style="height: 5px;"></div>';
                          target.appendChild(elem);
                          }
 
                          }
 
                          }else{
                          window.dateUpd = data.NewDate;
                          }
},
error:  function(){ // Выводим ошибку, если запрос не обработался.
        document.getElementById('imgLoad').style.display = 'none';
        document.getElementById('errorLoad').style.display = 'block';
        document.getElementById('errorLoad').innerHTML = 'Произошла ошибка при обработке запроса. Возможно нет доступа в интернет.';
        setTimeout(function(){document.getElementById('errorLoad').innerHTML = ''; }, 5000);
 
    }
});
 
}


Есть только одна проблема с JSON у меня.
В скрипте php, куда обращается ajax, нужно составить json с данными и вернуть его js скрипту для разбора.
Проблема у меня в том, что нужно сделать так, внутри цикла собрать массив:

PHP
1
2
3
 while ($Rows = $com_sql->fetch()){
$res[] = array("ID" => $Rows['id'],"QID" => $Rows['quote_id'],"text" => $buffer);
}
и потом вне цикла добавить в json еще массив с данными, которые не надо добавлять внутри цикла в каждый массив, а только разово:


PHP
1
array("NewDate" => $datenow,"SOUND" => $soundIn,"NOTIF" => $notifIn,"newCount" => $countNewCom,"QC" => $QC,"CC" => $CC);
и чтобы потом обращаться в js к этим данным типа
JavaScript
1
data[0].SOUND
, а остальные разбирать в цикле

JavaScript
1
2
3
4
5
6
var data = JSON.parse ( html );
                         var count = data[0].newCount;
for (var i = 0; i < count; i++) {
var elems = createElement('div', {}); elems.innerHTML = data[i].text;
                         document.getElementById('quoteMsg'+data[i].QID).appendChild(elems);
}
Как правильно составить такую структуру json?

чтобы потом была единая переменная, которую уже преобразовывать в json и возвращать аяксу

PHP
1
2
$QuoteReturn = json_encode($res);
       echo  $QuoteReturn;
0
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471
22.09.2016, 11:43  [ТС]
И снова прошу помощи по данному скрипту.
Мне при возвращении данных, нужно на исходной странице обновить значение переменной.
Она задается так:
PHP
1
$datenow = date("YmdHis");
JavaScript
1
var dateUpd = "<?=$datenow?>";
и затем подключение скрипта
JavaScript
1
<script src="/js/comments.js"></script>
JavaScript
1
2
3
4
5
6
7
var ComListInstance = new ComList(
    'com_list', // id контейнера
    '/return/comments.php?actcom=upd10Com', // скрипт обработчик
    10, // макс количество комментариев
    dateUpd // Текущая дата
);
ComListInstance.toggle();// переключение таймера
в файле js в
JavaScript
1
callback: function (e) {}
Делаю так:
JavaScript
1
2
3
4
5
6
7
8
9
 var today = new Date;
 var Y =  today.getFullYear();
 var m =  today.getMonth();
 var d =  today.getDate();
 var H =  today.getHours();
 var i =  today.getMinutes();
 var s =  today.getSeconds();
 var newDate = ''+Y+''+m+''+d+''+H+''+i+''+s+'';
 window.dateUpd = newDate;
Но дата почему-то на исходной странице не обновляется. Может быть к переменной нужно какое-то обращение другое вместо window из данного скрипта?

Добавлено через 26 минут
Кажется я понял в чем проблема была. Я передавал значение даты вместе с параметрами url maxCount и т.д. а они передавались только один раз. По этому из
JavaScript
1
function ComList(container, url, maxCount) {}
я убрал значение даты. И стал её передавать уже здесь
JavaScript
1
2
this.ajax.GET({
            url: self.url+'&dateUpd='+window.dateUpd,
Причем стал обращаться конкретно к переменной. И вроде все заработало
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
22.09.2016, 15:06
Цитата Сообщение от MirDj Посмотреть сообщение
<div id="10Com"></div>
значения имён name и идентификаторов id по стандарту должны начинаться с буквы
чтобы вам помочь, необходимо знать структуру кода/текста, который "приходит" на страницу в свойстве
responseText
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.09.2016, 15:06
Помогаю со студенческими работами здесь

Добавление элементов к дереву, удаление элементов и поиск уровня с наибольшей суммой элементов
Помогите пожалуйста! нужно разработать программу для работы с деревом. В узлах дерева содержатся символы. Дерево должно быть...

Двунаправленный список (добавление/удаление элементов в голову, просмотр списка, реализовать дублирование элементов с заданным значением)
Здравствуйте! Помогите написать программу, обеспечивающую работу с двунаправленным нециклическим списком: добавление/удаление элементов в...

Добавление и удаление элементов
Добрый день! Столкнулся с проблемой удаления элементов в AngularJS, хотя в общем можно сказать и в JavaScript :). Так вот, есть четыре...

Очередь добавление / удаление элементов
#include &lt;iostream&gt; using namespace std; struct nod{ string nr; nod *leg; }; nod*v,*sf; int n; void Pune (nod...

Удаление и добавление элементов массива
Суть задачи: объявить и сформировать одномерный массив вещественных чисел. Количество элементов вводится пользователем с клавиатуры....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru