EDIT
avec le code ci-dessous, sur chrome, la navigation du navigateur n'est bloqué qu'à partir du moment ou l'utilisateur à cliqué quelque part
j'ai essayé de 'simuler' ce click pour enclencher le blocage en appelant différente méthodes .click(), .focus() sur le formulaire qui serait déclenché au mouvement de la souris window.onmousemove mais çà ne fonctionne pas
c'est peut-être un peu de la bidouille mais par ailleurs mes enregistrements en base sont bien contrôlés et il ne peut y avoir de doublons
je veux bloquer le retour arrière pour forcer à une navigation 'propre'
****
Bonjour,
Ma question concerne un problème récurent chez tous les développeurs (la gestion de la navigation via le navigateur web) mais je n'ai pas trouvé de solution.
Je développe un projet Django dans lequel j'ai plusieurs modules.
Je réalise les tests sous firefox 72 et chrome 79.
L'un de ces modules permet de lever un aveugle et consiste en un enchainement de 3 écrans qui alimentent la même table.
Je dois gérer la navigation des utilisateurs pour contrôler les enregistrements en base.
Je veux donc bloquer la navigation arrière avec la flèche retour du navigateur entre mes différents écrans.
J'ai testé différentes solutions comme utilisé un flag entre mes écrans (mais le retour arrière ne recharge pas la page) et j'ai regardé la documentation de window.location, window.onhashchange et window.onpopstate.
Finalement window.onpopstate semble faire le job mais ne fonctionne que sous firefox mais pas sous chrome. J'ai compris que chrome et firefox ont un comportement différent pour window.onpopstate et que le comportement 'normal' est celui de firefox mais je ne parviens pas à corriger le bug de chrome.
D'après ce que j'ai lu, ce bug est censé avoir été résolu depuis la version 34 de chrome.
Est-ce que quelqu'un a une solution 'universelle' ou au moins sur firefox et chrome qui seront les 2 navigateurs qui seront recommandés dans mon cas.
d'avance merci,
code JS sur toutes les pages
views.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 $(document).ready( function () { // https://stackoverflow.com/questions/17594413/javascript-or-jquery-browser-back-button-click-detector // Ashik Jyothi window.onpopstate = function() { alert("clicked back button"); history.go(1); }; history.pushState({}, ''); });
Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
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 @login_required @permission_required('unblind.can_unblind') def index(request): if request.method == "POST": form = AveugleProcedureForm(request, data=request.POST or None) if form.is_valid(): unblind = form.save() # database treatment return redirect('unblind:edit', pk = unblind.pk) else: form = AveugleProcedureForm(request) return render(request, 'unblind/index.html', {'form': form}) @login_required @permission_required('unblind.can_unblind') def edit(request, pk): if request.method == "POST": form = AveugleForm(request, data=request.POST or None) if form.is_valid(): # unblind = form.save() # database treatment unblind = Aveugle.objects.get(unb_ide = pk) unblind.unb_pro = form.cleaned_data['unb_pro'] unblind.unb_nom_dem = form.cleaned_data['unb_nom_dem'] unblind.unb_nom_rea = form.cleaned_data['unb_nom_rea'] unblind.unb_dat = form.cleaned_data['unb_dat'] unblind.pat = form.cleaned_data['pat'] unblind.unb_num = form.cleaned_data['unb_num'] unblind.unb_mot = form.cleaned_data['unb_mot'] unblind.save() # contrôler le couple numéro patient/boite de médicament # récupération du traitement treatment = Medicament.objects.get(med_num = unblind.unb_num).med_dru # envoie d'un email de confirmation if treatment == 1: unblind_treatment = _('ASPIRIN') else: unblind_treatment = _('PLACEBO') email(unblind.pat,unblind.unb_num,unblind_treatment,unblind.unb_mot) return redirect('unblind:result', pk = unblind.pk) else: form = AveugleForm(request) return render(request, 'unblind/edit.html', {'form': form,'pk': pk}) @login_required @permission_required('unblind.can_unblind') def result(request, pk): # Récupération de l'enregistrement unblind = Aveugle.objects.get(unb_ide = pk) treatment = Medicament.objects.get(med_num = unblind.unb_num).med_dru if request.method == "POST": form = AveugleResultForm(request, data=request.POST or None) if form.is_valid(): # database treatment unblind.unb_rec = form.cleaned_data['unb_rec'] # unblind.unb_com = form.cleaned_data['unb_com'] unblind.unb_log_dat = datetime.now() unblind.unb_log = request.user.username unblind.unb_log_sit = request.session['selected_site'] unblind.save() return redirect('home') else: form = AveugleResultForm(request) return render(request, 'unblind/result.html', {'form': form,'unblind':unblind,'treatment':treatment})
Partager