javascript - 如何使用成品排序功能

标签 javascript css json ajax sorting

我按字母顺序做了一个排序函数。我通过“console.log()”检查她的工作。我有点反对。我有个问题。当您选择“选择>选项”时如何使该功能起作用。在“console.log()”中它显示对象已排序。当您选择“选择”>“按字母顺序”页面上的 block 时,我想按字母顺序重建。怎么做?

function getData(url, callback) {
  xmlhttp = new XMLHttpRequest();
  xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
      try {
        var data = JSON.parse(xmlhttp.responseText);
      } catch (err) {
        console.log(err.message + " in " + xmlhttp.responseText);
        return;
      }
      callback(data);
    }
  };

  xmlhttp.open("GET", url, true);
  xmlhttp.send();
}

var results = [];
getData('https://api.randomuser.me/1.0/?results=50&nat=gb,us&inc=gender,name,location,email,phone,picture',
  function(data) {

    var html = '';
    for (var i = 0; i < data["results"].length; i++) {
      var fullName = data["results"][i]["name"]["title"] + ' ' + data["results"][i]["name"]["first"] + ' ' + data["results"][i]["name"]["last"],
        name = data["results"][i]["name"]["first"] + ' ' + data["results"][i]["name"]["last"];
        img = data["results"][i]["picture"]["large"],
        imgM = data["results"][i]["picture"]["medium"];
      html += '<div class="col-md-2 block__user_on" onclick="myModal(this.id)" id="' + [i] + '"> ';
      html += '<img class="large" src="' + img + '" title="' + name + '"/>';
      html += '<img class="medium" id="medium" src="' + imgM + '" title="' + name + '"/>';
      html += '<p class="block__user_on-capitalize name">' + name + '</p>';
      html += '<p class="block__user_on-capitalize fullName">' + fullName + '</p>';
      html += '</div>'; 
    }
    document.getElementById("user").innerHTML = html;
    results = data["results"];

//SORT
    console.log( 
        results.sort(function (obj1, obj2){
            if (obj1.name.first < obj2.name.first) return -1;
            if (obj1.name.first > obj2.name.first) return 1;
            return 0;}
        )
    );

        }
    );

function imgMedium(){
    var large = document.getElementsByClassName("large");
    for (i = 0; i < large.length; i++) {
        large[i].style.display = 'none';
    }
    var medium = document.getElementsByClassName("medium");
    for (i = 0; i < medium.length; i++) {
        medium[i].style.display = 'block';
    }
}

function fullName(){
    var name = document.getElementsByClassName("name");
    for (i = 0; i < name.length; i++) {
        name[i].style.display = 'none';
    }
    var fullName = document.getElementsByClassName("fullName");
    for (i = 0; i < fullName.length; i++) {
        fullName[i].style.display = 'block';
    }
}


function myModal(index) {

    var data = results[index];
    document.getElementById("Modal").style.display = "block";
    var modal = '',
        name = data.name.title + ' ' + data.name.first + ' ' + data.name.last,
        img = data.picture.large,
        street = data.location.street,
        state = data.location.state,
        email = data.email,
        phone = data.phone;

    modal += '<div > ';
    modal += '<img src="' + img + '" title="' + name + '"/>';
    modal += '<p class="block__user_on-capitalize block__user_on_bold">' + name + '</p>';
    modal += '<p class="block__user_on-capitalize"><i class="fa fa-street-view" aria-hidden="true"></i>' + ' ' + street + '</p>';
    modal += '<p class="block__user_on-capitalize"><i class="fa fa-home" aria-hidden="true"></i>' + ' ' + state + '</p>';
    modal += '<p class="block__user_modal_email"><i class="fa fa-envelope-o" aria-hidden="true"></i>' + ' <a href="mailto:' + email + '"> ' + email + ' </a></p>';
    modal += '<p class="block__user_on-capitalize"><i class="fa fa-phone" aria-hidden="true"></i>' + ' <a href="tel:' + phone + '">'+ phone +'</a></p>';
    modal += '</div>';  

    document.getElementById("userModal").innerHTML = modal;

}
function closeModal() {
    document.getElementById("Modal").style.display = "none";
}
body{
    background: #eee;
}
a{
    color: #fff !important;
}
.block__user_on{
    border: 1px solid #000;
    padding: 5px;
    margin: 5px;
    background: #e2e2e2;
    display: flex;
    flex-direction: column;
    align-items: center;
    cursor: pointer;
}
.block__user_on:hover{
    border: 1px solid #f39c12;
}
.block__user{
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
}
.block__user_on-capitalize{
    text-transform: capitalize;
}
.block__user_on-capitalize:hover, .block__user_modal_email:hover{
    text-decoration: underline;
    cursor: pointer;
}

.block__user_on_bold{
    font-weight: 700;
}
.blok__user_background_modal{
    width: 100%;
    height: 100%;
    display: none;
}
.block__user_modal{
    position: fixed;
    display: none;
    top: 10vh;
    right: 0;
    left: 0;
    margin: 0 auto;
    width: 300px;
    height: auto;
    border: 1px solid #000;
    background: #708090;
    color: #fff;
    padding: 10px;
}
.block__user_modal_close{
    position: absolute;
    display: block;
    right: 0;
    top: 0;
    padding: 0 5px;
    color: #fff;
    cursor: pointer;
}
.block__user_modal_close:hover{
   background: #eee;
   color: #000;
   border-radius: 10px;
}
.block__sort{
    background: #e2e2e2;
    padding: 10px 0;
    border: 1px solid;
}
.block__sort ul{
    display: flex;
    justify-content: space-around;
    list-style-type: none;
}
.block__sort ul li a{
    color: #000 !important;
    cursor: pointer;
    border: 1px solid #000;
    padding: 5px;
    text-decoration: none;
}
.block__sort ul li a:hover{
     border: 1px solid #f39c12;
}
.large, .name{
    display: block;
}
.medium, .fullName{
    display: none;
}
<html lang="en">
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
    <meta charset="UTF-8">
    <title>Api random</title>
    <link rel="stylesheet" href="css/style.css">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <script type="text/javascript" src="js/script.js"></script>
</head>
<body>
    <div class="container-fluid" id="container-fluid" >
        <div class="row">
            <div class="container">
                <div class="block__sort">
                    <ul>
                        <li>Filter:</li>
                        <li><a onclick="imgMedium(this)">picture.medium</a></li>
                        <li><a onclick="fullName(this)">name format</a></li>
                        <li><a onclick="reverseSort(this)">sort</a></li>
                        <li><select name="" id="">
                            <option disabled selected>order</option>
                            <option>In alphabet order</option>
                            <option onclick="reverseSort(this)">In reverse order</option>
                        </select></li>
                    </ul>
                </div>
                <div class="row">
                    <div class="block__user" id="user">
                    </div>
                    <div class="block__user_modal" id="Modal">
                        <span class="block__user_modal_close" id="closeModal" onclick="closeModal(this)"><i class="fa fa-times" aria-hidden="true"></i></span>
                        <div id="userModal"></div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>

或者 at codepen

最佳答案

排序处理程序应该移动到全局范围并且排序按钮应该能够在单击时调用它。为了在 ajax 加载或排序时呈现内容,我将页面呈现相关操作移动到名为“renderResults”的函数下。

function getData(url, callback) {
  xmlhttp = new XMLHttpRequest();
  xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
      try {
        var data = JSON.parse(xmlhttp.responseText);
      } catch (err) {
        console.log(err.message + " in " + xmlhttp.responseText);
        return;
      }
      callback(data);
    }
  };

  xmlhttp.open("GET", url, true);
  xmlhttp.send();
}

function renderResults(data) {

  var html = '';
  for (var i = 0; i < data["results"].length; i++) {
    var fullName = data["results"][i]["name"]["title"] + ' ' + data["results"][i]["name"]["first"] + ' ' + data["results"][i]["name"]["last"],
      name = data["results"][i]["name"]["first"] + ' ' + data["results"][i]["name"]["last"];
    img = data["results"][i]["picture"]["large"],
      imgM = data["results"][i]["picture"]["medium"];
    html += '<div class="col-md-2 block__user_on" onclick="myModal(this.id)" id="' + [i] + '"> ';
    html += '<img class="large" src="' + img + '" title="' + name + '"/>';
    html += '<img class="medium" id="medium" src="' + imgM + '" title="' + name + '"/>';
    html += '<p class="block__user_on-capitalize name">' + name + '</p>';
    html += '<p class="block__user_on-capitalize fullName">' + fullName + '</p>';
    html += '</div>';
  }
  document.getElementById("user").innerHTML = html;
  results = data["results"];

}

var results = [];
getData('https://api.randomuser.me/1.0/?results=50&nat=gb,us&inc=gender,name,location,email,phone,picture', renderResults);

//SORT
function sort() {
  var reverse = document.getElementById('order').selectedIndex == 2;
  results.sort(function(obj1, obj2) {
    var ret = 0;
    if (obj1.name.first < obj2.name.first) ret = -1;
    if (obj1.name.first > obj2.name.first) ret = 1;
    return ret * (reverse ? -1 : 1);
  });
  console.log(results);
  renderResults({
    results: results
  });
}

function imgMedium() {
  var large = document.getElementsByClassName("large");
  for (i = 0; i < large.length; i++) {
    large[i].style.display = 'none';
  }
  var medium = document.getElementsByClassName("medium");
  for (i = 0; i < medium.length; i++) {
    medium[i].style.display = 'block';
  }
}

function fullName() {
  var name = document.getElementsByClassName("name");
  for (i = 0; i < name.length; i++) {
    name[i].style.display = 'none';
  }
  var fullName = document.getElementsByClassName("fullName");
  for (i = 0; i < fullName.length; i++) {
    fullName[i].style.display = 'block';
  }
}


function myModal(index) {

  var data = results[index];
  document.getElementById("Modal").style.display = "block";
  var modal = '',
    name = data.name.title + ' ' + data.name.first + ' ' + data.name.last,
    img = data.picture.large,
    street = data.location.street,
    state = data.location.state,
    email = data.email,
    phone = data.phone;

  modal += '<div > ';
  modal += '<img src="' + img + '" title="' + name + '"/>';
  modal += '<p class="block__user_on-capitalize block__user_on_bold">' + name + '</p>';
  modal += '<p class="block__user_on-capitalize"><i class="fa fa-street-view" aria-hidden="true"></i>' + ' ' + street + '</p>';
  modal += '<p class="block__user_on-capitalize"><i class="fa fa-home" aria-hidden="true"></i>' + ' ' + state + '</p>';
  modal += '<p class="block__user_modal_email"><i class="fa fa-envelope-o" aria-hidden="true"></i>' + ' <a href="mailto:' + email + '"> ' + email + ' </a></p>';
  modal += '<p class="block__user_on-capitalize"><i class="fa fa-phone" aria-hidden="true"></i>' + ' <a href="tel:' + phone + '">' + phone + '</a></p>';
  modal += '</div>';

  document.getElementById("userModal").innerHTML = modal;

}

function closeModal() {
  document.getElementById("Modal").style.display = "none";
}
body {
  background: #eee;
}
a {
  color: #fff !important;
}
.block__user_on {
  border: 1px solid #000;
  padding: 5px;
  margin: 5px;
  background: #e2e2e2;
  display: flex;
  flex-direction: column;
  align-items: center;
  cursor: pointer;
}
.block__user_on:hover {
  border: 1px solid #f39c12;
}
.block__user {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}
.block__user_on-capitalize {
  text-transform: capitalize;
}
.block__user_on-capitalize:hover,
.block__user_modal_email:hover {
  text-decoration: underline;
  cursor: pointer;
}
.block__user_on_bold {
  font-weight: 700;
}
.blok__user_background_modal {
  width: 100%;
  height: 100%;
  display: none;
}
.block__user_modal {
  position: fixed;
  display: none;
  top: 10vh;
  right: 0;
  left: 0;
  margin: 0 auto;
  width: 300px;
  height: auto;
  border: 1px solid #000;
  background: #708090;
  color: #fff;
  padding: 10px;
}
.block__user_modal_close {
  position: absolute;
  display: block;
  right: 0;
  top: 0;
  padding: 0 5px;
  color: #fff;
  cursor: pointer;
}
.block__user_modal_close:hover {
  background: #eee;
  color: #000;
  border-radius: 10px;
}
.block__sort {
  background: #e2e2e2;
  padding: 10px 0;
  border: 1px solid;
}
.block__sort ul {
  display: flex;
  justify-content: space-around;
  list-style-type: none;
}
.block__sort ul li a {
  color: #000 !important;
  cursor: pointer;
  border: 1px solid #000;
  padding: 5px;
  text-decoration: none;
}
.block__sort ul li a:hover {
  border: 1px solid #f39c12;
}
.large,
.name {
  display: block;
}
.medium,
.fullName {
  display: none;
}
<html lang="en">

<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
  <meta charset="UTF-8">
  <title>Api random</title>
  <link rel="stylesheet" href="css/style.css">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script type="text/javascript" src="js/script.js"></script>
</head>

<body>
  <div class="container-fluid" id="container-fluid">
    <div class="row">
      <div class="container">
        <div class="block__sort">
          <ul>
            <li>Filter:</li>
            <li><a onclick="imgMedium(this)">picture.medium</a>
            </li>
            <li><a onclick="fullName(this)">name format</a>
            </li>
            <li><a onclick="sort(this)">sort</a>
            </li>
            <li>
              <select onchange="sort()" name="" id="order">
                <option disabled selected>order</option>
                <option>In alphabet order</option>
                <option>In reverse order</option>
              </select>
            </li>
          </ul>
        </div>
        <div class="row">
          <div class="block__user" id="user">
          </div>
          <div class="block__user_modal" id="Modal">
            <span class="block__user_modal_close" id="closeModal" onclick="closeModal(this)"><i class="fa fa-times" aria-hidden="true"></i></span>
            <div id="userModal"></div>
          </div>
        </div>
      </div>
    </div>
  </div>
</body>

</html>

关于javascript - 如何使用成品排序功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42190406/

相关文章:

c# - 按键分组对象

java - 如何将数组追加到已经有数组的json文件中?

javascript - 使用常用方法将“替换为”在 JavaScript Azure Function 中不起作用

javascript - 防止 jQuery 验证插件在可见时提交表单

javascript - 我应该如何将原型(prototype)初始化转换为 ES6

css - 在某些系统上网页背景图像的渐变不稳定时遇到问题

html - 焦点上的按钮轮廓出现在左浮动的同级按钮后面的解决方法

javascript - 使用 JS 在 Firefox 中检测 Windows XP

javascript - 从数组更改徽章颜色

json - Grails JSON字段丢失