JQuery Mobile 1.3.1“$.mobile.loading”不工作

Posted

技术标签:

【中文标题】JQuery Mobile 1.3.1“$.mobile.loading”不工作【英文标题】:JQuery Mobile 1.3.1 "$.mobile.loading" not working 【发布时间】:2013-04-23 00:10:48 【问题描述】:

我有以下代码:

HTML:

<link rel="stylesheet" href="js/jquery.mobile-1.3.1.min.css"/>
<script src="js/jquery-1.9.1.min.js"></script>
<script src="js/jquery.mobile-1.3.1.min.js"></script>

JS:

$(document).on(
  ajaxStart: function()  
    $.mobile.loading('show');
    console.log('getJSON starts...');
  ,
  ajaxStop: function() 
    $.mobile.loading('hide');
    console.log('getJSON ends...');
      
);

我目前正在使用 Jquery Mobile 1.3.1 并在 mozilla firefox 和 google chrome 中测试此代码。稍后我将在 phonegap 应用中使用它。

我正在加载 JSON 并在列表视图的屏幕上显示它。加载时,我希望程序显示“加载微调器”。控制台日志显示 ajaxStart 正在触发,但屏幕上的任何地方都没有可视微调器。

我做错了什么?请帮忙!

提前致谢。

【问题讨论】:

【参考方案1】:

哪些 jQuery Mobile 文档缺少有关成功执行的信息:

$.mobile.loading('show');

$.mobile.loading('hide');

他们将在 pageshow 活动期间显示ONLY。在任何其他情况下,您需要将它们包装到 setinterval 中,如下所示:

如果您对 pageshow 和其他 jQuery Mobile 页面事件一无所知,请查看此 ARTICLE,这是我的个人博客.或者找到它HERE

首先,如果没有设置间隔,您将无法显示/隐藏 AJAX 加载程序。只有在一种情况下这是可能的,那就是在 pageshow 事件期间。在任何其他情况下,都需要 setinterval 来启动加载程序。

这是一个工作示例:http://jsfiddle.net/Gajotres/Zr7Gf/

    var interval = setInterval(function()
        $.mobile.loading('show');
        clearInterval(interval);
    ,1);    

    var interval = setInterval(function()
        $.mobile.loading('hide');
        clearInterval(interval);
    ,1);      

【讨论】:

非常感谢,我看不到提供的示例工作,但我在您的帮助下完成了我的工作! @Gajotres - 愿 SO 领主授予您最高的声誉:P 这个答案是救命稻草!【参考方案2】:

将其包装在 setTimeout 中有效。我只有一个简单的功能:

function loading(showOrHide) 
    setTimeout(function()
        $.mobile.loading(showOrHide);
    , 1); 

然后在你想显示或隐藏微调器时调用它:

loading('show');

loading('hide');

这是一个愚蠢的 jsfiddle:http://jsfiddle.net/7UpW5/

【讨论】:

可以。从“beforeSend: func ...”调用它。另外,添加“async: false”参数。【参考方案3】:

在 AJAX 调用内部? (但可以在任何地方工作)

$.ajax( url: ..., 
    type:'post', dataType:'json',
    data: d: ... , 
    beforeSend: function()  fSpinner('show'); ,
    complete: function() fSpinner('hide'); ,
    success: function( res )...,
    error: function(e) alert('Error: ' + e.responseText) 
);

还有函数本身:

function fSpinner( strShowOrHide ) 
    setTimeout( function()
        $.mobile.loading( strShowOrHide );
    , 1); 

【讨论】:

【参考方案4】:

其他答案的代码对我不起作用并且不完整(例如,如果您想最终传递参数只需使用布尔值@987654321 @ 用于切换。 以下提供了一种很好的方法:

/** workaround: $.mobile.loading not working correctly: http://***.com/a/17725350 */
function showLoading( on, params )   // on: true|false
    setTimeout( function() 
      if ( on )
        $.mobile.loading( "show", params );
      else 
        //$.mobile.loading( "hide" );  // does not seem to work (e.g. using with GWT and jQM 1.4.3)
        $('.ui-loader').remove();  // removes the loader div from the body
             
    , 1);

像这样使用它:

showLoading( true );  // show loader
showLoading( false );  // hide loader

【讨论】:

以上是关于JQuery Mobile 1.3.1“$.mobile.loading”不工作的主要内容,如果未能解决你的问题,请参考以下文章

从函数外部调用时函数不返回值?

jQuery Mobile 1.3.1 taphold 事件多次触发

JQuery $.each() - 努力获取对象的键值对

公共库

Knockout.js 和 Jquery Mobile

来自 jQuery Mobile 的面板