正确使用JQuery-Mobile/Phonegap的方法?

Juw*_*Juw 107 jquery jquery-mobile cordova

将JQuery Mobile和Phonegap一起使用的正确方法(截止日期)是什么?

两个框架都需要在可以使用之前加载.在使用它们之前,我怎么能确定它们都已加载?

Oct*_*ian 174

您可以使用JQuery的延迟功能.

var deviceReadyDeferred = $.Deferred();
var jqmReadyDeferred = $.Deferred();

document.addEventListener("deviceReady", deviceReady, false);

function deviceReady() {
  deviceReadyDeferred.resolve();
}

$(document).one("mobileinit", function () {
  jqmReadyDeferred.resolve();
});

$.when(deviceReadyDeferred, jqmReadyDeferred).then(doWhenBothFrameworksLoaded);

function doWhenBothFrameworksLoaded() {
  // TBD
}
Run Code Online (Sandbox Code Playgroud)

  • 对于那些说它不起作用的人 - 声明脚本的顺序很重要.首先包括jquery,然后是脚本元素中的那个代码,然后是jquery mobile js. (7认同)
  • 你能详细说明一下吗?文件引用的层次结构是什么样的?谢谢 (4认同)
  • 我无法使用jQM 1.3和PG 2.5 (4认同)
  • 这个答案应该获得更多的选票并被标记为正确的选票. (3认同)
  • 请问,您能否使用最新版本添加脚本加载的顺序? (2认同)

小智 17

基于上面的例子,这是它对我有用的方式

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <meta name="format-detection" content="telephone=no" />
        <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
        <link rel="stylesheet" type="text/css" href="css/bootstrap.css" />
        <title>InforMEA</title>
    </head>
    <body>
        <script type="text/javascript" src="js/jquery-1.8.3.js"></script>
        <script type="text/javascript">
            var dd = $.Deferred();
            var jqd = $.Deferred();
            $.when(dd, jqd).done(doInit);

            $(document).bind('mobileinit', function () {
                jqd.resolve();
            });
        </script>
        <script type="text/javascript" src="js/jquery.mobile-1.2.0.js"></script>
        <script type="text/javascript" src="cordova-2.2.0.js"></script>
        <script type="text/javascript">
            document.addEventListener('deviceready', deviceReady, false);
            function deviceReady() {
                dd.resolve();
            }

            function doInit() {
                alert('Ready');
            }
        </script>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)


Cod*_*LaY 7

为了使用phonegap和jquery mobile,你需要像这样使用它

<head>
<title>Index Page</title>

<!-- Adding viewport -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, user-scalable=no">

<!-- Adding jQuery scripts -->
<script type="text/javascript" src="jquery/jquery-1.7.1.min.js"></script>

<!-- Since jQuery Mobile relies on jQuery core's $.ajax() functionality,
 $.support.cors & $.mobile.allowCrossDomainPages must be set to true to tell
 $.ajax to load cross-domain pages. -->
<script type="text/javascript">
    $(document).bind("mobileinit", function() {
        $.support.cors = true;
        $.mobile.allowCrossDomainPages = true;
    });
</script>

<!-- Adding Phonegap scripts -->
<script type="text/javascript" charset="utf-8"
    src="cordova/cordova-1.8.0.js"></script>

<!-- Adding jQuery mobile scripts & CSS -->
<link rel="stylesheet" href="jquerymobile/jquery.mobile-1.1.0.min.css" />
<script type="text/javascript"
    src="jquerymobile/jquery.mobile-1.1.0.min.js"></script>

</head>
<script type="text/javascript">
    // Listener that will invoke the onDeviceReady() function as soon as phonegap has loaded properly
    document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
        navigator.splashscreen.hide();

        document.addEventListener("backbutton", onBackClickEvent, false); // Adding the back button listener    

    }
    </script>
<body>
<div data-role="page" id="something" data-ajax="false">
        <script type="text/javascript">
            $("#something").on("pageinit", function(e) {

            });

            $("#something").on("pageshow", function(e) {

            });

            $("#something").on("pagebeforeshow", function(e) {

            });
        </script>

        <div data-role="header">            
        </div>

        <div data-role="content">           
        </div>      
    </div>
</body>  
Run Code Online (Sandbox Code Playgroud)


小智 6

正如许多人建议使用延迟是一个好的选择,只要你不关心什么顺序devicereadymobileinit发生.但在我的情况下,我需要一些pageshow事件,当应用程序首次加载,mobileinit并通过扩展这些pageshow/ pagebeforeshow/ etc事件是所有在deviceready完成之前解雇,所以我无法使用延迟对它们进行正确绑定.这种竞争条件不是一件好事.

我需要做的是确保'mobileinit'在' deviceready'已经被解雇之后才发生.因为mobileinit当你加载JQM时立即触发我选择jQuery.getScript用来加载它后AFTER deviceready已经完成了.

<script src="cordova-2.2.0.js"></script>
<script src="js/jquery-1.8.2.min.js"></script>
<script src="js/async.min.js"></script>
<script src="js/app.js"></script>
<script>
  document.addEventListener(
    'deviceready',
    function () {
      $('body').css('visibility', 'hidden');
      $(document).one("mobileinit", function () {
        app.init();
        $('body').css('visibility', '');
      });
      $.getScript('js/jquery.mobile-1.2.0.min.js');
    },
    false
  );
</script>
Run Code Online (Sandbox Code Playgroud)

我隐藏正文的原因是,在加载jquery.mobile之前,此方法的副作用是原始HTML文档可见性的半秒.在这种情况下,隐藏它需要额外半秒的空白空间来查看未标注的文档.