Casi tres años después, estoy buscando algo similar. Como no he encontrado una solución "rápida" aceptable, escribí algo que se acerca mucho al criterio del OP. Me imagino que otros pueden encontrarlo útil en el futuro.
JavaScript está controlado por eventos y eso significa que no admite ningún tipo de bucle de "espera" o "suspensión" que podamos utilizar para pausar una función de confirmación de javascript puro. Las opciones implican grabar ciclos de procesador, usar un complemento de navegador o AJAX. En nuestro mundo cada vez más móvil, y con conexiones a Internet irregulares, ninguna de estas es una gran solución. Esto significa que tenemos que regresar de nuestra función "confirmar" de inmediato.
Sin embargo, como no hay una lógica "falsa" en el fragmento de código anterior (es decir, no se hace nada cuando el usuario hace clic en "Cancelar"), podemos activar el evento "hacer clic" o "enviar" cuando el usuario hace clic en "Aceptar". ¿Por qué no establecer una bandera y reaccionar en función de esa bandera dentro de nuestra función "confirmar"?
Para mi solución, opté por utilizar FastConfirm en lugar de un diálogo "modal". Usted puede modificar fácilmente el código para utilizar cualquier cosa que desee, pero mi ejemplo fue diseñado para utilizar esto:
https://github.com/pjparra/Fast-Confirm
Debido a la naturaleza de lo que esto, no veo una manera limpia de empaquetarlo. Si usted siente que esto tiene demasiados bordes ásperos, no dude en alisar hacia fuera o volver a escribir el código de la forma en que todo el mundo ha recomendado:
/* This version of $.fn.hasEvent is slightly modified to provide support for
* the "onclick" or "onsubmit" tag attributes. I chose this because it was
* short, even if it is cryptic.
*
* Learn more about the code by Sven Eisenschmidt, which is licensed under
* the MIT and GPL at:
* http://github.com/fate/jquery-has-event
*/
(function($) {
$.fn.hasEvent = function(A, F, E) {
var L = 0;
var T = typeof A;
E = E ? E : this;
var V = (E.attr('on'+A) != undefined);
A = (T == 'string') ? $.trim(A) : A;
if (T == 'function')
F = A, A = null;
if (F == E)
delete(F);
var S = E.data('events');
for (e in S)
if (S.hasOwnProperty(e))
L++;
if (L < 1)
return V; // = false;
if (A && !F) {
return V = S.hasOwnProperty(A);
} else if(A && S.hasOwnProperty(A) && F) {
$.each(S[A], function(i, r) {
if(V == false && r.handler == F) V = true;
});
return V;
} else if(!A && F) {
$.each(S, function(i, s) {
if (V == false) {
$.each(s, function(k, r) {
if (V == false && r.handler == F)
V = true;
});
}
});
}
return V;
}
$.extend($, {hasEvent: $.fn.hasEvent});
}) (jQuery);
/* Nearly a drop-in replacement for JavaScript's confirm() dialog.
* Syntax:
* onclick="return jq_confirm(this, 'Are you sure that you want this?', 'right');"
*
* NOTE: Do not implement "false" logic when using this function. Find another way.
*/
var jq_confirm_bypass = false;
function jq_confirm(el, question, pos) {
var override = false;
var elem = $(el);
if ($.fn.fastConfirm == undefined) {
override = confirm(question);
} else if (!jq_confirm_bypass) {
if (pos == undefined) {
pos = 'right';
}
elem.fastConfirm({
position: pos,
questionText: question,
onProceed: function(trigger) {
var elem = $(trigger);
elem.fastConfirm('close');
if (elem.hasEvent('click')) {
jq_confirm_bypass = true;
elem.click();
jq_confirm_bypass = false;
}
if (elem.hasEvent('submit')) {
jq_confirm_bypass = true;
elem.submit();
jq_confirm_bypass = false;
}
// TODO: ???
},
onCancel: function(trigger) {
$(trigger).fastConfirm('close');
}
});
}
return override ? override : jq_confirm_bypass;
}
Entonces ... onclick = "confirmar retorno (" ¿Quieres para probar esto? '); " se volvería onclick = "return jq_confirm (esto, '¿Quieres probar esto?');" El parámetro pos/"right" es opcional y es específicamente para Fast-Confirm.
Al hacer clic, la función jq_confirm() generará el cuadro de diálogo jQuery y devolverá "false". Cuando el usuario hace clic en "Aceptar", jq_confirm() establece un indicador, llama al evento original de hacer clic (o enviar), devuelve "verdadero" y luego lo desactiva en caso de que quiera permanecer en la misma página.
Tengo la pregunta de símil ..! esperará a que alguien responda tu pregunta ...! – bugBurger