PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WEBDEV 2025 → Problème de contexte lors duplication onglet navigateur
Problème de contexte lors duplication onglet navigateur
Débuté par jm.baron, 28 nov. 2017 15:44 - 3 réponses
Membre enregistré
32 messages
Posté le 28 novembre 2017 - 15:44
Bonjour,
J'ai un problème grave ! Mon projet est de type 'dynamique Webdev'. Je suis en version 21. Je n'utilise pas les commandes H (accès ODBC...). Je suis en mode 'Empêcher le retour par flèche précèdent du navigateur)
Certain client ont pris 'la mauvaise habitude' de dupliquer des onglets dans le navigateur.
Ex Chrome : Clic Droit sur l'onglet + Dupliquer
Ca fonctionne tellement bien (une page clone est créée) que les utilisateurs travaille sur les 2 onglets !
Le problème est important lors du retour sur le 1er : s'ils valident, c'est le contexte du second qui est pris en compte d'où un mélange TOTAL d'informations...
Je suis en contact avec PCSoft qui me donnent des solution de synchronisation mais aucunes ne peut me satisfaire car j'aimerai INTERDIRE à l'utilisateur de dupliquer dans certain écran trop sensibles (La session étant la même, le contexte 'vivant' sera celui du second onglet => Gros embarras lors retour sur le 1er !!!!!!)
CATASTROPHE...
S'il n'y avait que qqs champs 'Ecran' à alimenter (et non des variables 'mémoires') ce serait jouable mais il y a des tonnes d'informations en mémoire (tableaux, variables, identifiants...)
Quelqu'un a une idée ? Je suis plus que preneur
Y a t il une information système / une variable d'environnement / un déclencheur / un événement....
Merci d'avance
JMarc BARON - ANGERS
Posté le 28 juin 2023 - 16:59
Bonjour,

Un utilisateur vient de me faire la même "blague" avec WebDev28.

Personne d'autre n'a eu le problème ?
Quelqu'un à une solution ?

Merci d'avance
Pierre
Membre enregistré
7 messages
Posté le 04 juin 2024 - 14:32
Bonjour,

Je fais face au même problème. Une solution qui fonctionne chez moi est de passer par du javaScript.
Il faut pouvoir indiquer aux autres onglets de notre site si la même session serveur est partagée. Pour cela, il faut récupérer l'ID de la session de l'utilisateur (ExeDonnePID) et la communiquer aux autres onglets. C'est cette communication aux autres onglets qui doit passer par Javascript :

J'ai nommé ma fonction "handleDuplication", que je lance dans la partie "Déclarations globales" coté navigateur sur la page concernée.

Dans cette fonction, il y a ce code :
FUNCTION handleDuplication() {
// Création d'un broadcastChannel qui permet l'envoi de message sur tous les onglets du navigateur
const channel = new BroadcastChannel('maSessionSite');


// On lance l'écoute des messages envoyés
channel.addEventListener('Message', gotMessage);

// On envoie le message
SendMessage();

FUNCTION SendMessage(ev) {
// On récupère le PID par une fonction WL retournant la valeur du PID
let msg = getidsession();
// C'est cette valeur de PID qu'on envoie à tous les onglets
channel.postMessage({ Message: msg });
}

// Fonction permettant de signaler la cause du problème à l'onglet fautif
FUNCTION preventClosing(ev) {
let msg = getidsession();
//
// On envoie la même valeur mais avec une "balise" différente : "closing" par exemple
channel.postMessage({ closing: msg });
}

FUNCTION gotMessage(ev) {
// Cette fonction permet de férer les messages reçus par d'autres onglets
const mySession = getidsession();

// Dans le cas d'un message "closing"
IF (ev && ev.data && ev.data.closing == mySession) {
alert('Vous ne pouvez pas dupliquer les onglets sur ce site. Vous allez être déconnecté.');
}
// dans le cas d'un message normal
IF (ev && ev.data && ev.data.message == mySession) {
// Si on reçoit la même valeur que notre session, alors
// - on prévient l'onglet dupliqué qu'il va être fermé également
// - on ferme l'onglet
preventClosing();
alert('Vous ne pouvez pas dupliquer les onglets sur ce site.');
pnFinsite();
}
}
}

pnFinsite est une fonction navigateur locale WL du style (attention à la casse dans les noms de fonctions en JS!! ) :
Procedure pnFinsite(msg)
AJAXExecute(ajaxActualiseChamps,FinSite,msg)


et FinSite une fonction serveur globale (elle peut être locale, mais je l'utilise dans toutes mes pages) du style :

Procedure pnFinsite(msg)
AJAXExecute(ajaxActualiseChamps,FinSite,msg)
Procedure FinSite(Lib)
loginuser = "" // On réinitialise les variables globales (ex: loginuser)
FinProgramme()


Je me suis inspiré de cette vidéo sur YT : Broadcast Channel API for JS Messaging de Steve Griffith - Prof3ssorSt3v3.
Posté le 18 avril 2025 - 16:17
Bonjour Elie PACCOU,
Je suis très intéressé par votre code, cependant, j'ai essayé de le répercuter chez moi, mais impossible de le faire fonctionner.
Le code est-il complet ?
Merci :D