Met een form genereer ik een spotify json url.
Op submit wil ik twee dingen doen:
- met file_get_contents de content van deze url ophalen
- deze content als input gebruiken voor een javascript functie die vervolgens de json data output in een html table.
Deze twee handelingen lopen niet synchroon. D.w.z. Op submit neemt het javascript niet de gegevens mee die in php bewerkt zijn.
Ik heb geprobeerd om dit probleem op te lossen met json_encode of $_ajax, maar kom hier niet uit. Zou iemand me hiermee kunnen helpen? De code staat hieronder.
function loadJSON()
{
var http_request = new XMLHttpRequest();
try{
// Opera 8.0+, Firefox, Chrome, Safari
http_request = new XMLHttpRequest();
}catch (e){
// Internet Explorer Browsers
try{
http_request = new ActiveXObject("Msxml2.XMLHTTP");
}catch (e) {
try{
http_request = new ActiveXObject("Microsoft.XMLHTTP");
}catch (e){
// Something went wrong
alert("Your browser broke!");
return false;
}
}
}
http_request.open("GET", "spotifylist.php", true);
http_request.send();
http_request.onreadystatechange = function(){
if (http_request.readyState == 4 )
{
// Javascript function JSON.parse to parse JSON data
var jsonObj = JSON.parse(http_request.responseText);
// jsonObj variable now contains the data structure and can
// be accessed as jsonObj.artist_name and jsonObj.track_name.
HTML = "<table id='chart'> <thead><tr id='row2'><th id='dw'></th><th id='song'>Artiest</th><th id='song'>Titel</th></tr></thead><tbody>";
var x=jsonObj.tracks;
for (i=0;i<x.length;i++)
{
HTML += "<tr id='row1'><td id='dw'>";
HTML += i+1;
HTML += "</td><td id='song'>";
HTML += x.artist_name;
HTML += "</td><td id='song'>";
HTML += x.track_name;
HTML += "</td></tr>";
}
HTML += "</tbody></table>";
document.getElementById("spotifylist").innerHTML = HTML;
}
}
}
$("#spotifyform").submit(function(){
loadJSON();
return false;
});
Wat is de URL die je aanroept, want zoals ik eerder aangaf geven alle URL's die niet een lijst van tracks retourneren JSON terug, in plaats van callback_functie(JSON). In dat eerste geval wordt geen callback-functie getriggerd, en daarmee ook 'success' niet.
Voeg dat 'error' stuk uit mijn bovenstaande code eens toe? Krijg je dan een melding 'jQueryXXX_YYY was not called'?
Plak je ook '?callback=?' aan je uiteindelijke URL zoals ik hierboven doe?
// deze functie wordt automatisch aangeroepen als de pagina geladen is.
window.onload = function loadJSON()
{
// de HTML-elementen waar we een gebeurtenis van willen registreren of waaraan we iets willen wijzigen.
var country2 = document.getElementById("country");
var chart2 = document.getElementById("chart");
var interval2 = document.getElementById("interval");
var button = document.getElementById("go_button");
// we maken een functie die aangeroepen moet worden als er op de button geklikt wordt
$("#spotifyform").submit(function()
{
// we slaan de gekozen optie van de <select> country op in een variabele met de naam country2
var country = country2.options[country2.selectedIndex].value;
var chart = chart2.options[chart2.selectedIndex].value;
var interval = interval2.options[interval2.selectedIndex].value;
var url = "http://charts.spotify.com/api/tracks/" + chart + "/" + country + "/" + interval + "/latest";
// haal de data op van de url en sla deze op in de variabele data
$.ajax({
'url': url + '?callback=?',
'dataType': 'jsonp',
'error': function(xhr, status, error)
{
alert(error.message);
},
'success': function(json)
{
alert(json); // geeft [object Object] terug, omdat het resultaat een JSON object is
console.log(json); // als je bijvoorbeeld FireBug gebruikt, kun je in je console de structuur bekijken
// Javascript function JSON.parse to parse JSON data
var jsonObj = JSON.parse(json);
// jsonObj variable now contains the data structure and can
// be accessed as jsonObj.artist_name and jsonObj.track_name.
HTML = "<table id='chart'> <thead><tr id='row2'><th id='dw'></th><th id='song'>Artiest</th><th id='song'>Titel</th></tr></thead><tbody>";
var x=jsonObj.tracks;
for (i=0;i<x.length;i++)
{
HTML += "<tr id='row1'><td id='dw'>";
HTML += i+1;
HTML += "</td><td id='song'>";
HTML += x[i].artist_name;
HTML += "</td><td id='song'>";
HTML += x[i].track_name;
HTML += "</td></tr>";
}
HTML += "</tbody></table>";
document.getElementById("spotifylist").innerHTML = HTML;
} // succes ajax
}); // $.ajax
}); // form submit
} // window on load
EDIT: Ik heb dus die errormelding erin staan. De callback ook, precies zoals in jouw code.
Overigens krijg ik geen errormeldingen van chrome. Ook niet in de console.
Voor sommige combinaties lijken er geen resultaten te zijn, zo is er geen resultaat voor http://charts.spotify.com/api/tracks/most_viral/gb/daily/latest - voor most_viral lijkt alleen de weekly variant gevuld. Dit wordt blijkbaar niet fout gerekend, je krijgt gewoon een leeg resultaat retour.
Ik zou trouwens je landencodes aanpassen naar een lowercase variant, conform de API.
Nee oke dat weet ik. Maar bij mij toont hij ook geen resultaten voor de combinaties die wel mogelijk zijn. Uppercase/lowercase zou niet uit moeten maken, maar ik zal desalniettemin toch eens kijken.
EDIT: de landen in lowercase letters veranderd. Nog steeds geen resultaat.
Het enige wat gebeurt is de url in de browser die ?country=nl.... toevoegt.
Heb je al geprobeerd rijen / kolommen te debuggen met console.log()?
Wellicht gaat er in jouw geval iets mis met JSON.parse()?
Hoe werkt dat?
[size=xsmall]Toevoeging op 26/01/2015 16:55:44:[/size]
EDIT: Als ik de JSON parse en het maken van die html table weghaal en dat stukje op jouw manier doe, werkt de code ook niet. De fout zit hem denk ik in het informatie van het form halen.
Okay, je bent een JavaScript applicatie aan het maken, maar je weet niet hoe je deze moet debuggen :(.
Vroegah gebruikte men meestal alert() om van alles te dumpen, maar dat is een beetje onpraktisch omdat dat de uitvoering staakt. Tegenwoordig is daar console.log().
Met console.log() dump je data naar je console (F12, console tab). Zoiets dus:
EDIT: Er lijkt nog iets anders aan de hand te zijn: als je een URL aanroept met ?callback=... dan geeft spotifiy een document terug met text/html als MIME-type in plaats van (een) JSON (callback). LOL.
Dat levert geen fouten op in mijn console (F12, console). Hier zal de fout niet zitten denk ik.
[size=xsmall]Toevoeging op 26/01/2015 17:09:06:[/size]
Thomas van den Heuvel op 26/01/2015 16:57:33
EDIT: Er lijkt nog iets anders aan de hand te zijn: als je een URL aanroept met ?callback=... dan geeft spotifiy een document terug met text/html als MIME-type in plaats van (een) JSON (callback). LOL.
Dat zag ik ook idd. Maakt dat nog iets uit?
[size=xsmall]Toevoeging op 26/01/2015 17:10:52:[/size]
Heb jij hem wel werkend inclusief form?
Want zonder form kan ik hem ook wel werkend krijgen dat is geen probleem.