jQuery.mobile popup immediately hides after showing

I have a small phonegap application with jquery mobile and backbone.
I’m trying to show popup to user by manually calling .popup() method.

Everything works fine on iOS but on android I got strange issue: popup is showing for few moments and than disappear.

  • How to disable the collapsing of an ExpandableListView?
  • 'Open Declaration' in Eclipse navigates to class files instead of to source files for Android Libraries
  • Difference between targetSdkVersion and Project build target
  • Enable email keyboard on android for input type email
  • Make activity animate from top to bottom
  • How to implement a “Two Finger Drag” gesture on Android?
  • Here the actual code:

    var PostView = Backbone.View.extend({
      events: {
        'touchend .add-comment-button': 'addComment'
      },
      addComment: function() {
    
        this.$(".comment-popup").popup('open', { history: false });
    
        return false; // Stop bubbling.
      }
    });
    

    I’m using history: false because this popup is actualy part of subpage.
    The code looks very simple, I’m just can’t understand why it can disappear, and why this happen only on android devices.

    Thanks, and sorry for my bad english.

    Related posts:

    Is Android layout really exponentially hard?
    Android JNI not packed in APK
    Why does GoogleMap.animateCamera() crash after onGlobalLayout()?
    EditText hint visibile while transition
    Cannot refresh/update listview in a fragment from another fragment in ViewPager
    ORMLite on Android not calling onCreate
  • Android Maps Library V2 zoom controls custom position
  • GridView inside Expandable list in android
  • Is it normal for the “activity.onCreate()” method to be called multiple times
  • How to attribute an icon that uses “Creative Commons (Attribution 3.0 Unported)” licensing?
  • Does Android support scaling Video?
  • How to convert a color integer to a hex String in Android?
  • 7 Solutions collect form web for “jQuery.mobile popup immediately hides after showing”

    I spent hours trying to fix this problem.

    Finally I ended up doing the following two things that seemed to fix the problem.

    1 – Use the uncompressed jqm file. i.e jquery.mobile.1.2.0.js

    2 – I was triggering the popup programatically using the ‘tap’ option – once changed to the ‘click’ option it worked.

    $('.option').live('click', function() {
        $('#popup-div').popup('open');
    }); 
    

    I spent hours trying to fix this problem.

    Finally I ended up doing the following two things that seemed to fix the problem.

    this code snippet may help you ->

    $('#testBtn').on('tap',function(e){
       console.log("button clicked");
       e.preventDefault();
       $('#testPOPUP').popup("open");
    });
    

    Please note i have used e.perventDefault().

    I didn’t feel like changing my .tap() events to the click event and I didn’t have a case where I could use preventDefault()so I just added a timeout to the popup(‘open’) line. My hoverdelay in jqm is set to 150 so I set this timeout to 600 just to be on the safe side. Works fine, doesn’t feel sluggish for the user.

    One way to ‘fix’ it is by setting data-history="false" on the popup div

    See also this question

    JQuery Mobile popup with history=false autocloses

    I have the exact same problem when trying to use popup(‘open’) on an android 2.3 device (both in native browser and in firefox) and it works just fine on browsers on other devices. I’m also using backbone event management to open my popup (used the tap event and no aditionnal options to popup).

    What I did to ‘correct’ the problem is that I removed the backbone event management for this event and added a listener in the render function. In your case this would look something like this :

        events: {
           // 'touchend .add-comment-button': 'addComment'
        },
        render: function() {
                $(this.el).html(this.template(this.model));
                $(this.el).find('.add-comment-button').tap(function(el){
                    this.addComment(el);
                    return false;
                }.bind(this));
        }
    

    I have no idea where the problem comes from (must be some incompatibility between backbone and jquery mobile) and why we only see it on android but for the moment with this workaround my app seems to work fine on any device.

    Edit: oops, it turns out that in my case the problem was I was missing “return false;” in the function dealing with the event.
    Now that I added it, it works correctly with the backbone event management.
    Sadly that doesn’t explain why you have the issue and why I was seeing it only on android.

    In case it helps anyone, I had the same problem occurring with Bing Maps, with the Microsoft.Maps.Events.addHandler(pin, 'click', callback) method.

    Not particularly nice, but instead I stored an ID in pushpin._id and did the following:

    $("#page").on('vclick', function (event) {
        if (event.target.parentElement.className === "MapPushpinBase") {
            $("#stopPopup").popup('open');
        }
    });
    

    One brute force option is to check whether popup was hidden and reopen it.

    In a loop, because the exact time the popup becomes hidden seems to be varied.

    var hidden = $('#' + id + '-popup') .hasClass ('ui-popup-hidden')
    if (hidden) $('#' + id) .popup ('open')
    

    A working example: http://jsfiddle.net/ArtemGr/hgbdv9s7/

    Another option could be to bind to popupafterclose:

    var reopener = function() {$('#' + id) .popup ('open')}
    $('#' + id) .on ('popupafterclose', reopener)
    $('#' + id) .popup ('open')
    

    Like here: http://jsfiddle.net/ArtemGr/gmpczrdm/

    But for some reason the popupafterclose binding fails to fire on iPhone 4 half of the time.

    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.