2012-10-10 140 views
9

我有一个jquery mobile和backbone的小手机应用程序。 我试图通过手动调用.popup()方法来向用户显示弹出窗口。jQuery.mobile弹出后立即隐藏显示

一切正常iOS上,但在Android上我得到了奇怪的问题:弹出窗口显示了片刻,不是消失。

这里的实际代码:

var PostView = Backbone.View.extend({ 
    events: { 
    'touchend .add-comment-button': 'addComment' 
    }, 
    addComment: function() { 

    this.$(".comment-popup").popup('open', { history: false }); 

    return false; // Stop bubbling. 
    } 
}); 

我使用的历史:假的,因为这个弹出的子页面actualy一部分。代码看起来很简单,我只是不明白为什么它可以消失,以及为什么这只发生在Android设备上。

谢谢,对不起我的英语不好。

回答

0

的Android 2.3的设备上时,试图使用弹出(“开放”)我有完全相同的问题(无论是在本地浏览器,并在Firefox)和它的作品只是罚款在其他设备上的浏览器。我还使用骨干事件管理来打开我的弹出窗口(使用轻击事件并且没有弹出选项)。

我所做的'纠正'的问题是,我删除了此事件的骨干事件管理并在渲染函数中添加了一个侦听器。在你的情况,这将是这个样子:

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)); 
    } 

我不知道问题出在哪里来自(必须是骨干和jQuery移动之间的一些不兼容),为什么我们只看到它在Android,但在目前与这个解决方法我的应用似乎在任何设备上都能正常工作。

编辑:哎呀,事实证明,在我的情况下,问题是我错过了“返回false;”在处理事件的函数中。 现在我添加了它,它可以与骨干事件管理一起正常工作。 不幸的是,这并不能解释为什么你有这个问题,为什么我只在android上看到它。

4

我花了数小时试图解决这个问题。

最后我落得这样做,似乎解决问题以下两件事情。

1 - 使用未压缩的jqm文件。即jquery.mobile.1.2.0.js

2 - 我用'tap'选项以编程方式触发弹出 - 一旦改变为'click'选项,它就起作用了。

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

我没有使用Backbone,而在我的应用程序中,问题出现在iOS(6.0.1),而不是Android(4.0.3)(jQuery Mobile版本是1.2)上。我只需要第2步 - 切换到“点击”事件来解决它。为我工作的另一种解决方案 - 允许我坚持使用触摸事件 - 在最终调用'popup('open')'的事件处理程序的开始事件对象上调用preventDefault()'。 – mklement0

+0

这个问题仍然出现在JQueryMobile 1.4.5 - 从'tab'改为'click'也为我解决了它。 – Barsum

0

在情况下,它可以帮助任何人,我有同样的问题与Bing地图出现,与Microsoft.Maps.Events.addHandler(pin, 'click', callback)方法。

不是特别漂亮,而是我存储在pushpin._id的ID,并做了以下内容:

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

我不喜欢改变我.tap()事件的单击事件,我没有有一种情况我可以使用preventDefault(),所以我只是给弹出窗口('open')添加了一个超时。我在jqm中的hoverdelay设置为150,所以我将这个超时设置为600,以保证安全。工作正常,对用户不感觉迟缓。

3

我花了几个小时试图解决这个问题。

最后我落得这样做,似乎解决问题以下两件事情。

此代码段可以帮助你 - >

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

请注意我用e.perventDefault().

0

一个蛮力选项是check whether popup was hidden并重新打开它。

在循环中,因为弹出窗口隐藏的确切时间似乎有所不同。

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

工作的示例:http://jsfiddle.net/ArtemGr/hgbdv9s7/

另一种选择可能是绑定到popupafterclose

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

喜欢这里:http://jsfiddle.net/ArtemGr/gmpczrdm/

但由于某些原因,popupafterclose结合不火在iPhone 4的一半时间。