【问题标题】:sort function works only in mozilla排序功能仅适用于 Mozilla
【发布时间】:2019-06-12 13:55:24
【问题描述】:

我对这个排序功能有疑问。 在 mozilla 中它工作正常,但是当我尝试 Chrome 或 IE 时它什么也不做。 我希望有人可以提供帮助。

我在 mozilla 中找到了有关 array.sort 运算符的一些信息 https://allenpike.com/2009/arraysort-browser-differences 但它没有帮助

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

【问题讨论】:

    标签: jquery html google-chrome sorting mozilla


    【解决方案1】:

    这是没有数组的答案,正如@natiole 在评论中要求的那样。

    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>

    这是一个正确的解决方案,但我认为前一个更好(例如在JS中处理数组更快,更少依赖jQuery等)。

    【讨论】:

      【解决方案2】:

      这是您的问题的解决方案 - 尽管稍作修改。

      重点是我创建了一个对象数组来保存表的所有数据,并创建了显示这些数据的必要函数。

      我还添加了切换功能,它与其他 ASC / DESC 排序一起使用。

      // adding toggle function
      let toggleDirection = 1
      // data array
      let dataArray = [{
          bdshowfromdate: '01.11.2018',
          bdshowtodate: '31.12.2025',
          bdshowoffer: 'P3'
        },
        {
          bdshowfromdate: '01.11.2018',
          bdshowtodate: '31.12.2019',
          bdshowoffer: 'P1D'
        },
        {
          bdshowfromdate: '15.10.2018',
          bdshowtodate: '20.10.2018',
          bdshowoffer: 'P2V'
        },
        {
          bdshowfromdate: '15.10.2018',
          bdshowtodate: '28.10.2018',
          bdshowoffer: 'P2V'
        },
        {
          bdshowfromdate: '07.08.2019',
          bdshowtodate: '04.09.2019',
          bdshowoffer: 'P1D'
        },
        {
          bdshowfromdate: '22.03.2020',
          bdshowtodate: '25.03.2020',
          bdshowoffer: 'P2I'
        },
      ]
      
      // generating the HTML to be displayed as the table
      function tableHtml(tableData) {
        let ret = ''
        tableData.forEach(item => {
          ret += '<div class="bdcontainer">'
          ret += '<div class="clear"></div>'
          ret += `<div class="bdshowfromdate">${item.bdshowfromdate}</div>`
          ret += '<div class="seperator">-</div>'
          ret += `<div class="bdshowtodate">${item.bdshowtodate}</div>`
          ret += `<div class="bdshowoffer">${item.bdshowoffer}</div>`
          ret += '</div>'
        })
        return ret
      }
      
      // adding the generated HTML to the DOM
      function refreshTable(tableData) {
        const htmlString = tableHtml(tableData)
        jQuery("#allbdcontainer")
          .empty()
          .append(htmlString)
      }
      
      // sorting function
      function sortTable(tableData, sortDirection) {
        tableData.sort((a, b) => {
          if (a.bdshowoffer < b.bdshowoffer) {
            return -1 * sortDirection
          }
          if (a.bdshowoffer > b.bdshowoffer) {
            return 1 * sortDirection
          }
        })
        return tableData
      }
      
      jQuery(document).ready(function($) {
        // initial display of data
        refreshTable(dataArray)
      
        $('#offerdown').on('click', function(e) {
          dataArray = sortTable(dataArray, 1)
          refreshTable(dataArray)
          toggleDirection = -1
        })
        $('#offerup').on('click', function(e) {
          dataArray = sortTable(dataArray, -1)
          refreshTable(dataArray)
          toggleDirection = 1
        })
        $('#toggle').on('click', function(e) {
          dataArray = sortTable(dataArray, toggleDirection)
          refreshTable(dataArray)
          toggleDirection = toggleDirection * -1
        })
      
      
      })
      .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">
        sortofferdown
        </button>
        <button id="offerup">
        sortofferup
        </button>
        <button id="toggle">
        toggleSorting
        </button>
      
        <div id="allbdcontainer"></div>

      有了这个解决方案

      • 更换表格模板更方便

      • 向表中添加新属性更容易

      • 为不同的属性添加排序功能更容易

      • 处理数据更容易

      • 扩展性更好

      【讨论】:

      • 感谢您的回答。有没有办法在没有数组的情况下做到这一点,因为在我的情况下,表的数据是通过 php 创建的,我无权更改它。我可以从 html 中使用 javascript 获取所有数据,打破并附加所有内容以构建新表,但我认为这不是最好的解决方案。我仍然很好奇为什么我的函数适用于 mozilla 而不是 Chrome 和 IE。
      • 一个问题是你应该把它放在 jQuery(document).ready() 中,然后你会看到一条错误消息(有些问题与职能)。我添加了另一个答案 - 没有数组处理。但我仍然建议你朝着这个方向前进——也许你可以将 PHP 更改为 echo JS 数组或其他东西。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2015-10-28
      • 1970-01-01
      • 2011-12-16
      • 2017-12-22
      相关资源
      最近更新 更多