11522 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous,

Je vous sollicite car je souhaite tout simplement résoudre un bug sur le déroulement de mes actions de mon formulaire. Je souhaite quand l'utilisateur clique sur Ajouter :
- Ajout d'un nom
- Entrer le titre du lien
- Entrez URL du lien
Pour ces trois champs si pas rempli message d'erreur = veuillez compléter champ
Pour Entrez URL lien j'ai borner la variable en ajoutant http:// ou https Smiley ohwell / si pas rempli
Une fois que l'utilisateur a rentrer toutes les informations un message de 2 sec = Le lien "x" a était ajouté et doit s'afficher en haut de ma liste existante...

Bref mon bug se déroule à la dernière étape je recherche partout et je ne trouve pas c'est un truc bête mais je l'ai fait y a longtemps et du coup j'ai besoin d'un petit coup de pouce...
Comment du coup ajouter mon lien enregistré en haut de la liste existante ?

En vous remerciant pour votre lecture et votre aide.

Excellente journée !

 
<!doctype html>
<html>

<head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="../css/liensweb.css">
    <title>Activité 1</title>
</head>

<body>
    <h1>Activité 2</h1>

    <p>
        <button id="ajoutLien">Ajouter un lien</button>
    </p>
    <div id="contenu"></div>
    <script src="../js/ajax.js"></script>
    <script src="../js/liensweb.js"></script>
</body>

</html>



body {
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    background-color: #eee;
    margin-left: 30px;
    margin-right: 30px;
}

span {
    font-weight: normal;
    font-size: 80%;
}

.lien {
    background: white;
    padding: 10px;
    margin-bottom: 10px;
}



/* 
Activité 1
*/

// Liste des liens Web à afficher. Un lien est défini par :
// - son titre
// - son URL
// - son auteur (la personne qui l'a publié)
var listeLiens = [
	{
		titre: "So Foot",
		url: "http://sofoot.com",
		auteur: "yann.usaille"
    },
	{
		titre: "Guide d'autodéfense numérique",
		url: "http://guide.boum.org",
		auteur: "paulochon"
    },
	{
		titre: "L'encyclopédie en ligne Wikipedia",
		url: "http://Wikipedia.org",
		auteur: "annie.zette"
    }
];


// Crée et renvoie un élément DOM affichant les données d'un lien
// Le paramètre lien est un objet JS représentant un lien
function creerElementLien(lien) {
	var titreElt = document.createElement("a");
	titreElt.href = lien.url;
	titreElt.style.color = "#428bca";
	titreElt.style.textDecoration = "none";
	titreElt.style.marginRight = "5px";
	titreElt.appendChild(document.createTextNode(lien.titre));

	var urlElt = document.createElement("span");
	urlElt.appendChild(document.createTextNode(lien.url));

	// Cette ligne contient le titre et l'URL du lien
	var ligneTitreElt = document.createElement("h4");
	ligneTitreElt.style.margin = "0px";
	ligneTitreElt.appendChild(titreElt);
	ligneTitreElt.appendChild(urlElt);

	// Cette ligne contient l'auteur
	var ligneDetailsElt = document.createElement("span");
	ligneDetailsElt.appendChild(document.createTextNode("Ajouté par " + lien.auteur));

	var divLienElt = document.createElement("div");
	divLienElt.classList.add("lien");
	divLienElt.appendChild(ligneTitreElt);
	divLienElt.appendChild(ligneDetailsElt);

	return divLienElt;
}

ajaxGet("  https://oc-jswebsrv.herokuapp.com/api/liens",  function (lien) {
	var contenuElt = document.getElementById("contenu");
	// Parcours de la liste des liens et ajout d'un élément au DOM pour chaque lien
	listeLiens.forEach(function (lien) {
		var lienElt = creerElementLien(lien);
		contenuElt.appendChild(lienElt);
	});
});

// Créer un élément DOM de type input
function creerElementInput(placeholder, taille) {
	var inputElt = document.createElement("input");
	inputElt.type = "text";
	inputElt.setAttribute("placeholder", placeholder);
	inputElt.setAttribute("size", taille);
	inputElt.setAttribute("required", "true");
	return inputElt;
}

var ajouterLienElt = document.getElementById("ajoutLien");

// Gère l'ajout d'un nouveau lien
ajouterLienElt.addEventListener("click", function () {
	var auteurElt = creerElementInput("Entrez votre nom", 20);
	var titreElt = creerElementInput("Entrez le titre du lien", 40);
	var urlElt = creerElementInput("Entrez l'URL du lien", 40);

	var ajoutElt = document.createElement("input");
	ajoutElt.type = "Submit";
	ajoutElt.value = "Ajouter";

	var formAjoutElt = document.createElement("form");
	formAjoutElt.appendChild(auteurElt);
	formAjoutElt.appendChild(titreElt);
	formAjoutElt.appendChild(urlElt);
	formAjoutElt.appendChild(ajoutElt);

	var p = document.querySelector("p");

	// Remplace le bouton d'ajout par le formulaire d'ajout
	p.replaceChild(formAjoutElt, ajouterLienElt);

	//ajoute le nouveau lien
	formAjoutElt.addEventListener("submit", function (e) {
		e.preventDefault();
		var url = urlElt.value;

		// Si l'URL ne commence ni par "http://" ni par "https://"
		if ((url.indexOf("http://") !== 0) && (url.indexOf("https://") !== 0)) {
			// On la préfixe par "http://"
			url = "http://" + url;
		}
		// Création de l'objet contenant les données du nouveau lien
		var lien = {
			titre: titreElt.value,
			url: url,
			auteur: auteurElt.value
		};

		var lienElt = creerElementLien(lien);
		// Ajoute le nouveau lien en haut de la liste
		//contenuElt.insertBefore(lienElt, contenuElt.firstChild);

		// Création du message d'information
		var infoElt = document.createElement("div");
		infoElt.classList.add("info");
		infoElt.textContent = "Le lien \"" + lien.titre + "\" a bien été ajouté.";
		p.insertBefore(infoElt, formAjoutElt);
		// Suppresion du message après 2 secondes
		setTimeout(function () {
			p.removeChild(infoElt);
		}, 2000);

		// Remplace le formulaire d'ajout par le bouton d'ajout
		p.replaceChild(ajouterLienElt, formAjoutElt);

	});
});



function ajaxGet(url, callback) {
	var req = new XMLHttpRequest();
	req.open("GET", url);
	req.addEventListener("load", function () {
		if (req.status >= 200 && req.status < 400) {
			// Appelle la fonction callback en lui passant la réponse de la requête
			callback(req.responseText);
		} else {
			console.error(req.status + " " + req.statusText + " " + url);
		}
	});
	req.addEventListener("error", function () {
		console.error("Erreur réseau avec l'URL " + url);
	});
	req.send(null);
}

function ajaxPost(url, data, callback, isJson) {
	var req = new XMLHttpRequest();
	req.open("POST", url);
	req.addEventListener("load", function () {
		if (req.status >= 200 && req.status < 400) {
			// Appelle la fonction callback en lui passant la réponse de la requête
			callback(req.responseText);
		} else {
			console.error(req.status + " " + req.statusText + " " + url);
		}
	});
	req.addEventListener("error", function () {
		console.error("Erreur réseau avec l'URL " + url);
	});
	if (isJson) {
		// Définit le contenu de la requête comme étant du JSON
		req.setRequestHeader("Content-Type", "application/json");
		// Transforme la donnée du format JSON vers le format texte avant l'envoi
		data = JSON.stringify(data);
	}
	req.send(data);
}

Modifié par axel-bs (31 Jan 2019 - 11:40)
Modérateur
Bonjour,

Je ne comprends rien à ta fonction ajaxGet().

Que vaut la variable lien (ou plutôt les variables lien) dans le code ci-dessous selon toi ?
ajaxGet("   https://oc-jswebsrv.herokuapp.com/api/liens",   function (lien) {
	var contenuElt = document.getElementById("contenu");
	// Parcours de la liste des liens et ajout d'un élément au DOM pour chaque lien
	listeLiens.forEach(function (lien) {
		var lienElt = creerElementLien(lien);
		contenuElt.appendChild(lienElt);
	});
});

Amicalement,
Bonjour Parsimonhi,
Tu as bien raison j'ai omis de définir ajax, pardonne moi.
Ce script était censé récupérer des liens sur un site, le besoin a évolué et donc on l'a modifié pour du coup ne pas pointer sur le lien mais sur une liste existante en base.

J'ai omis effectivement dans mon message qu'il faudra du coup supprimer cette méthode et le problème c'est que quand je supprime les variables b cela remonte plus comme je le souhaite et vu que j'ai pas sauvegardé mes versions ...

Bref en te remerciant encore pour ton aide.
Cdt,
Axel B
Modifié par axel-bs (31 Jan 2019 - 16:30)
Bonjour Seraniz,
Pardonne moi mais je n'ai pas compris ton intervention.
Pourrais tu développer plus ton explication stp (tes liens hostgator n'ont pas l'aire de fonctionner)..?
Axel
Modifié par axel-bs (14 Feb 2019 - 09:20)