2016-09-14 2 views
0

Dans mes pages web que j'ai un indicateur occupé comme ceci:désactiver l'indicateur occupé sur href si onclick retourne 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(); 
    } 
} 

(Pour faire simple, je l'ai retiré la partie pour les demandes ajax)

Le le problème est: S'il y a un lien < un href = ... onclick = ... et que l'onclick renvoie false, alors le href n'est pas "exécuté", mais le voyant occupé continue (et ne s'éteint plus).

J'ai changé le

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

à

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

mais ce n'est pas une solution sérieuse, car elle suppose que les liens avec l'attribut onclick ne seront jamais aller pour le href.

Y a-t-il une possibilité de savoir de manière générique, si l'onclick retournera vrai ou faux, par ex. si le href sera demandé ou non?

+0

Je ne comprends pas - si une balise d'ancrage a un attribut href et que href est une URL réelle, le comportement par défaut est que le navigateur se rende à cet emplacement. Pourquoi reviendrait-il faux? –

Répondre

0

J'ai finalement trouvé une solution étonnante facile et fonctionne bien par moi-même:

window.onbeforeunload = showBusysign; 

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

:-)

Dans le cas où il helpfull peut-être pour les programmeurs de portillon incorporé, ceci est mon script tout:

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'; 
}