2017-05-28 59 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));