I have been on a search spree for a while now with no luck, i have the html/javascript code which retrieves and displays Bitcoin price in USD from bitcoininfo, however i want it to self update every 5 seconds using Javascript. In that way, one doesn't need to refresh the page to get the Current price. My code is
<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="UTF-8">
<title>Bitcoin Current price</title>
<style>#wrapper {
font-size: 1em;
font-family: arial;
margin: 20px auto;
width:450px;
color: green;
text-align: center;
}
#btc {font-size:6em;}
</style>
</head>
<body>
<!-- partial:index.partial.html -->
<div id="wrapper">
<h1>Bitcoin Current Price</h1>
<div id="btc"></div>
</div>
<!-- partial -->
<script> var currentPrice = new XMLHttpRequest();
currentPrice.open('GET', 'https://api.gdax.com/products/BTC-USD/book', true);
currentPrice.onreadystatechange = function(){
if(currentPrice.readyState == 4){
var ticker = JSON.parse(currentPrice.responseText);
var price = ticker.bids[0][0];
document.getElementById('btc').innerHTML = "$" + price;
};
};
currentPrice.send();</script>
</body>
</html>
If there's a better way to do it, a pointer in the right direction will be appreciated.
Wrap your call to the API into a function then repeatedly call it every 5 seconds using setInterval.
If there's a better way to do it, fetch API is widely supported and has a much nicer API
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Bitcoin Current price</title>
<style>
#wrapper {
font-size: 1em;
font-family: arial;
margin: 20px auto;
width: 450px;
color: green;
text-align: center;
}
#btc {
font-size: 6em;
}
</style>
</head>
<body>
<!-- partial:index.partial.html -->
<div id="wrapper">
<h1>Bitcoin Current Price</h1>
<div id="btc"></div>
</div>
<!-- partial -->
<script>
function get_price() {
var el = document.getElementById('btc')
fetch("https://api.gdax.com/products/BTC-USD/book")
.then(res => res.json())
.then(res => {
var price = res.bids[0][0];
el.innerHTML = "$" + price;
}).catch(err => {
el.innerHTML = "$0.00 - Error";
});
}
get_price()
setInterval(get_price, 5000)
</script>
</body>
</html>
Or using websocket, example:
function initWebSocket(products) {
const ws = new WebSocket("wss://ws-feed.gdax.com");
ws.onopen = function() {
ws.send(JSON.stringify({
"type": "subscribe",
"channels": [{
"name": "ticker",
product_ids: Object.keys(products)
}]
}));
};
ws.onmessage = function(evt) {
let data = JSON.parse(evt.data);
if (typeof products[data.product_id] !== 'undefined') {
products[data.product_id][data.side] = data
}
};
ws.onclose = function() {
console.log("Connection is closed...");
};
}
function update() {
for (let product_id in products) {
let el = document.querySelector('[data-product="' + product_id + '"]')
// buy
el.getElementsByClassName('buy price')[0].innerHTML = products[product_id].buy.price
el.getElementsByClassName('buy open_24h')[0].innerHTML = products[product_id].buy.open_24h
el.getElementsByClassName('buy low_24h')[0].innerHTML = products[product_id].buy.low_24h
el.getElementsByClassName('buy high_24h')[0].innerHTML = products[product_id].buy.high_24h
el.getElementsByClassName('buy time')[0].innerHTML = products[product_id].buy.time
// sell
el.getElementsByClassName('sell price')[0].innerHTML = products[product_id].sell.price
el.getElementsByClassName('sell open_24h')[0].innerHTML = products[product_id].sell.open_24h
el.getElementsByClassName('sell low_24h')[0].innerHTML = products[product_id].sell.low_24h
el.getElementsByClassName('sell high_24h')[0].innerHTML = products[product_id].sell.high_24h
el.getElementsByClassName('sell time')[0].innerHTML = products[product_id].sell.time
}
}
const products = {};
[...document.querySelectorAll('[data-product]')].forEach(
el => products[el.getAttribute('data-product')] = {
buy: {},
sell: {}
}
)
initWebSocket(products);
setInterval(update, 1000)
h1 {
font-size: 24px;;
text-align: center;
font-weight: bold;
}
.text-center {
text-align: center;
}
li {
list-style: none;
}
<h1>ws-feed.gdax.com</h1>
<div data-product="BTC-USD" class="text-center">
<strong>BTC-USD:</strong>
<ul>
<li>
<strong>Buy:</strong> Price: <span class="buy price">0.00</span> Open 24h: <span class="buy open_24h">0.00</span> Low 24h: <span class="buy low_24h">0.00</span> High 24h: <span class="buy high_24h">0.00</span> Last: <span class="buy time"></span>
</li>
<li>
<strong>Sell:</strong> Price: <span class="sell price">0.00</span> Open 24h: <span class="sell open_24h">0.00</span> Low 24h: <span class="sell low_24h">0.00</span> High 24h: <span class="sell high_24h">0.00</span> Last: <span class="sell time"></span>
</li>
</ul>
</div>
<div data-product="ETH-USD" class="text-center">
<strong>ETH-USD:</strong>
<ul>
<li>
<strong>Buy:</strong> Price: <span class="buy price">0.00</span> Open 24h: <span class="buy open_24h">0.00</span> Low 24h: <span class="buy low_24h">0.00</span> High 24h: <span class="buy high_24h">0.00</span> Last: <span class="buy time"></span>
</li>
<li>
<strong>Sell:</strong> Price: <span class="sell price">0.00</span> Open 24h: <span class="sell open_24h">0.00</span> Low 24h: <span class="sell low_24h">0.00</span> High 24h: <span class="sell high_24h">0.00</span> Last: <span class="sell time"></span>
</li>
</ul>
</div>