javascript - 通过ajax过滤列表并请求数据

标签 javascript jquery ajax jquery-mobile cordova

我对 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");) 放在第二个 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>

最佳答案

我解决了这个问题。我更改了代码:

     content = content + html;
     $ul.html( content );

  $ul.append( html);

我制作了一个自定义过滤器,并认识到 .then 总是在过滤器开始后被调用。 这真的很奇怪,因为这个方法 listviewbeforefilter 应该在过滤开始之前完成所有操作。我猜这是因为 ajax 需要很长时间并且将被跳过,但稍后在收到响应时返回到 .then 方法。我想也许 async:false 会有所帮助,但没有。

所以基本上它会过滤我的本地数据并隐藏不需要的列表,然后我将收到的数据附加到列表中。

关于javascript - 通过ajax过滤列表并请求数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18948450/

相关文章:

javascript - cometd 事件不那么频繁

javascript - 文件上传后 AJAX 不重定向到网页 - POST 方法

javascript - 根据总和值隐藏点击时的 div

javascript - 使用选项卡时错误地应用了 Bootstrap 轮播事件类

asp.net - Silverlight 中断 JQuery 动画

jquery - 从中心扩大div

javascript - 在变量中获取 JQuery load() 进行验证而不是显示它

javascript - 褪色最新新闻自动收报机

javascript - dojox/dgauges/TextIndicator 中的事件

javascript - Jquery JSON 响应处理