Creo que estarías buscando una solución solo de JavaScript, normalmente empaquetada como un comportamiento de wicket.
aplicación depende de la biblioteca JavaScript que utiliza, aquí hay un código de prototipo:
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;
}
Vamos a poner esto en un archivo llamado DontLeaveBehavior.js
He aquí un comportamiento que utiliza este archivo 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);
}
}
Ahora aquí está una página que asigna automáticamente este comportamiento a todos de la misma infantiles que son componentes de texto:
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();
}
}
y por último pero no menos importante, su botón de envío tiene que llamar al undirty()
por supuesto.
Nada de esto ha sido probado, porque tengo que irme a casa ahora a cenar con mi esposa & niños (que es incluso más divertido que la codificación wicket, por supuesto), pero debería comenzar.
La porción específica del prototipo debe ser fácilmente portada a cualquier otra lib de JavaScript, pero probablemente no deberías hacerlo sin una lib si no sabes lo que estás haciendo.
Editar:
He creado una nueva versión de este prototipo que funciona con y mootools y posted it on my weblog. Esta versión solo se instala en el componente del formulario y se adjunta automáticamente a los niños a través de javascript.
nuevo EDIT: allí, ya que el enlace funciona
Gracias por su respuesta, sin embargo, parece que el cliente quiere la ventana emergente para ser una ventana modal. Entonces, usar Javascript puede no ser la mejor solución. Perdón, no lo mencioné en la pregunta. Echaré un vistazo al resto, estoy seguro de que hay algo que puedo usar :) ¡Gracias de nuevo! Si resuelvo mi problema, marcaré tu respuesta. – Jivings
Lo siento, ingresé el nombre del método incorrecto. Es 'confirmar', no 'rápido'. Y sí, es una ventana modal y no, no puedes crear una sin javascript. Sin embargo, estoy trabajando en una solución un poco más elegante que publicaré en breve. –
nueva versión disponible, ver mi actualización. –