Я пытаюсь отсортировать некоторые динамически созданные Div по дате/времени, используя JS/jQuery. Существует 2 разных типа div (.note и .activity), которые используют data-datetime="" или просто datetime="", поэтому я пытаюсь отсортировать их по содержимому в элементах с именем класса .timeago.
setTimeout(function() {
function sortDescending(a, b) {
var date1 = $(a).find(".timeago").text();
date1 = date1.split('/');
date1 = new Date(date1[2], date1[1] - 1, date1[0]);
var date2 = $(b).find(".timeago").text();
date2 = date2.split('/');
date2 = new Date(date2[2], date2[1] - 1, date2[0]);
return date1 < date2 ? 1 : -1;
};
$('.notes .note').sort(sortDescending).appendTo('.notes');
}, 3000);.note { margin-bottom:30px;}
.note .timeago {color:red; font-weight:bold;}
.activity .timeago {color:green; font-weight:bold;}<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "notes panel-group" id = "accordion">
<!------ Notes ------>
<div class = "note tab-content panel panel-default" data-toggle = "collapse" href = "#collapse0">
<div class = "row tab-content">
<div class = "col-sm-3 metadata tab-content panel-heading">
<div class = "postedon tab-content">
<abbr class = "timeago" data-datetime = "2022-10-30T18:54:39Z" title = "10/30/2022 11:54 AM">10/30/2022 11:54 AM</abbr>
</div>
<div class = "createdby text-muted">Should Be 1</div>
</div>
<div class = "col-sm-9 content panel-collapse collapse" id = "collapse0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
</div>
<div class = "note tab-content panel panel-default" data-toggle = "collapse" href = "#collapse1">
<div class = "row tab-content">
<div class = "col-sm-3 metadata tab-content panel-heading">
<div class = "postedon tab-content">
<abbr class = "timeago" data-datetime = "2022-08-11T15:39:41Z" title = "8/11/2022 8:39 AM">8/11/2022 8:39 AM</abbr>
</div>
<div class = "createdby text-muted">Should Be 5</div>
</div>
<div class = "col-sm-9 content panel-collapse collapse" id = "collapse1">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
</div>
<div class = "note tab-content panel panel-default" data-toggle = "collapse" href = "#collapse2">
<div class = "row tab-content">
<div class = "col-sm-3 metadata tab-content panel-heading">
<div class = "postedon tab-content">
<abbr class = "timeago" data-datetime = "2022-10-05T14:53:01Z" title = "10/5/2022 7:53 AM">10/5/2022 7:53 AM</abbr>
</div>
<div class = "createdby text-muted">Should Be 2</div>
</div>
<div class = "col-sm-9 content panel-collapse collapse" id = "collapse2">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
</div>
<!------ End Notes ------>
<!------ Activities ------>
<div class = "activity note panel panel-default" data-toggle = "collapse" href = "#collapse3">
<div class = "panel-heading tab-content">
<div class = "createdby tab-content">Should Be 6</div>
<div class = "postedon">
<time class = "timeago" datetime = "2022-04-03T15:41:09-07:00">4/3/2022 3:41 PM</time>
</div>
</div>
<div class = "content panel-collapse collapse" id = "collapse3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
<div class = "activity note panel panel-default" data-toggle = "collapse" href = "#collapse4">
<div class = "panel-heading tab-content">
<div class = "createdby tab-content">Should Be 3</div>
<div class = "postedon">
<time class = "timeago" datetime = "2022-10-03T06:55:52-07:00">10/3/2022 6:55 AM</time>
</div>
</div>
<div class = "content panel-collapse collapse" id = "collapse4">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
<div class = "activity note panel panel-default" data-toggle = "collapse" href = "#collapse5">
<div class = "panel-heading tab-content">
<div class = "createdby tab-content">Should Be 4</div>
<div class = "postedon">
<time class = "timeago" datetime = "2022-09-03T09:29:33-07:00">9/3/2022 9:29 AM</time>
</div>
</div>
<div class = "content panel-collapse collapse" id = "collapse5">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
<!------ End Activities ------>
</div>Для этого я создал JS Fiddle - https://jsfiddle.net/bstime/oyec69g5/11/
@bstime Смотрите ответ, пожалуйста, установите как ответ, если все в порядке :)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваши параметры конструктора даты были неверными, поэтому дата не удалась. Я разделяю последнюю часть даты (год + время, например: 2022, 9:29) пробелом и получаю первый элемент, чтобы получить только год.
setTimeout(function() {
function sortDescending(a, b) {
var date1 = $(a).find(".timeago").text();
date1 = date1.split('/');
date1 = new Date(date1[2].split(' ')[0], date1[0], date1[1]);
var date2 = $(b).find(".timeago").text();
date2 = date2.split('/');
date2 = new Date(date2[2].split(' ')[0], date2[0], date2[1]);
return date1 < date2 ? 1 : -1;
};
$('.notes .note').sort(sortDescending).appendTo('.notes');
}, 3000);
это работает при использовании на скрипке, но когда я применяю его к сайту, я получаю: Uncaught TypeError: Невозможно прочитать свойства неопределенного (чтение «разделить»)
@bstime, тогда код на скрипке отличается от кода на веб-сайте - можете ли вы обновить свой вопрос с помощью кода
Вы можете сделать это...
function sortNotes()
{
let divParent = document.querySelector('#accordion');
[...document.querySelectorAll('#accordion > div.note')]
.sort( (a,b) =>
{
let aDate = new Date(a.querySelector('.timeago').textContent).getTime()
, bDate = new Date(b.querySelector('.timeago').textContent).getTime();
return bDate - aDate;
})
.forEach(note => divParent.appendChild(note) )
}
sortNotes();.note { margin-bottom:30px;}
.note .timeago {color:red; font-weight:bold;}
.activity .timeago {color:green; font-weight:bold;}<div class = "notes" id = "accordion">
<div class = "note" >
<div class = "row">
<div class = "">
<div class = "postedon">
<abbr class = "timeago" data-datetime = "2022-10-30T18:54:39Z" title = "10/30/2022 11:54 AM">10/30/2022 11:54 AM</abbr>
</div>
<div>Should Be 1</div>
</div>
<div class = "col-sm-9 content collapse" >
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
</div>
<div class = "note">
<div class = "row">
<div class = "">
<div class = "postedon">
<abbr class = "timeago" data-datetime = "2022-08-11T15:39:41Z" title = "8/11/2022 8:39 AM">8/11/2022 8:39 AM</abbr>
</div>
<div>Should Be 5</div>
</div>
<div class = "col-sm-9 content collapse" id = "collapse1">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
</div>
<div class = "note" >
<div class = "row">
<div class = "">
<div class = "postedon">
<abbr class = "timeago" data-datetime = "2022-10-05T14:53:01Z" title = "10/5/2022 7:53 AM">10/5/2022 7:53 AM</abbr>
</div>
<div>Should Be 2</div>
</div>
<div class = "col-sm-9 content collapse" id = "collapse2">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
</div>
<div class = "activity note" >
<div class = "">
<div class = "createdby">Should Be 6</div>
<div class = "postedon">
<time class = "timeago" datetime = "2022-04-03T15:41:09-07:00">4/3/2022 3:41 PM</time>
</div>
</div>
<div class = "content collapse" >
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
<div class = "activity note" >
<div class = "">
<div class = "createdby">Should Be 3</div>
<div class = "postedon">
<time class = "timeago" datetime = "2022-10-03T06:55:52-07:00">10/3/2022 6:55 AM</time>
</div>
</div>
<div class = "content collapse">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
<div class = "activity note" >
<div class = "">
<div class = "createdby">Should Be 4</div>
<div class = "postedon">
<time class = "timeago" datetime = "2022-09-03T09:29:33-07:00">9/3/2022 9:29 AM</time>
</div>
</div>
<div class = "content collapse" >
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
</div>из комментария :
это работает при использовании на скрипке, но когда я применяю его к сайту, я получаю: Uncaught TypeError: невозможно прочитать свойства null (чтение «textContent»)
в случае недопустимых значений даты...
function sortNotes()
{
let divParent = document.querySelector('#accordion')
, allNotes = [...document.querySelectorAll('#accordion > div.note')]
;
allNotes.forEach( note =>
{
let refTimeago = note.querySelector('.timeago').dateTime
|| note.querySelector('.timeago').dataset.datetime
;
note._refDate = refTimeago ? new Date(refTimeago).getTime() : 0;
if (isNaN(note._refDate) )
note._refDate = 0;
})
allNotes
.sort( (a,b) => b._refDate - a._refDate )
.forEach( note =>
{
delete note._refDate;
divParent.appendChild(note);
})
sortNotes();
// or :-> setTimeout( sortNotes, 3000);
это работает при использовании на скрипке, но когда я применяю его к сайту, я получаю: Uncaught TypeError: невозможно прочитать свойства null (чтение «textContent»)
@bstime это означает, что HTML-код, который вы здесь представили, не соответствует множеству возможных случаев, присутствующих на вашем сайте. Должны быть заметки без class = "timeago" или с пустым текстом...
@bstime Я обновил свой ответ.... (недопустимые даты переводятся в конец списка)
Да, это то, что происходило, я использовал $('time').addClass('timeago'); добавить .timeago к действиям, которые в некоторых случаях не добавлялись вовремя для сортировки. ТЮ
Уже есть хорошее простое решение для Javascript, но, поскольку вы используете jQuery, вот вариант jQuery. Мне также кажется неудобным использовать текст вашей страницы для сортировки, когда у вас есть атрибут, который предположительно существует явно для такого рода программных манипуляций - например, возможно, в будущем текст изменит формат и не будет быть разборчивым в JS.
function sortDescending(a, b) {
// Find the element with the attributes we're after ...
let $timeElementA = $('.timeago', a);
let $timeElementB = $('.timeago', b);
// ... and use whichever of the 2 attribute possibilities are there
let timeA = $timeElementA.data('datetime')
? new Date($timeElementA.data('datetime'))
: new Date($timeElementA.attr('datetime'));
let timeB = $timeElementB.data('datetime')
? new Date($timeElementB.data('datetime'))
: new Date($timeElementB.attr('datetime'));
// Javascript sort should return a value >0, <0, or 0.
// Simply subtracting our 2 values works here.
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#description
return timeB - timeA;
}
setTimeout(function() {
$('.notes .note').sort(sortDescending).each(function(i, el) {
$('.notes').append(el);
});
}, 3000);.note {
margin-bottom: 30px;
}
.note .timeago {
color: red;
font-weight: bold;
}
.activity .timeago {
color: green;
font-weight: bold;
}<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "notes panel-group" id = "accordion">
<!------ Notes ------>
<div class = "note tab-content panel panel-default" data-toggle = "collapse" href = "#collapse0">
<div class = "row tab-content">
<div class = "col-sm-3 metadata tab-content panel-heading">
<div class = "postedon tab-content">
<abbr class = "timeago" data-datetime = "2022-10-30T18:54:39Z" title = "10/30/2022 11:54 AM">10/30/2022 11:54 AM</abbr>
</div>
<div class = "createdby text-muted">Should Be 1</div>
</div>
<div class = "col-sm-9 content panel-collapse collapse" id = "collapse0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
</div>
<div class = "note tab-content panel panel-default" data-toggle = "collapse" href = "#collapse1">
<div class = "row tab-content">
<div class = "col-sm-3 metadata tab-content panel-heading">
<div class = "postedon tab-content">
<abbr class = "timeago" data-datetime = "2022-08-11T15:39:41Z" title = "8/11/2022 8:39 AM">8/11/2022 8:39 AM</abbr>
</div>
<div class = "createdby text-muted">Should Be 5</div>
</div>
<div class = "col-sm-9 content panel-collapse collapse" id = "collapse1">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
</div>
<div class = "note tab-content panel panel-default" data-toggle = "collapse" href = "#collapse2">
<div class = "row tab-content">
<div class = "col-sm-3 metadata tab-content panel-heading">
<div class = "postedon tab-content">
<abbr class = "timeago" data-datetime = "2022-10-05T14:53:01Z" title = "10/5/2022 7:53 AM">10/5/2022 7:53 AM</abbr>
</div>
<div class = "createdby text-muted">Should Be 2</div>
</div>
<div class = "col-sm-9 content panel-collapse collapse" id = "collapse2">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
</div>
<!------ End Notes ------>
<!------ Activities ------>
<div class = "activity note panel panel-default" data-toggle = "collapse" href = "#collapse3">
<div class = "panel-heading tab-content">
<div class = "createdby tab-content">Should Be 6</div>
<div class = "postedon">
<time class = "timeago" datetime = "2022-04-03T15:41:09-07:00">4/3/2022 3:41 PM</time>
</div>
</div>
<div class = "content panel-collapse collapse" id = "collapse3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
<div class = "activity note panel panel-default" data-toggle = "collapse" href = "#collapse4">
<div class = "panel-heading tab-content">
<div class = "createdby tab-content">Should Be 3</div>
<div class = "postedon">
<time class = "timeago" datetime = "2022-10-03T06:55:52-07:00">10/3/2022 6:55 AM</time>
</div>
</div>
<div class = "content panel-collapse collapse" id = "collapse4">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
<div class = "activity note panel panel-default" data-toggle = "collapse" href = "#collapse5">
<div class = "panel-heading tab-content">
<div class = "createdby tab-content">Should Be 4</div>
<div class = "postedon">
<time class = "timeago" datetime = "2022-09-03T09:29:33-07:00">9/3/2022 9:29 AM</time>
</div>
</div>
<div class = "content panel-collapse collapse" id = "collapse5">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
<!------ End Activities ------>
</div>
Хорошо, это сделано, надеюсь, это поможет