I am using a lot of observe_fields in my views. I have two searches on my form, one with two fields one with four, and every time a user types something the observe_field is triggered and some search is executed via AJAX. To make sure the user knows what is going on, i use a spinner-image.

        <%= observe_field 'querypeople', :frequency => 1,
                 :update => 'people_to_link',
                 :before => "Element.show('spinner2')",
                 :loaded => "Element.hide('spinner2')",
                 :complete => "Element.hide('spinner2')",
                 :url => {:action => 'listpeople'},
                 :with => " 'querypeople=' +escape($('querypeople').value) + '&queryorganisation=' + escape($('queryorganisation').value)" %>

        <%= observe_field 'queryorganisation', :frequency => 1,
                 :update => 'people_to_link',
                 :before => "Element.show('spinner2')",
                 :loaded => "Element.hide('spinner2')",
                 :complete => "Element.hide('spinner2')",
                 :url => {:action => 'listpeople'},
                 :with => " 'querypeople=' +escape($('querypeople').value) + '&queryorganisation=' + escape($('queryorganisation').value)" %>

This works all fine and dandy, but when a user types multiple characters in a row, the spinner is hidden while another query is running. So i needed to improve that.

I first introduced a little code to count how many times a certain spinner is shown:

<% javascript_tag do %>
    var spinner_counter=[0,0,0];

    function show_spinner(itm) {
      spinner = (itm == 0) ? "spinner2" : "spinner" ;
      Element.show(spinner);
      spinner_counter[itm] = spinner_counter[itm] + 1;
    }

    function hide_spinner(itm) {
      spinner = (itm == 0) ? "spinner2" : "spinner" ;
      spinner_counter[itm] = spinner_counter[itm] - 1;
      if (spinner_counter[itm] <= 0) {
        Element.hide(spinner);
        spinner_counter[itm] = 0;
      }
    }

<% end %>

and then adapted the ruby-code as follows:

        <%= observe_field 'querypeople', :frequency => 1,
                 :update => 'people_to_link',
                 :before => "show_spinner(0)",
                 :complete => "hide_spinner(0)",
                 :url => {:action => 'listpeople'},
                 :with => " 'querypeople=' +escape($('querypeople').value) + '&queryorganisation=' + escape($('queryorganisation').value)" %>

        <%= observe_field 'queryorganisation', :frequency => 1,
                 :update => 'people_to_link',
                 :before => "show_spinner(0)",
                 :complete => "hide_spinner(0)",
                 :url => {:action => 'listpeople'},
                 :with => " 'querypeople=' +escape($('querypeople').value) + '&queryorganisation=' + escape($('queryorganisation').value)" %>

Do you know a better solution?