Search code examples
jqueryhtmlgoogle-chromesortingmozilla

sort function works only in mozilla


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();
  }
}

Solution

  • 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.).