2016-08-28 57 views
0

我已經創建了一個應該爲每頁分頁10個學生的程序。共有54名學生。爲什麼不能讀取「.appendChild」?頁面如何定義?

我已將所有學生listitems添加到對象數組中。

然後,我隱藏了學生的所有原始html,並根據點擊的分頁鏈接,它會顯示從對象數組中取出的適量學生。

出於某種原因,在我的displayPagination()函數中,顯示一個錯誤,表明我的包裝沒有被添加到頁面中,因此沒有任何程序會工作。它說「app.js:167 Uncaught TypeError:無法讀取未定義的屬性'appendChild'」。

不知道這裏發生了什麼?

請忽略我對底部搜索功能的評論。我還沒有實現。

//Problem: Shows too many people per page 
//Solution: Incorporate pagination and add search functionality 

'useStrict'; 


//Find total number of students 
var studentTotal = document.getElementsByClassName("student-item").length; 
var itemsToShowPerPage = 10; 

//empty array of objects for students 
var studentArray = []; 


//Call buildSearch() 
buildSearch(); 
//display initial page 
initialDisplay(); 


//Cach DOM elements for easy access 
var page = document.querySelector(".page"); 
var paginationLink = document.getElementsByClassName("pagination-link"); 
var studentList = document.querySelector(".student-list"); 

function studentShow(start, end) { 
    studentList.innerHTML = ''; 

    for(var i = start; i <= end; i++){ 
     var newStudent = displayStudents(studentArray[i]); 
     studentList.appendChild(newStudent); 
    } 
} 

//Calculate the number of pages needed 
function calculatePageCount() { 
    var pagesNeeded = Math.ceil(studentTotal/itemsToShowPerPage); 
    console.log("Amount of pages needed :" + pagesNeeded); 
    return pagesNeeded; 
} 

//builds search 
function buildSearch() { 
    var pageHeader = document.querySelector('.page-header'); 
    var searchWrap = document.createElement('div'); 
    var searchInput = document.createElement('input'); 
    var searchButton = document.createElement('button'); 

    searchWrap.classList.add('student-search'); 
    searchButton.classList.add('search-button'); 
    searchInput.setAttribute('placeholder', 'Search for students...'); 
    searchInput.classList.add('student-search-input'); 
    searchButton.textContent = ('Search'); 
    searchWrap.appendChild(searchInput); 
    searchWrap.appendChild(searchButton); 
    pageHeader.appendChild(searchWrap); 
} 

//create student object 
function studentObject(name, avatar, email, dateJoined) { 
    this.name = name; 
    this.avatar = avatar; 
    this.email = email; 
    this.dateJoined = dateJoined; 
} 

//filter students and create an array of objects 
function studentFilter() { 
    var student, name, avatar, email, dateJoined; 

    var studentList = document.querySelectorAll('.student-list')[0].children; 
    for(var i = 0; i < studentList.length; i++) { 
     avatar = studentList[i].children[0].children[0].src; 
     name = studentList[i].children[0].children[1].innerHTML; 
     email = studentList[i].children[0].children[2].innerHTML; 
     dateJoined = studentList[i].children[1].children[0].innerHTML; 

     //create new object 
     student = new studentObject(name,avatar, email, dateJoined); 

     //add each student into the array for later use 
     studentArray.push(student);  
    } 
} 

//construct html for student 
function displayStudents(student) { 
    var listItem, detailsDiv, joinedDetails, avatarImg, nameH, emailSpan, date; 

    //Create student list item 
    listItem = document.createElement('li'); 
    //add it's classes 
    listItem.classList.add('student-item'); 
    listItem.classList.add('cf'); 

    //create first div for student details 
    detailsDiv = document.createElement('div'); 
    //add it's class 
    detailsDiv.classList.add('student-details'); 

    //create the details to go into detailsDiv 
    avatarImg = document.createElement('img'); 
    avatarImg.src = student.avatar; 
    nameH = document.createElement('h3'); 
    nameH.innerHTML = student.name; 
    emailSpan = document.createElement('span'); 
    email.innerHTML = student.email; 
    //add their classes 
    avatarImg.classList.add('avatar'); 
    emailSpan.classList.add('email'); 

    //add details to detailsDiv 
    detailsDiv.appendChild(avatarImg); 
    detailsDiv.appendChild(emailSpan); 
    detailsDiv.appendChild(nameH); 

    //create second div for joinedDetails 
    joinedDetails = document.createElement('div'); 
    //add it's class 
    joinedDetails.classList.add('joined-details'); 

    //create date to put into joinedDetails 
    date = document.createElement('span'); 
    date.innerHTML = student.dateJoined; 
    //add it's class 
    date.classList.add('date'); 

    //add date to joinDetails 
    joinedDetails.appendChild(date); 

    //add divs to listItem 
    listItem.appendChild(detailsDiv); 
    listItem.appendChild(joinedDetails); 

    return listItem; 
} 


function displayPaginationLinks() { 
    var link, pagLink; 

    //create template 
    var wrapper = document.createElement('div'); 
    wrapper.classList.add('pagination'); 
    var pagList = document.createElement('ul'); 
    pagList.classList.add("pagination-links"); 
    wrapper.appendChild(pagList); 


    var pageCount = calculatePageCount(); 

    //add individual elements 
    for(var i = 1; i <= pageCount; i++) { 
     pagLink = document.createElement('li'); 
     link = document.createElement('a'); 
     link.innerHTML = i; 
     link.href = "#"; 
     pagLink.appendChild(link); 
     pagList.appendChild(pagLink); 
    } 

    //make first link 'active' 
    pagList.children[0].children[0].classList.add("active"); 
    //add to wrapper 
    wrapper.appendChild(pagList); 
    //add wrapper to page 
    page.appendChild(wrapper); 
} 

function paginate(event) { 
    event.preventDefault(); 

    //variables for 
    var start, end; 

    //reset link class 
    for(var i = 0; i < paginationLink.length; i++) { 
     paginationLink[i].className = "pagination-link"; 
    } 

    //THIS link's class will be active 
    this.classList.add('active'); 

    //show the right section of item lists 
    start = (this.innerHTML * 10) - 10; 
    end = (this.innerHTML * 10) - 1; 

    //make sure if end of list, only show the remaining few 
    if(end < studentArray.length){ 
     end = studentArray.length -1; 
    } 

    studentShow(start, end); 
} 



function initialDisplay() { 
    studentFilter(); 
    //displayStudents(studentArray); 
    if (calculatePageCount() > 1) { 
     displayPaginationLinks(); 
    } 
    //show first 10 students 
    studentShow(0, 9); 
} 


//Add search function 
    //Using progressive enhancement, add the student search markup as presented in the filters-example.html file to the index.html file. 
    //Make sure it's case insensitive 
    //User can search by name or e-mail address. Also partial matches 
    //Dynamically filter the student listings. 
    //Results should also be paginated. Don't use jQuery 
    //If no matches are found, add HTML message to say so 


//Event Listeners 
    //Search button 

    //Pagination 
    for(var i = 0; i < paginationLink.length; i++) { 
     paginationLink[i].addEventListener("click", paginate); 
    } 

下面是HTML:

<!doctype html> 
<html lang="en"> 
    <head> 
    <meta charset="utf-8"/> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/> 
    <title>Students</title> 
    <link rel="stylesheet" href="css/reset.css"> 
    <link rel="stylesheet" href="css/design.css"> 
    </head> 
    <body> 
    <div class="page"> 
     <div class="page-header cf"> 
     <h2>Students</h2> 
     </div> 
     <ul class="student-list"> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/women/67.jpg"> 
       <h3>iboya vat</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 07/15/15</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/75.jpg"> 
       <h3>aapo niskanen</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 06/15/12</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/34.jpg"> 
       <h3>phillip cox</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 09/11/14</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/women/38.jpg"> 
       <h3>zilda moreira</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 07/15/15</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/women/23.jpg"> 
       <h3>lilou le gall</h3> 
       <span class="email">lilou.le [email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 06/16/13</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/women/94.jpg"> 
       <h3>lucy hall</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 09/11/16</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/women/24.jpg"> 
       <h3>mark colin</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 01/14/14</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/women/14.jpg"> 
       <h3>sara alves</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 07/19/16</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/49.jpg"> 
       <h3>ramon macrae</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 05/13/12</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/15.jpg"> 
       <h3>connor taylor</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 05/18/14</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/11.jpg"> 
       <h3>aymeric morel</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 06/13/13</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/49.jpg"> 
       <h3>lorenz otto</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 05/11/14</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/29.jpg"> 
       <h3>karl williamson</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 01/12/14</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/34.jpg"> 
       <h3>ouassim heering</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 01/18/12</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/91.jpg"> 
       <h3>roberto molina</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 06/13/15</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/28.jpg"> 
       <h3>jordan hubert</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 06/13/15</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/29.jpg"> 
       <h3>melvin baker</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 09/18/14</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/26.jpg"> 
       <h3>everett gordon</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 06/17/15</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/82.jpg"> 
       <h3>aiden ma</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 07/18/12</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/62.jpg"> 
       <h3>florent gerard</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 02/12/13</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/women/96.jpg"> 
       <h3>amber chen</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 07/12/12</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/women/9.jpg"> 
       <h3>alexandra davies</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 05/11/13</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/57.jpg"> 
       <h3>sergio cole</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 02/17/15</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/98.jpg"> 
       <h3>edgar dixon</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 06/17/11</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/94.jpg"> 
       <h3>kirk myers</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 09/17/15</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/women/28.jpg"> 
       <h3>ani hesseling</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 08/14/16</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/women/24.jpg"> 
       <h3>victoire bonnet</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 05/13/16</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/44.jpg"> 
       <h3>marcos morales</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 01/12/12</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/75.jpg"> 
       <h3>nils neumann</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 03/11/12</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/women/86.jpg"> 
       <h3>emily harrison</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 07/18/15</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/41.jpg"> 
       <h3>matthew fortin</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 03/18/15</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/women/32.jpg"> 
       <h3>charlotte steward</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 02/18/11</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/3.jpg"> 
       <h3>marceau rodriguez</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 07/13/14</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/91.jpg"> 
       <h3>hudson anderson</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 09/12/15</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/33.jpg"> 
       <h3>warren phillips</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 01/11/12</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/41.jpg"> 
       <h3>leo niva</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 09/14/15</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/3.jpg"> 
       <h3>hani prevoo</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 01/11/15</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/women/79.jpg"> 
       <h3>veronica rodriguez</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 07/17/12</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/41.jpg"> 
       <h3>ginestal das neves</h3> 
       <span class="email">ginestal.das [email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 06/19/12</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/63.jpg"> 
       <h3>devon barnes</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 09/19/14</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/women/10.jpg"> 
       <h3>elsa lahti</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 04/15/12</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/women/12.jpg"> 
       <h3>soline leclercq</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 05/12/14</span> 
      </div> 
     </li> 
     <li class="student-item cf"> 
      <div class="student-details"> 
       <img class="avatar" src="https://randomuser.me/api/portraits/thumb/men/89.jpg"> 
       <h3>henri kruse</h3> 
       <span class="email">[email protected]</span> 
      </div> 
      <div class="joined-details"> 
        <span class="date">Joined 05/14/13</span> 
      </div> 
     </li> 
     </ul> 
    </div> 
    </body> 
    <script type="text/javascript" src="js/app.js"></script> 
</html> 
+0

這不是一個簡單的例子。使用F12並在每個appendChild前設置一個斷點並檢查該變量。將結果添加到您的問題。 –

+0

我沒有在這個(MacBook)f12。 – gloopit

+0

其他人應該僅僅因爲找不到調試器熱鍵而調試你的代碼? ('Command-Option-C'應該打開控制檯,afaik) –

回答

1

這個問題似乎任何分配給page變量之前調用initialDisplay - 因此,page是不確定的,當displayPaginationLinks電話page.appendChild

+1

你幾秒鐘就打敗了我。 +1 – Makyen

+0

該死!謝謝。愚蠢的錯誤。 – gloopit

相關問題