2016-09-14 67 views
0

在我的網頁我有一個繁忙的指標是這樣的:禁用繁忙指示,如果的onclick返回false

window.onload = setupFunc; 
function setupFunc() { 
    document.getElementsByTagName('body')[0].onclick = clickFunc; 
    hideBusysign(); 
} 

function hideBusysign() { 
    document.body.style.cursor='default'; 
} 

function showBusysign() { 
    document.body.style.cursor='progress'; 
} 

function clickFunc(eventData) { 
    var clickedElement = (window.event) ? event.srcElement : eventData.target; 
    if ((clickedElement.tagName.toUpperCase() == 'BUTTON' || clickedElement.tagName.toUpperCase() == 'A') || clickedElement.parentNode.tagName.toUpperCase() == 'A' 
    || (clickedElement.tagName.toUpperCase() == 'INPUT' && (clickedElement.type.toUpperCase() == 'BUTTON' || clickedElement.type.toUpperCase() == 'SUBMIT'))) 
    && clickedElement.parentNode.id.toUpperCase() != 'NOBUSY' ) { 
    showBusysign(); 
    } 
} 

(爲了簡單起見我已刪除了Ajax請求的部分)

的問題是:如果有一個鏈接< a href = ... onclick = ...並且onclick返回false,那麼href不是「執行」,但忙指標繼續(並且不再停止)。

我已經改變了

clickedElement.tagName.toUpperCase() == 'A' 

(clickedElement.tagName.toUpperCase() == 'A' 
    && ! clickedElement.hasAttribute("onclick")) 

但這並不是一個嚴重的解決方案,因爲它假定與onclick屬性鏈接將永遠不會去的HREF。

如果onclick將返回true或false,是否有可能以通用方式知道如果href將被請求或不?

+0

我不明白 - 如果一個錨標記有一個href屬性,並且href是一個實際的url,那麼默認行爲是瀏覽器去那個位置。爲什麼它會返回false? –

回答

0

我終於找到了我自己一個驚人的方便和良好的工作解決方案:

window.onbeforeunload = showBusysign; 

function showBusysign() { 
    document.body.style.cursor='progress'; 
} 

:-)

在情況下,它也許有幫助檢票程序員來說,這是我的整個腳本:

window.onload = setupFunc;    // for ajax requests 
window.onbeforeunload = showBusysign; // for page requests 

function setupFunc() { 
    Wicket.Event.subscribe('/ajax/call/beforeSend', function(attributes, jqXHR, settings) { 
     showBusysign() 
    }); 
    Wicket.Event.subscribe('/ajax/call/complete', function(attributes, jqXHR, textStatus) { 
     hideBusysign() 
    }); 
} 

function hideBusysign() { 
    document.body.style.cursor='default'; 
} 

function showBusysign() { 
    document.body.style.cursor='progress'; 
}