2017-05-28 58 views
0

我正在研究freecodecamp的維基百科查看器項目。我有一個工作的例子,但有幾件事我不知道該怎麼做。如何將點擊和keydown綁定到Vanilla的輸入字段JavaScript

首先,我該如何執行一些AJAX請求,方法是在輸入字段中輸入內容並按下回車鍵或點擊按鈕?

接下來,當我嘗試在輸入字段中輸入並按Enter時,結果顯示在網頁中。但是,當我嘗試輸入並再次輸入時,新結果不顯示,但之前的結果消失,我必須再次輸入並再次按Enter才能獲得新結果。

我知道那裏使用jQuery的其他職位,我也不明白,不想在普通的JavaScript中使用jQuery。

var url = 'https://en.wikipedia.org/w/api.php?action=opensearch&datatype=json&limit=10&origin=*&search='; 
 
var inputSearch = document.myForm.search; 
 
var searchBtn = document.myForm.searchBtn; 
 
var list = document.getElementById("list"); 
 
var random = document.getElementsByClassName('random')[0]; 
 

 
random.addEventListener("click" , function(){ 
 
    window.open("https://en.wikipedia.org/wiki/Special:Random"); 
 
}); 
 

 
function requestData (e) { 
 
    var inputStr = e.target.value; 
 
    var request = new XMLHttpRequest(); 
 
    request.onreadystatechange = function() { 
 
    if (request.readyState === 4) { 
 
     if (request.status === 200) { 
 
     var dataObj = JSON.parse(request.responseText); 
 
     var titles = dataObj[1]; 
 
     var descriptions = dataObj[2]; 
 
     var links = dataObj[3]; 
 
     document.myForm.innerHTML += "<h2><span>" + links.length + "</span> results for \"" + "<span>" + inputStr + "</span>" +"\" </h2>"; 
 
     list.innerHTML = ""; 
 
     for (var i = 0; i < titles.length; i++) { 
 
      var li = "<li><a target='_blank' href=" + links[i] + ">" + titles[i] + "</a></li>"; 
 
      list.innerHTML += li; 
 
     } 
 
     } 
 
     else { 
 
     console.log("Server responded with following error code : " + request.status); 
 
     } 
 
    } 
 
    }; 
 
    
 
    if (e.keyCode === 13) { 
 
     console.log(e.type); 
 
     request.open("GET" , url + inputStr); 
 
     request.send(null); 
 
     e.preventDefault(); 
 
    } 
 

 
} 
 

 
inputSearch.addEventListener("keydown" , requestData); 
 
searchBtn.addEventListener("click" , requestData);
/* http://meyerweb.com/eric/tools/css/reset/ 
 
    v2.0 | 20110126 
 
    License: none (public domain) 
 
*/ 
 

 
html, body, div, span, applet, object, iframe, 
 
h1, h2, h3, h4, h5, h6, p, blockquote, pre, 
 
a, abbr, acronym, address, big, cite, code, 
 
del, dfn, em, img, ins, kbd, q, s, samp, 
 
small, strike, strong, sub, sup, tt, var, 
 
b, u, i, center, 
 
dl, dt, dd, ol, ul, li, 
 
fieldset, form, label, legend, 
 
table, caption, tbody, tfoot, thead, tr, th, td, 
 
article, aside, canvas, details, embed, 
 
figure, figcaption, footer, header, hgroup, 
 
menu, nav, output, ruby, section, summary, 
 
time, mark, audio, video { 
 
\t margin: 0; 
 
\t padding: 0; 
 
\t border: 0; 
 
\t font-size: 100%; 
 
\t font: inherit; 
 
\t vertical-align: baseline; 
 
} 
 
/* HTML5 display-role reset for older browsers */ 
 
article, aside, details, figcaption, figure, 
 
footer, header, hgroup, menu, nav, section { 
 
\t display: block; 
 
} 
 
body { 
 
\t line-height: 1; 
 
} 
 
ol, ul { 
 
\t list-style: none; 
 
} 
 
blockquote, q { 
 
\t quotes: none; 
 
} 
 
blockquote:before, blockquote:after, 
 
q:before, q:after { 
 
\t content: ''; 
 
\t content: none; 
 
} 
 
table { 
 
\t border-collapse: collapse; 
 
\t border-spacing: 0; 
 
} 
 

 
/* CSS reset ends here */ 
 

 
body { 
 
\t font-size: 16px; 
 
\t font-family: 'Oxygen', sans-serif; 
 
\t 
 
} 
 

 
.container-wrapper { 
 
\t margin: 0 auto; 
 
\t text-align: center; 
 
\t height: 100vh; 
 

 
} 
 

 
header { 
 
\t /*background-color: #fc3e5b;*/ 
 
\t padding: 80px 0; 
 
} 
 

 
header h1 { 
 
\t font-family: 'Anton', sans-serif; 
 
\t font-size: 70px; 
 
\t padding: 30px 0 80px 0; 
 
\t color: #fc3e5b; 
 
} 
 

 
form input , form button { 
 
\t padding: 10px 8px; 
 
\t font-size: 22px; 
 
\t border: 1px solid #fc3e5b; 
 
\t outline: 0; 
 
\t display: inline; 
 
\t margin: 0; 
 
} 
 

 
form button { 
 
\t background-color: #fc3e5b; 
 
\t color: #fff; 
 
} 
 

 
h2 { 
 
\t font-size: 25px; 
 
\t margin-top: 32px; 
 
} 
 

 
h2 span { 
 
\t font-weight:bold; 
 
\t color: #fc3e5b; 
 
} 
 
.random { 
 
\t padding: 22px 7px; 
 
\t border-radius: 100%; 
 
\t margin: 20px 0 15px 0; 
 
} 
 

 
.random:hover { 
 
\t border: 5px solid #fc3e6b; 
 
} 
 

 
#list { 
 
\t width: 75%; 
 
\t margin: 0 auto; 
 
} 
 

 
#list li { 
 
\t padding: 16px 8px; 
 
\t background-color: #fc3e5b; 
 
\t margin: 12px 0; 
 
\t text-align: left; 
 
\t font-size: 22px; 
 
} 
 

 
#list li a { 
 
\t text-decoration: none; 
 
\t color: #fff; 
 
}
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <meta charset="utf-8"> 
 
    <meta name="viewport" content="width=device-width"> 
 
    <title> Wikipedia Viewer </title> 
 
    <link href="https://fonts.googleapis.com/css?family=Anton|Oxygen" rel="stylesheet"> 
 
    <link rel="stylesheet" href="wikipedia.css"> 
 
</head> 
 
<body> 
 
    
 
    <div class="container-wrapper"> 
 
    \t <header> 
 
    \t <h1> Wikipedia Viewer </h1> 
 
\t <form action="" name="myForm"> 
 
\t \t <input type="text" name="search" /><button name="searchBtn">Search</button> 
 
\t \t <br> 
 
\t \t <button name="btnRandom" class="random"> Random<br>Article </button> 
 
\t </form> 
 
\t </header> 
 
\t 
 
\t <div class="container"> 
 
\t  <ul id="list"></ul> 
 
\t </div> 
 
    </div> 
 

 
    <script src="wikipedia.js"></script> 
 
</body> 
 
</html>

+0

是您的腳本從服務器返回什麼? –

+0

是的,我得到了我正在渲染到頁面中的響應json。它只是我在帖子中提到的問題。 – knight

回答

1

我已經更新了你的代碼,看到這個搗鼓工作代碼Ajax call on click of button

檢查它是否是根據你的需要的工作。

下面是我對你的代碼進行更改名單: -

  • 我已經改變了「的keydown」事件「的keyup」事件,因爲 「的keydown」我們沒有收到按下鍵的值。
  • 我已經分開了功能調用搜索按鈕 的點擊事件和輸入按鍵事件,使其稍微清晰。
  • 我已經給了id來搜索輸入框來獲得它的值「requestData()」函數調用。
  • 如果我們有(而不是輸入類型=「按鈕」)裏面的形式然後點擊按鈕形式獲取提交。
  • 我已經添加「event.preventDefault()」作爲「requestData()」中的第一行,因爲按下輸入按鈕表單時會自動提交。
  • 增加了一段顯示結果統計
  • 改變了這一行document.myForm.innerHTML +=document.getElementById("results_stats").innerHTML

希望這有助於你。

HTML: -

<div class="container-wrapper"> 
<header> 
    <h1> Wikipedia Viewer </h1> 
    <form action="" name="myForm"> 
    <input type="text" name="search" id="txt_search" /><input type="button" name="searchBtn" value="Search"/> 
    <br> 
    <input type="button" name="btnRandom" class="random" value="Random Article"/> 
    <p id="results_stats"></p> 
    </form> 
</header> 

<div class="container"> 
    <ul id="list"></ul> 
</div> 

JAVASCRIPT: -

var url = 'https://en.wikipedia.org/w/api.php?action=opensearch&datatype=json&limit=10&origin=*&search='; 
var inputSearch = document.myForm.search; 
var searchBtn = document.myForm.searchBtn; 
var list = document.getElementById("list"); 
var random = document.getElementsByClassName('random')[0]; 

random.addEventListener("click" , function(){ 
    window.open("https://en.wikipedia.org/wiki/Special:Random"); 
}); 

function getDataFromInputBox(e){ 
    console.log("Value Entered"+inputStr); 

    if (e.keyCode === 13) { 
     requestData(e); 
    } 
} 
function requestData(e) { 
    e.preventDefault(); 
    console.log(e.target); 
    var inputStr = document.getElementById("txt_search").value; 
    if(inputStr != ""){ 
    console.log(inputStr); 
    var request = new XMLHttpRequest(); 
    request.onreadystatechange = function() { 
    if (request.readyState === 4) { 
     if (request.status === 200) { 
     var dataObj = JSON.parse(request.responseText); 
     var titles = dataObj[1]; 
     var descriptions = dataObj[2]; 
     var links = dataObj[3]; 
     document.getElementById("results_stats").innerHTML = "<h2><span>" + links.length + "</span> results for \"" + "<span>" + inputStr + "</span>" +"\" </h2>"; 
     list.innerHTML = ""; 
     for (var i = 0; i < titles.length; i++) { 
      var li = "<li><a target='_blank' href=" + links[i] + ">" + titles[i] + "</a></li>"; 
      list.innerHTML += li; 
     } 
     } 
     else { 
     console.log("Server responded with following error code : " + request.status); 
     } 
    } 
    }; 
    request.open("GET" , url + inputStr); 
    request.send(null); 
    //e.preventDefault(); 
    } 
    else{ 
    document.getElementById("results_stats").innerHTML; 
    list.innerHTML = ""; 
    alert("Enter a value"); 
    } 
} 

inputSearch.addEventListener("keyup" , getDataFromInputBox); 
searchBtn.addEventListener("click" , requestData); 
document.myForm.addEventListener("submit",requestData); 

CSS: -

/* http://meyerweb.com/eric/tools/css/reset/ 
    v2.0 | 20110126 
    License: none (public domain) 
*/ 

html, body, div, span, applet, object, iframe, 
h1, h2, h3, h4, h5, h6, p, blockquote, pre, 
a, abbr, acronym, address, big, cite, code, 
del, dfn, em, img, ins, kbd, q, s, samp, 
small, strike, strong, sub, sup, tt, var, 
b, u, i, center, 
dl, dt, dd, ol, ul, li, 
fieldset, form, label, legend, 
table, caption, tbody, tfoot, thead, tr, th, td, 
article, aside, canvas, details, embed, 
figure, figcaption, footer, header, hgroup, 
menu, nav, output, ruby, section, summary, 
time, mark, audio, video { 
    margin: 0; 
    padding: 0; 
    border: 0; 
    font-size: 100%; 
    font: inherit; 
    vertical-align: baseline; 
} 
/* HTML5 display-role reset for older browsers */ 
article, aside, details, figcaption, figure, 
footer, header, hgroup, menu, nav, section { 
    display: block; 
} 
body { 
    line-height: 1; 
} 
ol, ul { 
    list-style: none; 
} 
blockquote, q { 
    quotes: none; 
} 
blockquote:before, blockquote:after, 
q:before, q:after { 
    content: ''; 
    content: none; 
} 
table { 
    border-collapse: collapse; 
    border-spacing: 0; 
} 

/* CSS reset ends here */ 

body { 
    font-size: 16px; 
    font-family: 'Oxygen', sans-serif; 

} 

.container-wrapper { 
    margin: 0 auto; 
    text-align: center; 
    height: 100vh; 

} 

header { 
    /*background-color: #fc3e5b;*/ 
    padding: 80px 0; 
} 

header h1 { 
    font-family: 'Anton', sans-serif; 
    font-size: 70px; 
    padding: 30px 0 80px 0; 
    color: #fc3e5b; 
} 

form input , form button { 
    padding: 10px 8px; 
    font-size: 22px; 
    border: 1px solid #fc3e5b; 
    outline: 0; 
    display: inline; 
    margin: 0; 
} 

form button { 
    background-color: #fc3e5b; 
    color: #fff; 
} 

h2 { 
    font-size: 25px; 
    margin-top: 32px; 
} 

h2 span { 
    font-weight:bold; 
    color: #fc3e5b; 
} 
.random { 
    padding: 22px 7px; 
    border-radius: 100%; 
    margin: 20px 0 15px 0; 
} 

.random:hover { 
    border: 5px solid #fc3e6b; 
} 

#list { 
    width: 75%; 
    margin: 0 auto; 
} 

#list li { 
    padding: 16px 8px; 
    background-color: #fc3e5b; 
    margin: 12px 0; 
    text-align: left; 
    font-size: 22px; 
} 

#list li a { 
    text-decoration: none; 
    color: #fff; 
} 
0

既然你提到,你必須重新輸入你寫之後按Enter,我假設的形式提交什麼。

你有一個條件語句,說明被按下的鍵是13然後是eg.preventDefault()但你沒有傳遞表單提交事件。

試試這個:

document.querySelector ('form').addEventListener ('submit', requestData(e));