У меня есть структура динамических элементов DOM, которые я постоянно оцениваю с помощью цикла for и setInterval. В течение этого интервала я сортирую массив, а затем изменяю dom с помощью функции JQuery Sort, чтобы упорядочить структуру DOM на лету.
Дело в том, что я хочу изменить DOM только в том случае, если функция сортировки фактически меняет порядок элементов (обычно это происходит, когда новый элемент DOM входит в структуру динамически), если функция сортировки снова работает над уже отсортированным массивом, который я не не хочу ничего делать с домом.
Я нашел МНОГО способов сравнить, равны ли массивы, но мой случай особенный, поскольку мне все равно на элементы/контент массивов, но мне действительно нужно проверить, не находятся ли эти элементы в том же порядке, чтобы я мог изменить дом.
setInterval(function () {
//Incoming Chat Structure Variables
var $incomingChatsTable, $incomingChatsRows, $incomingChatTags
$incomingChatsTable= $("div[__jx__id*='incoming_list__list_content_container']")
$incomingChatsRowsContainer=$("div[__jx__id='___$_194__visitor_list__incoming_list__list__content']")
$incomingChatsRows = $("div[class*='renderers_Incoming']")
$incomingChatTags = $( "div[__jx__id*='incoming_list__list__content'] div[class*='renderers_Incoming'] .visitorlist_tags .jx_ui_html_span:last-child .tag").toArray()
$popupTrigger = $("div[jx\\:list\\:rowid]")
//Assigning Priorities Function
function assignPriority(arrayParent) {
for ( var i=0; i <= arrayParent.length; i++) {
var actualRow = $(arrayParent[i])
var minutesInQueue = $(actualRow).find('.time_cell').text().substr(0,2)
var priorityVal = parseInt(minutesInQueue)
var actualRowTags = $( actualRow ).find('.tag').toArray()
$(actualRow).addClass('priorityRow')
for (var k=0; k <= actualRowTags.length; k++) {
let normalHolderTag = $(actualRowTags[k]).text().toLowerCase()
if (normalHolderTag === 'vip') {
priorityVal += 30
$(actualRow).attr('data-priority', priorityVal)
} else if ( normalHolderTag === 'rg' ) {
priorityVal += 20
$(actualRow).attr('data-priority', priorityVal)
} else if ( normalHolderTag === 'accountclosure' ) {
priorityVal += 10
$(actualRow).attr('data-priority', priorityVal)
} else {
$(actualRow).attr('data-priority', priorityVal)
}
//$(actualRow).find('.numbers_cell').text(priorityVal)
}
}
}
//Sorting Incoming Chats By Priority
function orderByPriority(container) {
myArray = container.find('.priorityRow')
var changed = false
myArray.sort(function(a,b){
contentA = parseInt( $(a).data('priority') )
contentB = parseInt( $(b).data('priority') )
if ( (contentB - contentA) * ( myArray.indexOf(b) - myArray.indexOf(a) ) > 0 ){
changed = true
}
return (contentB - contentA)
})
if(changed) {
$(sortedArray).prependTo( container )
} else{
console.log('No need To Sort')
}
}
setInterval(function () {
assignPriority( $incomingChatsRows )
orderByPriority( $incomingChatsRowsContainer )
}, 500)
}, 1000)
ОБНОВЛЕНИЕ:
myArray теперь является глобальной переменной, я добавил оператор IF, оценивающий результат функции сортировки и умножающий этот результат на индексы a, b. Если это значение больше 0, я изменяю значение моей измененной переменной на true, НО я получаю сообщение об ошибке myArray.indexOf is not a function.