【问题标题】:JQuery Mobile 1.3.1 "$.mobile.loading" not workingJQuery Mobile 1.3.1“$.mobile.loading”不工作
【发布时间】: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 正在触发,但屏幕上的任何地方都没有可视微调器。

我做错了什么?请帮忙!

提前致谢。

【问题讨论】:

    标签: javascript jquery css cordova jquery-mobile-loader


    【解决方案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://stackoverflow.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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多