En una página con Ajax caso, quiero desactivar todas las acciones hasta que vuelva la llamada Ajax (para evitar problemas con doble presentar etc.)Javascript: ¿Cómo deshabilitar temporalmente todas las acciones en la página?
yo probamos este anteponiendo return false;
a los eventos onclick actuales cuando "bloqueo" la página, y eliminar esto más adelante al "desbloquear" la página. Sin embargo, las acciones ya no están activas una vez que están "desbloqueadas"; simplemente no puedes dispararlas.
¿Por qué no funciona? Ver la página de ejemplo a continuación. ¿Alguna otra idea para lograr mi objetivo?
Ejemplo código:
tanto el enlace y el botón están mostrando una alerta de JS; al presionar Bloquear, desbloquear el controlador de eventos es el mismo que antes, pero no funciona ...?!?
El código está destinado a trabajar con Trinidad al final, pero debería funcionar también fuera.
<html><head><title>Test</title>
<script type="text/javascript">
function lockPage()
{
document.body.style.cursor = 'wait';
lockElements(document.getElementsByTagName("a"));
lockElements(document.getElementsByTagName("input"));
if (typeof TrPage != "undefined")
{
TrPage.getInstance().getRequestQueue().addStateChangeListener(unlockPage);
}
}
function lockElements(el)
{
for (var i=0; i<el.length; i++)
{
el[i].style.cursor = 'wait';
if (el[i].onclick)
{
var newEvent = 'return false;' + el[i].onclick;
alert(el[i].onclick + "\n\nlock -->\n\n" + newEvent);
el[i].onclick = newEvent;
}
}
}
function unlockPage(state)
{
if (typeof TrRequestQueue == "undefined" || state == TrRequestQueue.STATE_READY)
{
//alert("unlocking for state: " + state);
document.body.style.cursor = 'auto';
unlockElements(document.getElementsByTagName("a"));
unlockElements(document.getElementsByTagName("input"));
}
}
function unlockElements(el)
{
for (var i=0; i<el.length; i++)
{
el[i].style.cursor = 'auto';
if (el[i].onclick && el[i].onclick.search(/^return false;/)==0)
{
var newEvent = el[i].onclick.substring(13);
alert(el[i].onclick + "\n\nunlock -->\n\n" + newEvent);
el[i].onclick = newEvent;
}
}
}
</script>
<style type="text/css">
</style>
</head>
<body>
<h1>Page lock/unlock test</h1>
<p>Use these actions to lock or unlock active elements on the page:
<a href="javascript:lockPage()">lock</a>,
<a href="javascript:unlockPage()">unlock</a>.</p>
<p>And now some elements:</p>
<a onclick="alert('This is the action!');return false;" href="#">link action</a>
<input type="button" value="button action" onclick="alert('This is another action!')"/>
</body>
</html>
Gracias a todos por sus comentarios y respuestas.
Ahora veo que he mezclado Cuerdas y funciones, lo que obviamente no pueden trabajar; (
que debería haber dejado claro que usamos algunas FW y bibliotecas de etiquetas web (Trinidad) que crean el manejo de eventos (y Ajax) código, por lo tanto no puedo editar eso directamente o usar Ajax sincrónico, etc.
Además, Ajax es solo un escenario donde se debe ejecutar este código. Su propósito es evitar que el usuario doblemente envíe un página/acción, que también es relevante para páginas que no son de Ajax donde podría hacer clic en un botón. Sé que esto no es realmente seguro, y solo tiene que ser una cuestión de "conveniencia" para evitar la navegación página de error con demasiada frecuencia (tenemos protección del lado del servidor, por supuesto).
Por lo tanto, probaremos la superposición div, probablemente.
Gracias de nuevo,
Christoph.
Gracias, pero desafortunadamente el código de acción es generado por el framework Trinidad y no puedo modificarlo directamente. Es por eso que tengo que usar JS para cambiar el código del controlador de eventos. – ami
Puede "ajustar" las acciones: función thingo_wrap (e) { if (actions_disabled) return false; return original_thing (e) } Consulte también la sugerencia alternativa anterior. – NickZoic
Buena idea ... No puedo hacer eso directamente, pero tal vez use algunos JS nuevamente para modificar la acción. La razón por la que mi solución original no funciona parece ser que estoy mezclando funciones y cadenas, ¿verdad? Lo intentaré. Alternativamente, probablemente podría usar un mapa para almacenar la acción original y restaurarla más tarde ... – ami