i have a Problem with this sort function. In mozilla it works fine, but when i try Chrome or IE it does nothing. I hope someone can help.
I found something about operators for array.sort in mozilla https://allenpike.com/2009/arraysort-browser-differences but it did not help
https://jsfiddle.net/dojpw86a/1/
html
<div class="sortcon">
<button id="offerdown" onClick="$('#allbdcontainer .bdcontainer').sort(sortbyoffer).appendTo('#allbdcontainer')">
sortofferup
</button>
<button id="offerup" onClick="$('#allbdcontainer .bdcontainer').sort(sortbyoffer).appendTo('#allbdcontainer')">
sortofferdown
</button>
<div id="allbdcontainer">
<div class="bdcontainer">
<div class="clear">
</div>
<div class="bdshowfromdate">01.11.2018
</div>
<div class="seperator">-
</div>
<div class="bdshowtodate">31.12.2025
</div>
<div class="bdshowoffer">P3
</div>
</div>
<div class="bdcontainer">
<div class="clear">
</div>
<div class="bdshowfromdate">01.11.2018
</div>
<div class="seperator">-
</div>
<div class="bdshowtodate">31.12.2019
</div>
<div class="bdshowoffer">P1D
</div>
</div>
<div class="bdcontainer">
<div class="clear">
</div>
<div class="bdshowfromdate">15.10.2018
</div>
<div class="seperator">-
</div>
<div class="bdshowtodate">20.10.2018
</div>
<div class="bdshowoffer">P2V
</div>
</div>
<div class="bdcontainer">
<div class="clear">
</div>
<div class="bdshowfromdate">15.10.2018
</div>
<div class="seperator">-
</div>
<div class="bdshowtodate">28.10.2018
</div>
<div class="bdshowoffer">P2V
</div>
</div>
<div class="bdcontainer">
<div class="clear">
</div>
<div class="bdshowfromdate">07.08.2019
</div>
<div class="seperator">-
</div>
<div class="bdshowtodate">04.09.2019
</div>
<div class="bdshowoffer">P1D
</div>
</div>
<div class="bdcontainer">
<div class="clear">
</div>
<div class="bdshowfromdate">22.03.2020
</div>
<div class="seperator">-
</div>
<div class="bdshowtodate">25.03.2020
</div>
<div class="bdshowoffer">P2I
</div>
</div>
</div>
function:
function sortbyoffer(a, b) {
if(event.target.id == 'offerup')
{
return $(a).find(".bdshowoffer").text() < $(b).find(".bdshowoffer").text();
}
else if(event.target.id == 'offerdown')
{
return $(a).find(".bdshowoffer").text() > $(b).find(".bdshowoffer").text();
}
}
Here's the answer without the array, as @natiole asked for in a comment.
function sortList(sortDirection) {
let list = $('.bdcontainer')
list.sort((a, b) => {
if ($(a).find('.bdshowoffer').text() < $(b).find('.bdshowoffer').text()) {
return -1 * sortDirection
}
if ($(a).find('.bdshowoffer').text() > $(b).find('.bdshowoffer').text()) {
return 1 * sortDirection
}
return 0
})
return list
}
function renderList(list, container) {
let htmlString = ''
// jQuery .each()
list.each((i, el) => {
htmlString += $(el).prop('outerHTML')
})
container
.empty()
.append(htmlString)
}
jQuery(document).ready(function($) {
$('#offerdown').on('click', function(e) {
renderList(sortList(1), $('#allbdcontainer'))
})
$('#offerup').on('click', function(e) {
renderList(sortList(-1), $('#allbdcontainer'))
})
})
.bdshowfromdate,
.seperator,
.bdshowtodate,
.bdshowoffer {
float: left;
line-height: 30px;
margin-right: 68px;
}
.bdcontainer {
width: 500px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="sortcon">
<button id="offerdown">
sortofferup
</button>
<button id="offerup">
sortofferdown
</button>
<div id="allbdcontainer">
<div class="bdcontainer">
<div class="clear">
</div>
<div class="bdshowfromdate">01.11.2018
</div>
<div class="seperator">-
</div>
<div class="bdshowtodate">31.12.2025
</div>
<div class="bdshowoffer">P3
</div>
</div>
<div class="bdcontainer">
<div class="clear">
</div>
<div class="bdshowfromdate">01.11.2018
</div>
<div class="seperator">-
</div>
<div class="bdshowtodate">31.12.2019
</div>
<div class="bdshowoffer">P1D
</div>
</div>
<div class="bdcontainer">
<div class="clear">
</div>
<div class="bdshowfromdate">15.10.2018
</div>
<div class="seperator">-
</div>
<div class="bdshowtodate">20.10.2018
</div>
<div class="bdshowoffer">P2V
</div>
</div>
<div class="bdcontainer">
<div class="clear">
</div>
<div class="bdshowfromdate">15.10.2018
</div>
<div class="seperator">-
</div>
<div class="bdshowtodate">28.10.2018
</div>
<div class="bdshowoffer">P2V
</div>
</div>
<div class="bdcontainer">
<div class="clear">
</div>
<div class="bdshowfromdate">07.08.2019
</div>
<div class="seperator">-
</div>
<div class="bdshowtodate">04.09.2019
</div>
<div class="bdshowoffer">P1D
</div>
</div>
<div class="bdcontainer">
<div class="clear">
</div>
<div class="bdshowfromdate">22.03.2020
</div>
<div class="seperator">-
</div>
<div class="bdshowtodate">25.03.2020
</div>
<div class="bdshowoffer">P2I
</div>
</div>
</div>
It's a correct solution, but I think the previous one is better (e.g. handling arrays in JS is faster, less dependent on jQuery, etc.).