Je pense que vous seriez à la recherche d'une solution javascript seulement, habituellement emballé comme un comportement portillon incorporé.
mise en œuvre dépend de la bibliothèque JavaScript que vous utilisez, voici un code prototype:
var windowdirty = false;
var windowdirtyinitialized = false;
function initwindowdirty(){
if(windowdirtyinitialized)return;
windowdirtyinitialized=true;
Event.observe(window,"beforeunload",function(){
return (!windowdirty ||
confirm("You have started entering values, do you really want to leave");
});
}
function monitor(componentId){
$(componentId).observe("change",function(){
windowdirty = true;
});
}
function undirty(){
windowdirty=false;
}
Nous allons mettre cela dans un fichier appelé DontLeaveBehavior.js
Voici un comportement qui utilise ce fichier javascript :
public class DontLeaveBehavior extends AbstractBehavior{
/**
* {@inheritDoc}
*/
@Override
public void renderHead(final IHeaderResponse response){
response.renderJavascriptReference(new JavascriptResourceReference(DontLeaveBehavior.class,
"DontLeaveBehavior.js"));
response.renderOnDomReadyJavascript("initwindowdirty();");
super.renderHead(response);
}
/**
* {@inheritDoc}
*/
@Override
public void bind(final Component component){
super.bind(component);
component.setOutputMarkupId(true);
}
/**
* {@inheritDoc}
*/
@Override
public void onRendered(final Component component){
final Response response = RequestCycle.get().getResponse();
response.write(JavascriptUtils.SCRIPT_OPEN_TAG);
response.write("monitor('" + component.getMarkupId() + "');");
response.write(JavascriptUtils.SCRIPT_CLOSE_TAG);
}
}
maintenant, voici une page qui attribue automatiquement ce comportement à l'ensemble de ses enfants qui sont des composants de texte:
public class Mypage extends WebPage{
...
private boolean behaviorAssigned = false;
/**
* {@inheritDoc}
*/
@Override
protected void onBeforeRender(){
if(!behaviorAssigned){
behaviorAssigned=true;
visitChildren(new IVisitor<Component>(){
@Override
public Object component(Component component){
if(component instanceof AbstractTextComponent<?>){
component.add(new DontLeaveBehavior());
}
return null;
}
});
}
super.onBeforeRender();
}
}
et last but not least, votre bouton d'envoi doit appeler undirty()
bien sûr. Rien de tout cela n'a été testé, parce que je dois rentrer à la maison maintenant pour dîner avec ma femme & enfants (ce qui est encore plus amusant que le codage de guichet, bien sûr), mais il devrait vous aider à démarrer.
La partie spécifique du prototype devrait être facilement porté à un autre javascript lib, mais vous ne devriez pas le faire probablement sans lib si vous ne savez pas ce que vous faites.
Edit:
J'ai créé une nouvelle version de ce prototype qui fonctionne avec et Mootools et posted it on my weblog. Cette version est uniquement installée sur le composant de formulaire et se fixe automatiquement aux enfants via javascript.
EDIT à nouveau: là, maintenant le lien fonctionne
Merci pour votre réponse, mais il semble que le client veut la fenêtre contextuelle être une fenêtre modale. Donc, l'utilisation de Javascript n'est peut-être pas la meilleure solution. Désolé, je n'ai pas mentionné cela dans la question. Je prendrai un regard sur le reste, je suis sûr qu'il ya quelque chose que je peux utiliser :) Merci encore! Si je résous mon problème, je marquerai votre réponse. – Jivings
Désolé, j'ai entré un mauvais nom de méthode. C'est 'confirmer', pas 'prompt'. Et oui, c'est une fenêtre modale et non, vous ne pouvez pas en créer une sans javascript. Cependant, je travaille sur une solution un peu plus élégante que je publierai sous peu. –
nouvelle version disponible, voir ma mise à jour. –