私はjavascriptとphonegapが初めてで、一日中ここに座ってこの問題を解決しようとしています.
リストがあり、一部のデータをフィルタリングしたい。フィルタリングする前に、サーバーからデータをダウンロードしてリストに追加したいと思います。(リストはローカルであり、誰かが検索機能を使用すると、新しいデータもポップアップするはずです)。
アイデアは、jquery でリストを作成し、listviewbeforefilter-event を使用してサーバーからデータをダウンロードし、リストに追加することです。次に、jquery はリストをフィルタリングする必要があります。
2文字のフィルターを検索するとうまくいきます。
しかし、2文字以上を検索すると、これは期待どおりに機能しません。サーバーから正しいデータを受信し、リストに追加されますが、元のリストにはフィルタリングがありません。だから、元のリストとロードされたデータが表示されます。また、console.log("second") が最初に表示され、次に console.log("first) が表示されます。どういうわけか、jquery/phonegap は .then 部分をスキップしてから戻ってきます。
3 行 ($ul.html( content );$ul.listview( "refresh" );$ul.trigger( "updatelayout");) を 2 番目の console.log の下に配置してから、ローカルのフィルターを配置しようとしましたデータは機能しますが、サーバーからのデータは表示されません。
誰かがこの奇妙な問題で私を助けてくれることを願っています.
listviewbeforefilter-event のコードは次のとおりです。
<html>
<head>
<meta charset="utf-8">
<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" />
<title>Listview Autocomplete - jQuery Mobile Demos</title>
<link rel="stylesheet" href="css/jquery.mobile-1.3.2.min.css" />
<script src="cordova.js"></script>
<script src="js/jquery-2.0.3.min.js"></script>
<script src="js/jquery.mobile-1.3.2.min.js"></script>
<script>
$( document ).on( "pageinit", "#myPage", function() {
$( "#autocomplete" ).on( "listviewbeforefilter", function ( e, data ) {
// this is a second list which is a backup. It is needed because after each search the original list is flooded with old entries.
var content = document.getElementById("autocomplete2").innerHTML;
var requestdata = "";
var $ul = $( this );
$input = $( data.input ),
value = $input.val();
// ajax call returns cities with at least 3 characters
if ( value && value.length > 2 ) {
$.ajax({
url: "http://gd.geobytes.com/AutoCompleteCity",
dataType: "jsonp",
crossDomain: true,
data: {
q: $input.val()
}
})
// The response is saved in html which i append to the original content
.then( function ( response ) {
var html = "";
console.log("first");
$.each( response, function ( i, val ) {
html += "<li>" + val + "</li>";
});
content = content + html;
$ul.html( content );
$ul.listview( "refresh" );
$ul.trigger( "updatelayout");
});
console.log("second");
}
});
});
</script>
そして、それはリストを含む本体です:
</head>
<body>
<div data-role="page" id="myPage">
<div data-role="header" data-theme="f">
<h1>Listview </h1>
</div><!-- /header -->
<div data-role="content">
<div class="content-primary">
<ul id = "autocomplete" data-role="listview" data-filter="true" data-filter-placeholder="Search people..." data-filter-theme="d"data-theme="d" data-divider-theme="d">
<li data-role="list-divider">A</li>
<li><a href="index.html">Adam Kinkaid</a></li>
<li><a href="index.html">Alex Wickerham</a></li>
<li><a href="index.html">Avery Johnson</a></li>
</ul>
</div><!--/content-primary -->
</div><!-- /content -->
<script type="text/javascript" charset="utf-8">
$(function(){
$( "#autocomplete2" ).hide();
});
</script>
<ul id = "autocomplete2" data-role="listview" data-filter-theme="d"data-theme="d" data-divider-theme="d">
<li data-role="list-divider">A</li>
<li><a href="index.html">Adam Kinkaid</a></li>
<li><a href="index.html">Alex Wickerham</a></li>
<li><a href="index.html">Avery Johnson</a></li>
</ul>
</div><!-- /page -->
</body>
</html>