validacion - validar formulario javascript html5
¿Puedes esperar la devolución de llamada de javascript? (9)
Acabas de alcanzar una gran limitación en JavaScript. Una vez que el código ingrese al mundo asincrónico, no hay forma de volver a un flujo de ejecución de procedimiento clásico.
En su ejemplo, la solución sería hacer un ciclo esperando que se complete la respuesta. El problema es que JavaScript no proporciona ninguna instrucción que le permita realizar bucles indefinidamente sin tomar el 100% de la potencia de procesamiento. Por lo tanto, terminará bloqueando el navegador, a veces hasta el punto en que su usuario no podrá responder la pregunta real.
La única solución aquí es apegarse al modelo asíncrono y conservarlo. Mi consejo es que debe agregar una devolución de llamada a cualquier función que deba realizar algún trabajo asincrónico, de modo que la persona que llama pueda ejecutar algo al final de su función.
function confirm(fnCallback)
{
jConfirm(''are you sure?'', ''Confirmation Dialog'', function(r)
{
// Do something with r
fnCallback && fnCallback(r); // call the callback if provided
});
}
// in the caller
alert(''begin'');
confirm(function(r)
{
alert(r);
alert(''end'');
})
Estoy tratando de usar la biblioteca de diálogo de alertas jQuery de http://abeautifulsite.net/notebook/87 en lugar de las alertas predeterminadas (que en mi opinión son bastante horribles). Esta parece ser una gran biblioteca, pero no hay un ejemplo de cómo usar la biblioteca jConfirm.
Necesito hacer algo como esto:
function confirm() {
var result = false;
var response = false;
jConfirm(''are you sure?'', ''Confirmation Dialog'',
function(r) {
result = r;
response = true;
return r;
});
if (response == true) {
alert(result);
return result;
}
else {
//wait for response
alert(''hi'');
}
}
y mi llamada desde mi botón .net:
Publiqué un comentario en el sitio web del complemento (esta mañana) e hice búsquedas en Google de javascript y esperé a que se completara una devolución de llamada sin resultados.
¿Alguna idea sobre cómo usar la devolución de llamada correctamente para obtener el resultado, antes de que se ejecute el resto del javascript?
Gracias.
Asumiría que tendrías que agarrar la respuesta de esta manera. No creo que necesites una devolución de llamada.
function confirm() {
var response = jConfirm(''are you sure?'', ''Confirmation Dialog'');
if (response) {
alert(result);
}
else {
//wait for response
alert(''hi'');
}
}
jConfirm(''are you sure?'', ''Confirmation Dialog'',
function(r) {
result = r;
response = true;
return r;
}
);
if (response == true) {
Esto delata un malentendido de la secuencia de eventos que ocurre usando un código asíncrono. El hecho de que lo hayas escrito en línea no significa que vaya a ejecutarse estrictamente de arriba a abajo.
- Se llama a jConfirm, recibiendo una función como uno de sus parámetros, que recuerda.
- jConfirm muestra su UI en la página y regresa inmediatamente.
- La línea ''if (response == true)'' se ejecuta. Realmente esto debería simplemente leer ''if (respuesta)'', la comparación booleana es superflua. Pero, en cualquier caso, la respuesta es, por supuesto, falsa. Su función cede y sale, devolviendo el control al navegador.
- El usuario hace clic en la interfaz de usuario de jConfirm.
- jConfirme solo ahora salta a la acción y devuelve la función que le dio y recordó antes.
- Su función anidada establece la respuesta verdadera, demasiado tarde para que la condición ''if (respuesta == verdadero)'' haga algo con ella.
Usted ha escrito "// wait for response" como alternativa, pero no hay un código JavaScript que pueda escribir que realmente lo haga. Su función debe regresar para devolverle el control al navegador, antes de que el navegador pueda activar los eventos de clic en la interfaz de usuario de jConfirm que hace que procese el procesamiento.
Las formas de hacer que el código asíncrono funcione en un contexto síncrono (y viceversa) existen, en particular hilos y corutinas (y sus generadores de relaciones limitadas). Pero JavaScript no tiene ninguna de estas características, por lo que debe escribir su código para que se ajuste al modelo síncrono o asíncrono que utiliza su biblioteca.
Creo que he encontrado una posible solución a este problema. Estaba leyendo este artículo: http://treasure4developer.wordpress.com/2008/06/23/calling-postback-event-from-javascript/
Básicamente la idea es forzar la devolución de datos desde javascript, al principio encontré que la devolución de datos funcionaría pero no llamaría a mi evento de botón, pero después de leer el artículo descubrí que podía detectar si era una devolución de datos de JavaScript y simplemente llamar a un método para hacer el procesamiento
Saludos DotnetShadow
Cómo dijeron los tipos, ¡no hay forma! pero ... cómo decimos en mi país (Brasil), le gambi:
podemos hacer algo como eso:
<h:commandLink styleClass="linkValor xExcluir" value="x"
onclick="if(confirmar(''Confirmar excluir.'',''Deseja realmente excluir este registro?'', this)) return true; else return false;"
action="#{mBeanPesquisarLinhas.excluir}"/>
y el javascript:
function confirmar(titulo, msg, elemento) {
if ($(elemento).attr(''sim'')) {
$(elemento).removeAttr(''sim'');
return true;
} else if ($(elemento).attr(''nao'')) {
$(elemento).removeAttr(''nao'');
return false;
} else {
$("#dialog-confirm").html(''<p>'' + msg + ''</p>'').dialog({
resizable : false,
height : 200,
modal : true,
title : titulo,
buttons : {
"Sim" : function() {
$(this).dialog("close");
$(elemento).attr(''sim'', ''sim'');
$(elemento).click();
},
"Não" : function() {
$(this).dialog("close");
$(elemento).attr(''nao'', ''nao'');
$(elemento).click();
}
}
});
}
return false;
}
es el mismo problema pero usando jquery-ui.
Adiós y espero que esto pueda ayudar a alguien.
Como la devolución de llamada es asincrónica (al menos, en el sentido de que está esperando que el usuario haga algo), puede ser más fácil manejar lo que necesita dentro de la devolución de llamada:
function confirm() {
jConfirm(''are you sure?'', ''Confirmation Dialog'', function(r) {
if (r) doSomething();
});
}
@klogan [comentarios]
¿Supongo que obtuviste estos de aquí ?
La página te da tu respuesta: (mira debajo de Uso )
Estos métodos no devuelven los mismos valores que confirm () y prompt (). Debe acceder a los valores resultantes utilizando una función de devolución de llamada. (Vea la demostración para más detalles).
@klogan
El punto que estoy tratando de plantear es que no hay realmente una manera fácil de lograr lo que quieres. Está intentando correlacionar la programación basada en procedimientos y eventos , algo que JavaScript no ayuda a hacer.
La solución más simple (aunque arriesgada ) es usar un bucle pseudo infinito. Pero, si nunca se llama a la callback
llamada, ahora tiene un bucle infinito real.Y, dependiendo del motor de JavaScript, puede matar el navegador en espera.
Punto: Su mejor opción es evitar esto tratando de forzar el evento en procedimientos.
function confirm() {
var result = false;
var response = false;
jConfirm(''are you sure?'', ''Confirmation Dialog'',
function(r) {
result = r;
response = true;
});
while(!response) continue; // wait
return result;
}
Considere las devoluciones de llamadas como el envío de mensajes y dará como resultado una mejor estructura en su código.
Esto funciona Necesita jQuery.
function myconfirm(kyssa, elm, e){ // neG
if(jQuery(''#confirmquestion'').data(''result'')){
var V = jQuery(''#confirmquestion'').data(''result'');
jQuery(''#confirmquestion'').remove();
return V == ''Y'' ? true : false;
}else if(!jQuery(''#confirmquestion'').length){
jQuery(''body'').append(''<div id="confirmquestion">''+
''<h4>Kinnitus</h4>''+
''<div id="kyssa">''+kyssa+''</div>''+
''<center>''+
''<button onclick="jQuery(/'#confirmquestion/').data(/'result/', /'Y/');">Jah</button> ''+
''<button onclick="jQuery(/'#confirmquestion/').data(/'result/', /'N/');">Ei</button></div>''+
''</center>'');
jQuery(''#confirmquestion button'').click(function(){
jQuery(elm).trigger(e.type);
})
}
return false;
}
onChange="if(myconfirm(/'Saada kiri: /'+jQuery(this).find(/'option:selected/').html()+/' ?/', this, event)) { ... }"
CSS
#confirmquestion{
border:1px solid #999;
background:white;
padding-bottom: 30px;
position:fixed;
width:300px;
font-size:12px;
top:45%;
left:50%;
margin-left:-150px;
}
#confirmquestion h4 {
background:blue;
color:white;
margin:0;
padding: 2px 5px;
border-bottom:#777;
text-align:center;
}
#confirmquestion #kyssa {
padding: 30px 25px;
}
Técnicamente, sí , pero no haría eso en un sitio web.
Eche un vistazo a Narrativa JavaScript , que se basa en Narciso .
Narrativa JavaScript es una pequeña extensión del lenguaje JavaScript que habilita las capacidades de bloqueo para devoluciones de eventos de eventos asíncronos. Esto hace que el código asincrónico sea refrescantemente legible y comprensible.
Selenium usa esta tecnología.
Actualizar
Echa un vistazo a los filamentos de JavaScript :
JavaScript Strands agrega coroutine y compatibilidad con threading cooperativo al lenguaje JavaScript para habilitar las capacidades de bloqueo para devoluciones de eventos de eventos asíncronos. Esto hace que el código que utiliza la operación asincrónica sea mucho más lineal, legible y manejable. Strands se basa en el JavaScript narrativo escrito por Neil Mix, y gran parte del JavaScript narrativo se ha mantenido en Strands, incluida gran parte de esta documentación.
En JavaScript, su código no puede simplemente esperar hasta que se dispare un evento: el evento siempre debe ser manejado por un controlador de eventos asincrónico separado. A veces esto está bien, pero a menudo obliga a lo que debería ser una simple secuencia de declaraciones a contorsiones retorcidas. También rompe la capacidad de encapsular la funcionalidad porque las funciones de llamada deben saber para proporcionar un controlador de devolución de llamada. Strands proporciona la capacidad de suspender y reanudar los hilos de ejecución. La ejecución puede suspender el currículum cuando finaliza el evento. Esto le permite escribir eventos de eventos asincrónicos difíciles de leer en un código simple, lineal y legible que encapsula la implementación.