9 ответов:
вы можете использовать отложенную функцию 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 }
вот как это работает для меня, основываясь на примере выше
<!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>
чтобы использовать 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>
поскольку многие люди предложили использовать отложенный вариант, это нормально, если вам все равно, какой заказ
devicereadyиmobileinithappe in. Но в моем случае мне нужно было несколькоpageshowсобытия при первой загрузке приложения иmobileinitи ихpageshow/pagebeforeshow/etc события все стреляли раньшеdevicereadyготово, поэтому я не мог правильно привязаться к ним, используя отложенный на них. Это состояние гонки не было хорошей вещью.что мне нужно было сделать, так это убедиться, что 'mobileinit' это произошло только после'
devicereadyуже был уволен. Потому чтоmobileinitсрабатывает сразу же при загрузке JQM я решил использоватьjQuery.getScriptчтобы загрузить его после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>причина, по которой я скрываю тело, заключается в том, что побочным эффектом этого метода является половина секунды видимости исходного HTML-документа перед jquery.мобильные грузы. В этом случае сокрытие его на дополнительные полсекунды пустого пространства предпочтительнее, чем просмотр неструктурированного документа.
Я считаю, что нет необходимости использовать отложенную функцию. (Может быть, это не обязательно с более новыми версиями phonegap?) У меня есть это в голове моего индекса.HTML-файл и все работает нормально. Я думаю, что порядок включения jquery, phonegap и jQuery mobile важны.
<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" /> <!-- Adding jQuery --> <script type="text/javascript" src="js/jquery-1.9.1.min.js"></script> <!-- Add Phonegap scripts --> <script type="text/javascript" src="phonegap.js"></script> <!-- Add jQuery mobile --> <link rel="stylesheet" href="css/jquery.mobile-1.3.2.css" /> <script type="text/javascript" src="js/jquery.mobile-1.3.2.min.js"></script> <title>MY TITLE</title> </head>
это работает для меня. база на dhaval, этот пример, когда я учусь с помощью sqlite
<!DOCTYPE html> <html> <head> <title>Cordova Sqlite+Jquery</title> <script type="text/javascript" charset="utf-8" src="js/jquery-1.8.3.min.js"></script> <script type="text/javascript" charset="utf-8" src="cordova-2.2.0.js"></script> <script type="text/javascript" charset="utf-8">` // Call onDeviceReady when Cordova is loaded. // // At this point, the document has loaded but cordova-1.8.0.js has not. // When Cordova is loaded and talking with the native device, // it will call the event `deviceready`. // function onLoad() { document.addEventListener("deviceready", onDeviceReady, false); } // Populate the database // function populateDB(tx) { tx.executeSql('DROP TABLE IF EXISTS DEMO'); tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)'); tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")'); tx.executeSql('INSERT INTO DEMO (id, data) VALUES (2, "Second row")'); } // Query the database // function queryDB(tx) { tx.executeSql('SELECT * FROM DEMO', [], querySuccess, errorCB); } // Query the success callback // function querySuccess(tx, results) { var len = results.rows.length; //console.log("DEMO table: " + len + " rows found."); $('#result').html("DEMO table: " + len + " rows found."); var listval = ''; for (var i=0; i<len; i++){ //console.log("Row = " + i + " ID = " + results.rows.item(i).id + " Data = " + results.rows.item(i).data); listval += '<li>'+ results.rows.item(i).data + '[' + results.rows.item(i).id + '] </li>'; } $('#listItem').html(listval); } // Transaction error callback // function errorCB(err) { console.log("Error processing SQL: "+err.code); } // Transaction success callback // function successCB() { var db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000); db.transaction(queryDB, errorCB); } // Cordova is loaded and it is now safe to make calls Cordova methods // function onDeviceReady() { // Now safe to use the Cordova API //alert('ready'); var db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000); db.transaction(populateDB, errorCB, successCB); //$('#result').html('hello'); } </script> </head> <body onload="onLoad()"> <div>result:</div><div id="result"></div> <ul id="listItem"> </ul> </body> </html>
чтобы построить ответ @Jeffrey's, я нашел гораздо более чистый способ, который скрывает разметку HTML, пока JQM не закончит обработку страницы и не отобразит первый элемент страницы, так как я заметил, что 1/2 секунды мерцания голой разметки перед отображением JQM.
вам нужно только скрыть всю разметку с помощью css...PageShow () от JQM будет переключать видимость для вас.
//snip <style type="text/css"> .hide { display:none; } </style> //snip - now the markup notice the hide class <div id="page1" data-role="page" class="hide"> //all your regular JQM / html form markup </div> //snip -- down to the end of /body <script src="cordova-2.2.0.js"></script> <script src="js/jquery-1.8.2.min.js"></script> <script> document.addEventListener( 'deviceready', function () { $(document).one("mobileinit", function () { //any JQM init methods }); $.getScript('js/jquery.mobile-1.2.0.min.js'); }, false); </script>
следующее работало для меня на PG 2.3 и JQM 1.2, ВКЛ. Плагин Facebook Connect:
<head> <script src="./js/jquery-1.8.2.min.js"></script> <script> $.ajaxSetup({ dataType : 'html' }); var dd = $.Deferred(); var jqd = $.Deferred(); $.when(dd, jqd).done(function() { FB.init({ appId: auth.fbId, nativeInterface: CDV.FB, useCachedDialogs: false }); }); $(document).bind('mobileinit', function () { jqd.resolve(); }); </script> <script src="./js/jquery.mobile-1.2.0.min.js"></script> <script> $.mobile.loader.prototype.options.text = "loading"; $.mobile.loader.prototype.options.textVisible = true; $.mobile.loader.prototype.options.theme = "a"; $.mobile.loader.prototype.options.html = ""; $.mobile.ajaxEnabled = false; $.mobile.allowCrossDomainPages = true; $.support.cors = true; $('[data-role=page]').live('pagecreate', function(event) { tpl.renderReplace('login', {}, '#content-inner', function() { auth.init(); }); }); </script> <script src="./js/cordova-2.3.0.js"></script> <script src="./js/cdv-plugin-fb-connect.js"></script> <script src="./js/facebook_js_sdk.js"></script> <!--some more scripts --> <script> document.addEventListener('deviceready', function() { dd.resolve(); }, false); </script> <head>
загрузка PhoneGap немного отличается от загрузки jQuery. jQuery работает больше как библиотека утилит, поэтому вы включаете ее, и она доступна для немедленного использования. С другой стороны, PhoneGap требует поддержки собственного кода для правильной инициализации, поэтому он не готов к использованию вскоре после включения в страницу.
Phonegap предлагает зарегистрироваться и ждать
devicereadyсобытие, выполняющее любой собственный код.<!DOCTYPE html> <html> <head> <title>PhoneGap Example</title> <script type="text/javascript" charset="utf-8" src="lib/jquery.min.js"></script> <script type="text/javascript"> // jquery code here </script> <script type="text/javascript" charset="utf-8" src="lib/android/cordova-1.7.0.js"></script> <script type="text/javascript" charset="utf-8"> function onLoad(){ document.addEventListener("deviceready", onDeviceReady, false); } // Cordova is ready function onDeviceReady() { // write code related to phonegap here } </script> </head> <body onload="onLoad()"> <h1>Phonegap Example</h1> </body> </html>для получения дополнительной информации проверить doc
Comments