0
こんにちは、ここでは、jQueryコードの問題点を理解しようとしています。コードは地震情報をAPIから引き出してDOMに表示することになっています。問題は、DOMに重複した情報が表示されていることですが、その情報を表示するためにコンソール呼び出しを使用すると、すべて一意になります。DOMにプッシュされるとJSONデータが重複して表示される
HTML:
<div class="control-wrapper">
<h2>Start date: <input type="text" id="datepicker"></h2>
<h2>End date: <input type="text" id="datepicker_2"></h2>
<button id="generate">Generate</button>
</div>
<h2>Total # of EQ's: <span id="total"></span></h2>
<div class="wrapper" id="template">
<h1>Name: <span id="title"></span></h1>
<h3>Magnitued: <span id="mag"></span></h3>
<h3>Tsunami Warning: <span id="tsunami"></span></h3>
</div>
のjQuery:
$(document).ready(function(){
var scriptString = 'https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&starttime=';
var button = $('#generate');
/**DATEPICKER**/
var startDate = 0;
var endDate = 0;
$('#datepicker').datepicker();
$('#datepicker').datepicker('option', 'dateFormat', 'yy-mm-dd');
$('#datepicker_2').datepicker();
$('#datepicker_2').datepicker('option', 'dateFormat', 'yy-mm-dd');
/** GENERATE BUTTON ON CLICK **/
button.on('click', function(){
startDate = $('#datepicker').val();
endDate = $('#datepicker_2').val();
scriptString = scriptString + startDate +'&endtime=' + endDate;
makeRequest(scriptString);
});
});
/** MAKEREQUEST EXECUTES AFTER THE GENERATE BUTTON IS CLICKED **/
function makeRequest(requestString){
var myRequest;
var eqs = [];
var myRequest = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
myRequest.onreadystatechange = function(){
if(myRequest.readyState === 4 && myRequest.status === 200){
var jsonObj = JSON.parse(myRequest.responseText);//Grabs json object
var data = jsonObj.features;
pushToDOM(data);
}
}
myRequest.open("GET", requestString, true);
myRequest.send();
}
/** RECIEVES ARRAY OF EQS AND PUSHES THE FIRST TO THE DOM **/
function pushToDOM(eqs){
var tot = $('#total');
tot.text(eqs.length);
/*ADDS EQs TO DOM*/
for(x in eqs){
var wrap = $('.wrapper').clone();
wrap.attr('id', x);
var place = eqs[x].properties.place;
var mag = eqs[x].properties.mag;
var tsu = eqs[x].properties.tsunami;
wrap.find('#title').text(place);
wrap.find('#mag').text(mag);
if(tsu === 0){
wrap.find('#tsunami').text('No');
}
else{
wrap.find('#tsunami').text('Yes');
}
$('body').delay().append(wrap);
if(x === 10){
break;
}
}
}
PS:それはそう情報を表示する前にブラウザをロックアップするので、私は、スクリプトを書いた方法が問題のようです私のコード構造やアルゴリズムを改善する方法があれば教えてください。
ありがとうございました!
は、この答えを書くために時間を割いてありがとうございました。私は間違いなく、あなたのコードを見てからもっとjQueryチュートリアルを進めていきます。しかし、私はあなたの応答で、最初にこの問題の原因を正確に教えてくれる答えは見当たりませんでした。ちょうどひどいコード構造ですか?ありがとうTomalak! – Froy
どの問題?このコードではまだ発生しますか? – Tomalak
提供したコードは正しく動作しません。私が得たアウトプットには重複した地震情報が示され、時には同じ情報で最大4つの地震が示されました。あなたの例は、繰り返されることなく各地震情報を表示します。 – Froy