While generally we try to avoid native browser alert() and confirm() we sometimes have no control over their use. I have come across a situation where working in a Native iOS app that a certain call caused a confirm dialog to pop up. This call was triggered from a tap event on a custom button.
Here’s an example of what happens:
This scenario was done on iOS Simulator 5.1 iPad mode with the app on the home screen.
Mobile Safari exhibits the same results.
Console logging/remote debugging is provided by weinre
The code behind this:
Ext.define("Storefront.view.Test", { extend : 'Ext.Container', xtype : 'test', config : { centered : true, tpl : '<div class="sf-button sf-button-main">Hello World</div>', data : {} }, initialize : function() { this.callParent(); this.element.on({ tap : this.onTap, touchstart : this.onTouchStart, touchend : this.onTouchEnd, delegate : '.sf-button' }); }, onTap : function(evtObj) { alert('button tapped'); }, onTouchStart : function(evtObj) { console.log('touchstart fired ' + evtObj.getTime()); var btn = evtObj.getTarget('.sf-button'); if(btn) { Ext.fly(btn).addCls("sf-button-pressed-main"); } }, onTouchEnd : function(evtObj) { console.log('touchend fired ' + evtObj.getTime()); var btn = evtObj.getTarget('.sf-button'); if(btn) { Ext.fly(btn).removeCls("sf-button-pressed-main"); } } });
To alleviate this issue, all we have to do is wrap the alert in a setTimeout
. The setTimeout
forces the function to execute after the touch event cycle has fully completed.
onTap : function(evtObj) { setTimeout(function() { alert('button tapped'); }, 0); }
Further reading:
Stan Bershadskiy
Related Posts
-
Touch DJ - A Sencha Touch DJ App
During the DJing with Sencha Touch talk at SenchaCon 2013 we finally unveiled and demonstrated…
-
Touch DJ - A Sencha Touch DJ App
During the DJing with Sencha Touch talk at SenchaCon 2013 we finally unveiled and demonstrated…