2012-04-05 8 views
9

Naprawdę szukam czegoś, co pasuje do wszystkich popularnych popularnych przeglądarek (IE9, Chrome, Firefox, Safari) i aż do IE8.Czy istnieje rozwiązanie oparte na różnych przeglądarkach do monitorowania po zmianie dokumentu document.activeElement?

Mimo, że szukałem sposobu na ustawienie fokusa na obiekt ruchu Flash po tym, jak stracił ostrość, odkryłem, że wszystkie historyczne sposoby robienia tego zawodzą. Zakładam, że to kolejny problem z bezpieczeństwem.

Poszukuję teraz, jak monitorować niektóre zdarzenia związane ze zmianą dokumentu. (Ale "zmiana" tak naprawdę nie występuje).

Odpowiedz

8

Podczas gdy powyższa odpowiedź Jamesa jest prawidłowa. Dodałem więcej szczegółów, aby było to całkowicie działające rozwiązanie wraz z wykorzystaniem zdarzenia focus.

<html> 
<body> 
    <input type="text" id="Text1" name ="Text1" value=""/> 
    <input type="text" id="Text2" name ="Text2" value=""/> 
    <SELECT><OPTION>ASDASD</OPTION><OPTION>A232</OPTION></SELECT> 
    <INPUT TYPE="CHECKBOX" id="Check1"/> 
    <INPUT type="TEXT" id="text3"/> 
    <input type="radio"/> 
    <div id="console"> </div> 
    <textarea id="textarea1"> </textarea> 
    <script> 

     var lastActiveElement = document.activeElement; 

     function detectBlur() { 
      // Do logic related to blur using document.activeElement; 
      // You can do change detection too using lastActiveElement as a history 
     } 

     function isSameActiveElement() { 
      var currentActiveElement = document.activeElement; 
      if(lastActiveElement != currentActiveElement) { 
       lastActiveElement = currentActiveElement; 
       return false; 
      } 

      return true; 
     } 

     function detectFocus() { 
      // Add logic to detect focus and to see if it has changed or not from the lastActiveElement. 
     } 

     function attachEvents() { 
      window.addEventListener ? window.addEventListener('focus', detectFocus, true) : window.attachEvent('onfocusout', detectFocus); 

      window.addEventListener ? window.addEventListener('blur', detectBlur, true) : window.attachEvent('onblur', detectBlur); 
     } 

     attachEvents(); 

    </script> 
</body> 
</html> 
1

Z mojego doświadczenia wynika, że ​​najlepszym źródłem informacji na temat problemów z różnymi przeglądarkami jest tryb Quirksmode. Oto link do "oczywistej" (ale nie nadającej się do użytku) opcji - zdarzeń skupienia i rozmycia.

http://www.quirksmode.org/dom/events/blurfocus.html

dziwne (i zaskakująco) to przeglądarek opartych na silniku WebKit, które są wada tutaj.

Inną opcją byłoby użycie interwalometru, aby sprawdzić, czy zmienna activeElement zmieniła się jako jedyna opcja, czy też jako kopia zapasowa dla fokusa/rozmycia. (Można również słuchać naciśnięć klawiszy, kliknięć myszy i dotknięć, aby sprawdzić, czy zmiany activeElement.) Jeśli pokryjesz te opcje, twój interwał Timer prawie nigdy nie będzie wymagał czyszczenia.

+0

Używam teraz przerwę, ale myślałem, że moja ignorancja powstrzymuje mnie. Poszukując jednak od jakiegoś czasu i nie znalazłem nic lepszego. Gdybym mógł usunąć Flasha z problemu, byłoby łatwiej. Świetne źródło, dziękuję! –

2

Wygląda na to, że można użyć kombinacji przechwytywania fokusów/rozmycia i zdarzeń focusin/focusout (IE). Coś takiego może:

window.addEventListener ? 
    window.addEventListener('blur', blurHappened, true) 
    : window.attachEvent('onfocusout', blurHappened); 

function blurHappened() { 
    console.log('document.activeElement changed'); 
} 

onfocusout złapie pęcherzykami „zaciera” Podczas regularnego blur na addEventListener przechwyci „rozmycia”.

Być może trzeba będzie dodać dodatkowe kontrole w blurHappened. Nie jestem pewien, bo nie testowałem.

Powiązane problemy