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

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

28.07.2016, 10:26. Показов 1481. Ответов 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
Ответ Создать тему
Новые блоги и статьи
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru