I can't seem to find a solution for this problem.
I have a simple input field like this.
<div class="search">
<input type="text" value="y u no work"/>
</div>
And I'm trying to focus()
it inside a function.
So inside of a random function (doesn't matter what function it is) I have this line …
$('.search').find('input').focus();
This works just fine on every Desktop whatsoever.
However it doesn't work on my iPhone. The field is not getting focused and the keyboard is not shown on my iPhone.
For testing purposes and to show you guys the problem I did a quick sample:
$('#some-test-element').click(function() {
$('.search').find('input').focus(); // works well on my iPhone - Keyboard slides in
});
setTimeout(function() {
//alert('test'); //works
$('.search').find('input').focus(); // doesn't work on my iPhone - works on Desktop
}, 5000);
Any idea why the focus()
wouldn't work with the timeout function on my iPhone.
To see the live example, test this fiddle on your iPhone. http://jsfiddle.net/Hc4sT/
Update:
I created the exact same case as I'm currently facing in my current project.
I have a select-box that should — when "changed" — set the focus to the input field and slide-in the kexboard on the iphone or other mobile devices. I found out that the focus() is set correctly but the keyboard doesn't show up. I need the keyboard to show up.
I uploaded the testfiles right here http://cl.ly/1d210x1W3Y3W … If you test this on the iphone you can see that the keyboard doesn't slide-in.
Please try using on-tap instead of ng-click event. I had this issue. I resolved it by making my clear-search-box button inside search form label and replaced ng-click of clear-button by on-tap. It works fine now.
Actually, guys, there is a way. I struggled mightily to figure this out for http://forstartersapp.com (try it on an iPhone or iPad).
Basically, Safari on touchscreen devices is stingy when it comes to
focus()
ing textboxes. Even some desktop browsers do better if you doclick().focus()
. But the designers of Safari on touchscreen devices realized it's annoying to users when the keyboard keeps coming up, so they made the focus appear only on the following conditions:1) The user clicked somewhere and
focus()
was called while executing the click event. If you are doing an AJAX call, then you must do it synchronously, such as with the deprecated (but still available)$.ajax({async:false})
option in jQuery.2) Furthermore -- and this one kept me busy for a while --
focus()
still doesn't seem to work if some other textbox is focused at the time. I had a "Go" button which did the AJAX, so I tried blurring the textbox on thetouchstart
event of the Go button, but that just made the keyboard disappear and moved the viewport before I had a chance to complete the click on the Go button. Finally I tried blurring the textbox on thetouchend
event of the Go button, and this worked like a charm!When you put #1 and #2 together, you get a magical result that will set your login forms apart from all the crappy web login forms, by placing the focus in your password fields, and make them feel more native. Enjoy! :)
I have a search form with an icon that clears the text when clicked. However, the problem (on mobile & tablets) was that the keyboard would collapse/hide, as the
click
event removedfocus
was removed from theinput
.Goal: after clearing the search form (clicking/tapping on x-icon) keep the keyboard visible!
To accomplish this, apply
stopPropagation()
on the event like so:And the HTML form:
This solution works well, I tested on my phone:
enjoy
UPDATE
I also tried this, but to no avail:
});
I am confused as to why you say this isn't working because your JSFiddle is working just fine, but here is my suggestion anyway...
Try this line of code in your SetTimeOut function on your click event:
myInput correlates to the name attribute of the input tag.
And use this code to blur the field:
I managed to make it work with the following code:
I'm using AngularJS so I have created a directive which solved my problem:
Directive:
How to use the directive:
It looks like you are using jQuery, so I don't know if the directive is any help.