1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| <html>
<head>
<script type="text/javascript" src="https://code.jquery.com/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="https://raw.githubusercontent.com/padolsey/jQuery-Plugins/master/cross-domain-ajax/jquery.xdomainajax.js"></script>
<script type="text/javascript">
// Fonctions pratiques
if (!String.prototype.trim){
String.prototype.trim = function(){
return this.replace(/^\s+|\s+$/g, "");
};
}
if (!String.prototype.startsWith){
String.prototype.startsWith = function(str){
return (this.match("^" + str) == str);
};
}
if (typeof console === "undefined" || typeof console.log === "undefined")
console = {
log: function(){
}
};
// Fonction principale
function getTimesTable(){
var urlStart = "http://www.ter-sncf.mobi/station/";
if (!$("#url").val().toString().startsWith(urlStart)){
alert("L'URL doit commencer par :\n" + urlStart);
return;
}
console.log("start");
$("#timesTable").empty();
$.ajax({
url: $("#url").val(),
type: "get",
timeout: 3000, // Il existe un autre délai d'attente, celui de YQT, qui n'est pas paramétré ici
// Bien voir que cette fonction se base sur des sélecteurs de documents HTML
// dont la structure peut être modifiée sans préavis par l'auteur du service.
// Il s'agit d'une solution temporaire en attendant d'utiliser la vraie API du service.
success: function(data){
// Stocker tout le html reçu du service dans un formulaire JQuery
// Afin de pouvoir le manipuler sous forme d'un objet JQuery
$form = $("<form>" + data.responseText + "</form>");
// Sélecteur de base de l'extraction : Les blocs unitaires d'horaire (de trains)
// Ce sélecteur et ceux qui suivent n'ont aucune garantie d'être stable dans le temps (voir plus haut)
timeBlockPath = "div#bk-aside-main li.link-list";
if ($form.find(timeBlockPath).length === 0){
alert("Aucun horaire disponible depuis cette url.");
return;
}
// On itère sur l'ensemble des blocs unitaires d'horaire
$.each($form.find(timeBlockPath), function(index, item){
// Pour chaque bloc unitaire d'horaire :
// L'heure de départ est le texte du premier <span> de classe typo07
departureTime = $(item).find("a > span.typo07").eq(0).text().toString().trim();
// La destination est le texte du second <span> de classe typo07
destination = $(item).find("a > span.typo07").eq(1).text().toString().trim();
// L'identifiant du moyen de transport est tout ce qui reste des enfants du <a>
// Quand on a supprimé les noeuds non texte, les <br/> et le texte inutile
carrierIdentifier = $(item).find("a")
.clone() // Cloner l'élément
.children() // Sélectionner tous les noeuds non texte
.remove() // Supprimer tous les noeuds non texte
.end() // Revenir sur le dernier état dans la pile de transformation
.text() // Convertir en texte
.replace(/(\r\n|\n|\r)/gm, "") // Supprimer les <br/> transformés en caractères spéciaux par la méthode text() avec les autres caractères de retour à la ligne éventuels
.replace("Destination", ""); // Supprimer le texte restant mais inutile
// Ajouter les résultats dans la table
tr = $("<tr>");
$tr.append($("<td>", {
text: departureTime
}));
$tr.append($("<td>", {
text: destination
}));
$tr.append($("<td>", {
text: carrierIdentifier
}));
$("#timesTable").append($tr);
console.log("departureTime = " + departureTime + ", destination = " + destination + ", carrierIdentifier = " + carrierIdentifier);
});
},
error: function(status){
alert("request error:" + url);
}
});
}
</script>
</head>
<body>
url : <input type="text" id="url" size="75" value="http://www.ter-sncf.mobi/station/detail?uic=87723197&name=Lyon-Part-Dieu">
<input type="button" value="Lire les horaires de trains" onclick="getTimesTable()"/>
<table id="timesTable" border="1" cellpadding="5" style="margin-top: 5px"/>
</body>
</html> |
Partager