Javascript:如何暂时禁用页面上的所有操作?

ami*_*ami 8 javascript events

在具有Ajax事件的页面上,我想在Ajax调用返回之前禁用所有操作(以防止双重提交等问题)

我通过return false;在"锁定"页面时预先设置当前的onclick事件来尝试此操作,并在"解锁"页面时稍后删除它.但是,在"解锁"后,操作不再处于活动状态 - 您无法触发它们.

为什么这不起作用?见下面的示例页面.还有其他想法来实现我的目标吗?

示例代码:
链接和按钮都显示JS警报; 当按下锁定,然后解锁事件处理程序与以前一样,但不起作用......?!?
该代码最终将与特立尼达合作,但也应在外部工作.

<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> &nbsp;
<input type="button" value="button action" onclick="alert('This is another action!')"/>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

谢谢你们的想法和答案.

现在我看到我混淆了字符串和函数,这显然无法工作;(

我应该明确表示我们使用一些Web FW和标记库(Trinidad)来创建事件处理(和Ajax)代码,因此我无法直接编辑它或使用同步Ajax等.

而且,Ajax只是应该执行此代码的一种情况.它的目的是阻止用户双重提交页面/操作,这也与非Ajax页面相关,您可以在其中点击按钮.我知道这不是很安全,并且只是为了避免过于频繁地获取导航错误页面(当然我们有服务器端保护),这只是一个"方便"的东西.

所以,可能会尝试div叠加.

再次感谢
Christoph.

Nic*_*oic 9

如何设置全局变量

actions_disabled = 0
Run Code Online (Sandbox Code Playgroud)

当AJAX调用开始时递增,然后在完成时递减.然后,您的所有"操作"处理程序都可以开始

if (actions_disabled) return false;
Run Code Online (Sandbox Code Playgroud)

比调试自修改代码简单得多!

或者,要锁定您的控件,您可以设置:

control.disabled="disabled"
Run Code Online (Sandbox Code Playgroud)

这将有灰色的奖励,使用户明显无法提交.要解锁,只需设置:

control.disabled=""
Run Code Online (Sandbox Code Playgroud)

基于评论的新想法(不能在评论中引用代码,它似乎......):

您总是可以从Javascript对象中挂起额外的属性:

要锁定,您可以:

control.onclick_old = control.onclick
control.onclick = "return false;"
Run Code Online (Sandbox Code Playgroud)

要解锁,您可以:

control.onclick = control.onclick_old
Run Code Online (Sandbox Code Playgroud)