在與阿賈克斯事件的網頁,我要禁用所有動作,直到Ajax調用返回(以防止問題的雙重提交等)Javascript:如何暫時禁用頁面上的所有操作?
我通過預先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>
<input type="button" value="button action" onclick="alert('This is another action!')"/>
</body>
</html>
謝謝你們對自己的想法和解答。
現在我明白了,我已經混了絃樂和功能,這顯然不能工作;(
我應該明確表示,我們使用它創建事件處理某些Web FW和標籤庫(特立尼達和多巴哥) (和Ajax)代碼,因此我無法直接編輯或使用同步Ajax等。
此外,Ajax只是一個應該執行此代碼的場景,目的是防止用戶雙擊提交page/action,這對非Ajax頁面也很重要,在這裏你可以點擊一個按鈕。我知道這不是很安全,它只是爲了避免導航的「方便」錯誤頁面(我們當然有服務器端的保護)。
所以,可能會嘗試div覆蓋。
再次感謝,
克里斯托弗。
感謝您的回答,但這實際上並不是客戶想要的...... ;-( 頁面應該顯示不變(所有按鈕,字段等都可見),但只能防止用戶觸發另一個操作或第二次採取同樣的行動。 – ami 2009-04-20 09:11:33
這就是建議。頁面不會有任何可見的變化。你甚至不需要改變不透明度 - 只需保持div空,並在'none'和'block'之間切換顯示屬性。 – ozan 2009-04-20 09:19:13
哦,是的,我明白了。應該更仔細地閱讀這個;) 將嘗試這種方法... – ami 2009-04-20 09:27:55