Změňte typ kurzoru pro html dokument z javascriptu

Řekněme, že mám metodu javascriptu, jejíž dokončení trvá trochu dlouho, než bude fungovat bez jakékoli zpětné vazby od uživatelů. V mém případě se jedná o řazení řádků v prvku tabulky (vše v DOM; trvá příliš dlouho, pouze pokud je jich hodně řádků), ale může to udělat cokoliv. Chci ukázat kurzor „progresu“, když běží. Zde je to, co aktuálně mám, ale vyzkoušel jsem i několik dalších věcí:

// SORT   
document.body.style.cursor = "progress";
MyLongRunningMethod(); //blocks for 10-15 seconds before returning
document.body.style.cursor = "auto";    

Bohužel se nic neděje. MyLongRunningMethod() to dělá správně, ale kurzor se nikdy nezmění. Myslím si, že prohlížeč musí počkat, až se metoda vrátí, aby mohl zpracovat zprávu o změně kurzoru generovanou prostředím oken, ale to může být daleko, a i když je to pravda, nevím, jak to opravit.

Nějaké další nápady?

[editovat]:Rozhodl jsem se, že celý příběh ze pozadí, který jsem měl, není ve skutečnosti nutný. Pokud si to opravdu chcete přečíst, podívejte se na historii revizí.

Konečné výsledky

Nakonec jsem použil řešení RoBorg. Nenaruší to kód tolik, jak jsem si původně myslel, protože můžu ponechat deklarovanou funkci přímo tam – je to jako přidat vložený blok rozsahu.

Zajímavé je, že ve Firefoxu jsem zjistil, že to znamená, že vůbec nemusím měnit kurzor. Zjistil jsem, že poté, co jsem přidal volání setTimeout, jsem někdy viděl, že se před nastavením kurzoru průběhu objevil kurzor čekání, takže jsem svůj kód kurzoru okomentoval. Ukazuje se, že něco při použití setTimeout k vytlačení tohoto z obslužné rutiny události kliknutí umožňuje FireFoxu, aby sám zjistil, že by se měl kurzor změnit. Bohužel, IE není tak chytrý, takže jsem vrátil kód kurzoru.

To dává důvěru mému přesvědčení, že změna kurzoru je zde vhodnou akcí – vzhledem k této příležitosti to prohlížeč stejně udělá. Opravdu nechci do DOM přidávat a odstraňovat nové položky (např. rušný obrázek nějakého typu) pro stránku, o které toho vím jen velmi málo. Skript by se měl shodovat bez ohledu na to, jaký vizuální design stránka používá.

Nakonec Chrome dělá celou věc irelevantní. Pomocí stejných dat Chrome provede za méně než 5 sekund to, co IE a Firefoxu dosáhly 10 až 15 sekund. Takže jejich javascriptový engine je opravdu rychlejší. Nemůžu se dočkat enginu Firefoxu 3.1. Bohužel lidé zde stále většinou používají IE6.

Odpověď

Nepřipadá v úvahu použití časovače?

document.body.style.cursor = "progress";

setTimeout(function()
{
    SortTable(cell.cellIndex, dir, sortType);
    document.body.style.cursor = "auto";
}, 10);