2017-07-12 10 views
0

Lorsque quelqu'un clique sur un xform, je veux obtenir l'apparence d'une boîte de dialogue d'alerte personnalisée (pas celle utilisée par le navigateur) qui alerte l'utilisateur et lui donne la possibilité de choisir s'il veut rester ou de quitter les XForms (annuler/boutons ok) Voici mon truc:Orbeon xforms window.onbeforeunload handler

<xf:action ev:event="xforms-ready"> 
<xxf:script> 

window.onbeforeunload = function() { 
return ORBEON.xforms.Document.dispatchEvent('fr-form-model','clickout') 
        } 
</xxf:script> 
</xf:action> 

ici est mon gestionnaire de modèle et l'événement:

<xf:model id="fr-form-model" xxf:expose-xpath-types="true" xxf:external-events="clickout"> 

<xf:action ev:event="clickout"> 
<xf:dispatch target="cancel_dialog" name="fr-show"/> 
</xf:action> 

La boîte de dialogue apparaît correctement, mais il ne fonctionne pas rester là pour donner à l'utilisateur l'opportunité de choisir faire. Après 1 à 2 secondes, le Xform est fermé, et l'utilisateur ne peut pas choisir de partir ou de rester.Toute idée quel est le problème?

............................. MISE À JOUR ................ ...................

Thnx pour la réponse, au moins y at-il une possibilité d'utiliser un message personnalisé à la boîte de dialogue par défaut? (Je veux que le message soit en langue allemande)

Sur cette base, http://wiki.orbeon.com/forms/how-to/logic/alert-users-leaving-a-form-without-saving

J'ai fait cette astuce:

<xxf:script ev:event="xforms-ready"> 
       window.onbeforeunload = function() { 
        if (ORBEON.xforms.Document.getValue('datastatus') == 'dirty') 
        return "Sie haben nicht gespeicherte Änderungen."; 
        } 
      </xxf:script> 

Au-dessus du modèle ...:

1)

<xf:bind id="data-bind" ref="xxf:instance('fr-persistence-instance')/data-status" name="data" /> 

2)

xf:action ev:event="xforms-model-construct-done" > 
       <xf:setvalue ref="xxf:instance('fr-persistence-instance')/data-status">clean</xf:setvalue> 
      </xf:action> 

De l'avis:

<xf:setvalue ev:event="xforms-value-changed" ref="xxf:instance('fr-persistence-instance')/data-status">dirty</xf:setvalue> 

.................................

<xf:output bind="data-bind" id="datastatus" />  

Dans le Ui je peux voir que la valeur de la sortie « datastatus », change correctement de propre à sale, mais window.onbeforeunload ne fonctionne pas. (le pop-up ne semble pas si je quitte la forme) Toutes les idées? Thnx à l'avance.

................................. DERNIÈRE MISE À JOUR ........... ...................... Il y a un bouton d'annulation, (qui quitte le formulaire) et le client veut que ce bouton déclenche le même dialogue que les fenêtres. Les déclencheurs de gestionnaire par défaut d'onbeforenull (s'il y a des changements non sauvegardés) et je veux dire celui que montre le navigateur.

J'ai essayé de quelque chose comme ceci:

<xf:trigger id="cancel-control" bind="cancel-bind"> 
           <xf:label ref="$form-resources/cancel/label" /> 
           <xf:action ev:event="DOMActivate" > 

            <xxf:script if="($calculationsDisabled eq false()) and ((xxf:instance('fr-persistence-instance')/data-status = 'dirty'))"> 
             function() {return "You may lose some unsaved changes.";} 
            </xxf:script> 

           <xxf:script if="($calculationsDisabled eq true()) or ((xxf:instance('fr-persistence-instance')/data-status = 'clean'))"> 
           window.parent.closeIframe(); 
           </xxf:script> 

           </xf:action> 

          </xf:trigger> 

mais il ne fonctionne pas too.Please remarquer que la méthode de dialogue personnalisée ci-dessous:

<xf:trigger id="cancel-control" bind="cancel-bind"> 
            <xf:label ref="$form-resources/cancel/label" /> 
            <xf:action ev:event="DOMActivate"> 
             <xf:dispatch target="cancel_dialog" name="fr-show" 
              if="($calculationsDisabled eq false()) and ((xxf:instance('fr-persistence-instance')/data-status = 'dirty'))" /> 
            </xf:action> 

            <xf:action ev:event="DOMActivate" if="($calculationsDisabled eq true()) or ((xxf:instance('fr-persistence-instance')/data-status = 'clean'))" > 
             <xxf:script>window.parent.closeIframe();</xxf:script> 
            </xf:action> 
           </xf:trigger> 

fonctionne bien, mais le client n » Je veux avoir 2 fenêtres de dialogue différentes (la boîte de dialogue d'alerte par le navigateur et la boîte de dialogue d'annulation personnalisée) Thnx en avance à nouveau.

Répondre

0

Dans ce cas, vous ne pouvez pas utiliser votre propre boîte de dialogue.En effet, le navigateur n'arrête qu'une autre page d'être chargée, ou l'onglet/fenêtre d'être fermé si votre onbeforeunload renvoie autre chose que null ou undefined, et quand cela arrive, il affichera son propre dialogue.

+0

Veuillez vérifier la mise à jour que j'ai postée ci-dessus..thnx again – nigioCeid

+0

@nigioCeid Même si vous pouvez localiser toutes les ressources utilisées par Form Runner, celle-ci est une exception. Si vous avez seulement besoin de supporter l'allemand, je vous recommande de changer le texte dans 'check-dirty-script.xhtml'. En outre, j'ai créé [un problème] (https://github.com/orbeon/orbeon-forms/issues/3307) pour cela, donc j'espère que cela sera fait pour vous dès la sortie de la boîte dans les prochaines versions du produit. – avernet

+0

Une dernière question: Au moins, puis-je faire apparaître la même boîte de dialogue de navigateur sur le bouton de sortie? Veuillez vérifier la dernière mise à jour – nigioCeid