2013-02-15 17 views
31

Istnieje wiele dyskusji na temat miękkiej klawiatury, ale nie znalazłem jeszcze dobrego rozwiązania dla mojego problemu.Jak ustalić, czy zdarzenie zmiany rozmiaru zostało wywołane przez klawiaturę programową w przeglądarce mobilnej?

Mam funkcja Resize jak:

$(window).resize(function() { 
    ///do stuff 
}); 

chcę zrobić „rzeczy” w tej funkcji na wszystkich rozmiaru zdarzenia z wyjątkiem gdy jest spowodowany przez miękkiej klawiatury. Jak ustalić, czy miękka klawiatura spowodowała zmianę rozmiaru?

+1

Czy wszystkie ruchome klawiatury programowe wyzwalają zdarzenia zmiany rozmiaru? Wydaje mi się, że działają one jak "nakładki" i nie zmieniają rozmiaru okna przeglądarki. –

+1

Są one podobne do nakładek, jeśli nie zmieniasz rozmiaru zawartości. Ale wywołują zdarzenie window.resize. –

+0

Czy istnieje sposób sprawdzenia, czy wyświetlana jest klawiatura ekranowa? – Derek

Odpowiedz

15

Niedawno napotkano na pewne problemy, które wymagały sprawdzenia. Udało mi się go rozwiązać tak:

$(window).on('resize', function(){ 
    // If the current active element is a text input, we can assume the soft keyboard is visible. 
    if($(document.activeElement).attr('type') === 'text') { 
     // Logic for while keyboard is shown 
    } else { 
     // Logic for while keyboard is hidden 
    } 
} 

Potrzebowałem tylko go dla wejść tekstowych, ale oczywiście to może być rozszerzona dla każdego rodzaju elementu, który mógłby wywołać klawiaturę/numer kompletacji itp

+3

To zadziała tylko wtedy, gdy jawnie ustawisz atrybut "tekst" w swoim kodzie HTML. Lepiej używać funkcji prop() zamiast attr(). – CpnCrunch

2

Podobne do poprzedniej odpowiedzi, ale cele wszystkie dzieci w formie, z naciskiem (oczywiście, to nie na wejściach bez formy rodzica)

$(window).resize(function() { 
    if($('form *').focus()) { 
     alert('ignore this'); 
    } else { 
     // do the thing 
    } 
}); 

Więc może ten ...

$(window).resize(function() { 
    if($('input, select, etc').focus()) { 
     alert('ignore this'); 
    } else { 
     // do the thing 
    } 
}); 
3

Problem polega na tym, że jeśli aktywny element jest skupiony, można wywołać zdarzenie zmiany rozmiaru tylko przez zamknięcie klawiatury bez zmiany ostrości .. tak, klawiatura zostanie ukryta, ale kod wejdzie w stan skupienia.

3

Szukałem rozwiązania podobnego problemu. Moje zdarzenie resize było wyzwalane, gdy wejście URL-a pojawiło się i zniknęło z widoku. To jest coś, nad czym pracowałem ... Czy możliwe jest rozwiązanie?

Więc w zasadzie po prostu sprawdzić, czy szerokość ekranu sam się zmienił, czy nie, a jedynie odpalić swoje funkcje na zmiany rozmiaru jeśli jest inaczej:

np

var saveWindowWidth = true; 
    var savedWindowWidth; 

//set the initial window width 
    if (saveWindowWidth = true){ 
     savedWindowWidth = windowWidth; 
     saveWindowWidth = false; 
    } 


//then on resize... 


$(window).resize(function() { 

//if the screen has resized then the window width variable will update 
     windowWidth = window.innerWidth; 


//if the saved window width is still equal to the current window width do nothing 
     if (savedWindowWidth == windowWidth){ 
      return; 
     } 


//if saved window width not equal to the current window width do something 
     if(savedWindowWidth != windowWidth) { 
      // do something 

      savedWindowWidth = windowWidth; 
     } 

    }); 
6

mam tylko odpowiedź stałych kirisu_kun do korzystania rekwizyt() zamiast attr():

$(window).on('resize', function(){ 
    // If the current active element is a text input, we can assume the soft keyboard is visible. 
    if($(document.activeElement).prop('type') === 'text') { 
     // Logic for while keyboard is shown 
    } else { 
     // Logic for while keyboard is hidden 
    } 
} 
1

Istnieje kilka rzeczy u należy skoncentrować o

  1. Wszystkie miękkie klawiatury wpływają tylko na wysokość, a nie na szerokość.
  2. Znaczniki elementów fokusowych mogą być tekstem wejściowym lub tekstowym.
  3. Wysokość zostanie zmniejszona, gdy element się skupi (lub) wysokość wzrośnie po wyregulowaniu.

Można użyć tych kombinacji, gdy przeglądarka pobiera zmieniany

function getWidth(){ 
return $(window).width(); 
} 

function getHeight(){ 
return $(window).height(); 
} 

function isFocus(){ 
return $(document.activeElement).prop('tagName')=='INPUT' || $(document.activeElement).prop('tagName')=='TEXTAREA'; 
} 

var focused = false; 
var windowWidth=getWidth(),windowHeight=getHeight(); 

//then on resize...  
$(window).resize(function() { 

var tWidth=getWidth(),tHeight=getHeight(),tfocused=isFocus(); 

//if the saved window width is still equal to the current window width do nothing 
if (windowWidth == tWidth && ((tHeight < windowHeight && !focused && tfocused) || (tHeight > windowHeight && focused && !tfocused))){ 
windowWidth=tWidth; 
windowHeight=tHeight; 
focused=tfocused; 
return; 
} 
else{ 
windowWidth=tWidth; 
windowHeight=tHeight; 
focused=tfocused; 

//Your Code Here 

} 
}); 
+1

Otwieranie klawiatury _ może jednak wywołać zmianę powiększenia, co wpłynęłoby na przynajmniej niektóre pomiary szerokości. – lpd

+0

oh ... yaa ... jeśli tak, możemy zmienić warunek. zarówno szerokość jak i wysokość będą się różnić w tym samym czasie z dowolnym skupionym sygnałem wejściowym, prawda? – jafarbtech

+0

Co więcej, przynajmniej w Androidzie chrome/firefox, można odrzucić klawiaturę ekranową bez rozmycia elementu wejściowego. – lpd

1

to pytanie zależy od istnienia niezawodny sposób, aby wykryć, kiedy pojawi się klawiatura ekranowa (lub zniknie) na urządzeniach mobilnych. Niestety nie ma niezawodnego sposobu na wykrycie tego. Podobne pytania pojawiły się kilka razy na SO, z różnymi sztuczkami, sztuczkami i obejściami sugerowanymi (patrz this answer w przypadku linków do kilku istotnych wątków odpowiedzi).

Należy również pamiętać, że zdarzenie zmiany rozmiaru nie zawsze jest wyzwalane po wyświetleniu klawiatury ekranowej (patrz this answer).

Moja ogólna sugestia to wykrycie obecności ekranu dotykowego + wykrywanie, czy aktywny element jest typu, który wyzwala klawiaturę ekranową (coś podobnego do this answer). Jednak takie podejście nadal może się nie udać w przypadku hybrydowych urządzeń Windows (takich jak Surface Pro), w których czasami może być obecna klawiatura ekranowa podczas zmiany rozmiaru przeglądarki, a czasami klawiatura sprzętowa może być używana przy zmianie rozmiaru przeglądarki.

+0

Niestety, doszedłem do tego samego wniosku. Zacząłem próbować anulować domyślne zdarzenie zbliżenia, ale było to [równie bezowocne] (https://bugs.chromium.org/p/chromium/issues/detail?id=181560#c28). – lpd

+0

@lpd, Próbowałem obrócić głowę wokół tego problemu, ale nie mogę znaleźć rozwiązania, które obejmie wszystkie przypadki użycia, o ile nie nastąpi określone zdarzenie wywołane zmianą widoczności klawiatury ekranowej. Oznacza to, że pozostały nam hacki i obejścia, które mogą działać w niektórych, ale nie we wszystkich przypadkach użycia. –

Powiązane problemy