Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is blur event not fired in iOS Safari Mobile (iPhone / iPad)?

Tags:

I've two event handlers bound to an anchor tag: one for focus and blur.

The handlers fire on desktop, but in iphone and ipad only focus is fired correctly. Blur is not fired if I click outside the anchor tag (blur fires only when I click some other form elements in the page):

    $("a").focus(function(){         console.log("focus fired");     });      $("a").blur(function(){         console.log("blur fired");     });  

HTML:

<html> <form>     <a href="#">test link</a>     <div>     <input type="text" title="" size="38" value="" id="lname1" name="" class="text">     </div>     <div style="padding:100px">         <p>test content</p>     </div> </form> </html> 
like image 977
Mohamed Hussain Avatar asked Nov 21 '12 12:11

Mohamed Hussain


People also ask

How do you stop event blurs?

If you want to prevent the blur event from being fired, you have to do so when you are inside the mousedown event, you can do so by invoking the method preventDefault() on the event. Click the checkbox, focus input & then click the button, the textfield never loses focus now.


2 Answers

If an anchor has any events attached, the first tap on it in iOS causes the anchor to be put into the hover state, and focused. A tap away removes the hover state, but the link remains focused. This is by design. To properly control an application on iOS, you need to implement touch-based events and react to those instead of desktop ones.

There is a complete guide to using Javascript events in WebKit on iOS.

like image 53
Nicholas Shanks Avatar answered Oct 16 '22 01:10

Nicholas Shanks


If you're working with touch devices you can use the touchleave or touchend event to handle when the user clicks outside the area.

$("a").on('touchleave touchcancel', function () {       // do something }); 

For this to work you need to update your focus function to listen for an on click event as follows

$("a").on("click", function (e) {       if(e.handled !== true) {             e.handled = true       } else {             return false       }       // do something  }) 
like image 22
sains23 Avatar answered Oct 16 '22 01:10

sains23