Je suis un problème étrange avec pushstate / popstate où il semble que ma page initiale soit enregistrée deux fois.
C'est un peu difficile à expliquer sans exemple. P>
quelque chose comme ceci: p>
Lorsque la page Chargue, la liste initiale de la sélection déroulante est récupérée via AJAX et remplit la balise SELECT. P> LI>
L'utilisateur a la possibilité de cliquer sur 3 liens qui déterminent le contenu de la sélection déroulante. Exemple: Si je clique sur Option B Link, cela déclenche le même Ajax de Step1 mais ne récupère que les données appropriées pour l'option b. P> li>
L'utilisateur fait une sélection à partir de la liste déroulante et appuie sur la recherche. Cela déclenche une autre fonction AJAX qui récupère les données pertinentes et affiche les informations formatées à l'intérieur du mysearchResults em> div. P> li>
J'ai essayé de jouer avec le placement (par exemple, un appel AJAX) de pousstite et le placement semble maintenant celui qui me donne le moins de problème. Bien que je rencontre la question que j'ai mentionnée ci-dessus. P> li>
ol> Voici mon code. J'ai dû supprimer beaucoup de code / fonctions pour le rendre court et lisible, mais s'il vous plaît être assuré que l'affichage des appels AJAX / de données fonctionnent. P>
<div id="content">
<p>
<a class="coursetype" href="#" data-type="B">Option B</a>
| <a class="coursetype" href="#" data-type="H">Option H</a>
| <a class="coursetype" href="#" data-type="BG">Option BG</a>
</p>
<form id="myform">
<label class="formlabel" for="course">Select your course</label>
<br /><select id="course" name="course"></select>
<button id="searchbutton" type="button">Search Me</button>
</form>
<div id="mysearchresults"></div>
</div>
$(document).ready(function() {
var onClickCourseTypeHandler = function(event) {
event.preventDefault();
getCourses({ type:$(event.target).data("type") });
window.history.pushState({ html:$("#content").html(), coursecode:$("#coursecode").val() }, "", main?type="+pagevars.type);
}
var onClicksearchbuttonHandler = function(event) {
if ($("#coursecode").val().length > 0) {
searchDB({ course:$("#course").val() });
window.history.pushState({ html:$("#content").html(), coursecode:$("#coursecode").val() }, "", "/main?&course="+$("#course").val());
}
};
$(document).on("click", ".coursetype", onClickCourseTypeHandler);
$(document).on("click", "#searchbutton", onClicksearchbuttonHandler);
try {
window.addEventListener("popstate", function(event) {
if (event.state) {
$("#content").html(event.state.html);
if (event.state.coursecode.length > 0) {
if ($("#course option[value='" + event.state.course + "']").length > 0) {
$("#course").val(event.state.course);
} else {
$("#course option:first-child").attr("selected", "selected");
}
}
}
});
} catch(exception) {
}
onLoad();
function onLoad() {
getCourses({ type:"" });
window.history.pushState({ html:$("#content").html(), course:dbvars.course }, "", "/main");
}
function searchDB(parameters) {
$.ajax({
url: baseurl+"/searchDB"
, cache: false
, dataType: "json"
, data: { format:"json", course:parameters.course }
, success: function(data, status) {
parameters.data = data;
displaySearchResults(parameters);
}
});
}
function getCourses(parameters) {
if (typeof(parameters.cacheflag) === "undefined") { parameters.cacheflag = false; };
$.ajax({
url: baseurl+"/getCourses"
, cache: parameters.cacheflag
, dataType: "json"
, data: { format:"json", coursetype:parameters.type }
, success: function(data, status) {
parameters.data = data;
populateCourses(parameters);
}
});
}
});
4 Réponses :
transmettez un objet littéral à la poussée () sur la charge de la page. De cette façon, vous pouvez toujours revenir à votre premier pousstite créé.
Ajouter à DOM READY P>
$(window).on('popstate', function (ev) { var originalState = ev.originalEvent.state || obj.html; if (!originalState) { // no history // do something return; } else { // do something } });
Il est similaire à ce que vous appuyez sur la charge. Dans votre cas {HTML: 'ABC', COURSECODE: 'XYZ'} code>. Je vais changer ma réponse alors c'est plus clair.
J'ai remarqué votre utilisation de hachages (#) dans votre hrefs. Essayez de changer de hashes (#) dans votre HREFS à JavaScript: void (0).
Javascript:void(0);
Lorsque vous chargez votre page, il est ajouté à l'historique, donc lorsque vous faites historique.pustate code> c'est ajouté une seconde fois.
Essayez de remplacer
history.pushstate code> avec
historique.replacestate code> dans la fonction de surcharge. P>
J'ai trouvé que cela a été excellent pour une application à une seule page
J'ai décidé d'utiliser cette petite fonction pratique qui permet de repousser un élément dans l'historique si son vide ou seulement s'il n'a pas été rappelé à l'appui du bouton arrière p>
(élimine les doublons, vous n'avez donc pas besoin de toucher deux fois le bouton arrière) p> Utilisation: historiquePush ("Page1") P> J'ai ensuite utilisé un étui de commutation dans la fonction d'écouteur de flopstate pour reculer le contenu de la page: P> window.addEventListener('popstate', function(e) {
console.log(e.state.sitelocation);
if (e.state.sitelocation){
switch (e.state.sitelocation){
case "Page1":
pageOne.loadContent();
break;
case "Page2":
pageTwo.loadContent();
break;
default:
console.log('Unknown Page');
}
}
});
Jetez un coup d'œil ici a>. Fait de sens?