拖动项目并更改其顺序

时间:2014-02-06 16:18:33

标签: javascript jquery jquery-ui jquery-mobile jquery-ui-sortable

背景

我基本上解析包含一些团队名称及其各自ID的数据。例如,我的原始数据看起来像这样 - > teamName(MIAMI HEAT,id1)teamName(NewYork Knicks,id2)。

我根据自己的需要解析了这种数据。因此,一旦用户登录,他们就会被带到欢迎页面,其中包含一个导航菜单,该页面将显示我之前解析的各个团队的名称,如Miami Heat,NewYork Knicks等。我还在导航菜单上为每个团队创建动态页面。因此,例如,如果您点击迈阿密热火,您将进入www.something.com/index.html#id1页面

因此,对于Miami Heat页面的情况,页面ID是原始数据中较早的id1。

这就是我想要实现的目标

所以基本上在我的欢迎页面上,我有一个导航菜单,其中包含我目前能够拖放它们的所有各种团队。例如,如果我的导航菜单包含 迈阿密, 多伦多 纽约。 我可以将多伦多拖到最顶层,这样导航菜单中的顺序就可以了 多伦多 迈阿密 纽约

我想知道我能否反映出页面的实际顺序。因此,如果我将多伦多拖到顶部,当我向左滑动时,多伦多应该出现。如果我将NewYork拖到顶部,那么当我向左滑动NewYork应该出现。

有人可以给我指导如何实现这一点,甚至可能吗?对不起,如果这是一个不好的问题,我是js世界的菜鸟。请原谅我,因为我是自学js。

PS:我目前能够刷卡,但是它是一个随机顺序而没有响应拖放功能。

再次更新代码

<!DOCTYPE html>
<html>
    <head>
    <TITLE>BASKETBALL FANATICO</TITLE>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- Theme CSS -->
    <link rel="stylesheet" type="text/css" href="css/jquery.mobile.flatui.css" />
    <!-- Jquery -->
    <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
    <script src="http://code.jquery.com/mobile/1.4.0/jquery.mobile-1.4.0.js"></script>
    <!-- TEST Jquery -->
    <link rel="stylesheet" type="text/css" href="css/jquery.countdown.css"> 
    <script type="text/javascript" src="js/jquery.countdown.js"></script>

    <!-- Style.css  -->
    <link rel="stylesheet" type="text/css" href="css/style.css">
    <link rel="stylesheet" type="text/css" href="css/style1.css">

    <!-- Testing Drag -->
    <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.min.js"></script>
    <script src="jquery.ui.touch-punch.min.js"></script>
    </head>
    <body>

        <div data-role="page" id="page1">
            <div data-role="header" data-position="fixed">
            <h1>BASKETBALL FANATICO</h1>
            </div>
            <div id="loginfo">
              <h2>Please Enter the Login Credentials</h2>
            </div>
            <form method="GET">
                <div id="username" data-role="fieldcontain">     
                    <input type="text" name="username" placeholder="User Name" />
                </div>
                <div id="password" data-role="fieldcontain">   
                   <input type="password" name="password" id="txtId" placeholder="Password"/>
                </div>
                <div id ="loginbtn">
                    <a data-role="button" id="log" data-theme="b" href="#page2" data-transition="slide">Login</a>
                </div>
            </form>
            <div data-role="footer" data-position="fixed">
                <h1>NBA</h1>
            </div>    
        </div>

        <!-- page 2 -->
        <div data-role="page" id="page2">
            <div data-role="header" data-positiion="fixed">
                <a data-iconpos="notext" href="#panel" data-role="button" data-icon="flat-menu"></a>
                <h1>BASKETBALL FANATICO</h1>
                <a data-iconpos="notext" href="#page2" data-role="button" data-icon="home" title="Home">Home</a>
            </div>

            <div data-role="content"> 
                <ul data-role="listview" data-inset="true">
                    <li data-role="list-divider" data-theme="b">WELCOME!</li>
                    <li>Use the menu on the left to navigate <br />and configure the various options.</li>
                </ul>
            </div>

        </div>

        <div data-role="panel" id="panel"  data-position="left" data-theme="a" data-display="push">
            <div>
                <div id="nav"><h3>Navigation Menu</h3></div>
                <label>
                <input id="chkSort" type="checkbox" checked="true"  />Allow sorting</input>
                </label>
            </div>
            <div id="items" data-role="button">
                <!-- Insert Parsed Teams Here -->
                <a href="#page1" data-transition="fade" data-theme="b" data-role="button">LOG OUT</a>
            </div>
        </div>
    <script>
        var teamNames = new Array();
        var teamId = new Array();

        $( document ).on( "pagecreate", function() {
            $( "body > [data-role='panel']" ).panel().enhanceWithin();
        });

        $(document).on('pagecreate', '#page1', function() {

            $("#log").on('click', function(){
                alert('hellow');
                $.ajax({
                    url: "http://1xx.1xx.0.1xx:8081/script.login",
                        type: "GET",
                        data: { 'page':'create_user', 'access':'user','username':$("input[name='username']").val(), 'password':$("input[name='password']").val()},
                        dataType: "text",
                        success: function (html) {
                            console.log(html);
                            console.log('==============>TESTING');

                            teamNames = new Array();
                            teamId = new Array();
                            var res = html.match(/teamNames(.*);/g);

                            for(var i =0;i<res.length;i++){
                                //alert(res[i]);
                                var temp = res[i].split(',');
                                if(temp.length >= 3){
                                  teamNames[i] = (temp[2].replace('");','')).replace('"','');
                                  teamId[i] = temp[1].replace("'","").replace("'","").replace(/ /g,'');
                                }           
                            }

                            var AllTeams = ''
                            for(var i = 0; i<teamNames.length; i++){
                                AllTeams +='<a href="#'+teamId[i]+'" class="teamLink" data-theme="b" data-role="button" >'+teamNames[i]+'</a>';                         
                                var makePage = $("<div data-role='page' id='"+teamId[i]+"' data-pageindex='"+i+"' class='dynPageClass'><div data-role='header' data-position='fixed'><a data-iconpos='notext' href='#panel' data-role='button' data-icon='flat-menu'></a><h1>BASKETBALL FANATICO</h1><a data-iconpos='notext' href='#page2' data-role='button' data-icon='home' title='Home'>Home</a></div> <div data-role='content'><ul data-role='listview'data-insert='true'><li data-role='list-divider' data-theme='b'>"+teamNames[i]+"</li><li><h2>0</h2></li></ul></div><div data-role='footer' data-position='fixed'><span class='ui-title'><div id='navigator'></div></span></div></div>");

                                makePage.appendTo($.mobile.pageContainer);
                            }
                            $('#items').prepend(AllTeams).trigger('create');
                        }
                });
            });
        });

        $(document).on('pagecreate', '#page2', function() {

            $("#items").sortable({
                  stop: function( event, ui ) {
                      teamNames = [];
                      teamId = [];
                      $(".teamLink").each(function() {
                          var href = $(this).prop('href');
                          var name = $(this).text();
                          var id = href.substr(href.lastIndexOf("#") + 1);
                          teamId.push(id);
                          teamNames.push(name)
                      });
                      alert(teamNames);
                      $("#items").listview('refresh');
                  }
            }).disableSelection();

            $("#chkSort").on("change", function(){
                var sort = $(this).prop("checked");
                if (sort){
                    $( "#items" ).sortable('enable');
                } else {
                    $("#items").sortable('disable');
                }

            });

            $(document).on("swipeleft", "#page2", function() {
               $.mobile.changePage("#"+teamId[0], {transition: "slide", reverse: false});
            });        

            $(document).on("swiperight swipeleft", ".dynPageClass", function(e) {
                var curPageID = $(this).prop("id");
                var ind=0;
                for(var i = 0; i<teamId.length; i++){
                    if (curPageID == teamId[i]){
                        ind = i;
                        break;
                    }
                }

                var topageid = "page2";
                var rev = true;
                if (e.type == 'swiperight'){
                    if (ind > 0){
                        topageid = teamId[ind - 1] ; 
                    }
                } else {
                    rev = false;
                    if (ind < teamId.length - 1){
                        topageid = teamId[ind + 1] ; 
                    }            
                }
                $.mobile.changePage("#" + topageid, {transition: "slide", reverse: rev});
            });         

        });

    </script>
    </body>
</html>

1 个答案:

答案 0 :(得分:2)

jQueryUI的可排序函数提供了一个停止事件,每次排序完成时都会触发该事件。因此,在该事件处理程序中,您按新顺序遍历团队并重建应该是页面上的全局变量的数组。

  

以下是 DEMO (基于其他问题的小提琴)

您的数组在任何函数之外声明,因此它们是全局的。

var teamNames = new Array();
var teamId = new Array();

首先,在列表中添加团队时,您正在使用prepend(),因为您希望保留列表底部的现有注销按钮。这使得您的团队以相反的顺序显示阵列。要更正此问题,您可以像这样添加团队:

var AllTeams = ''
for(var i = 0; i < teamNames.length; i++){
    AllTeams +='<a href="#'+teamId[i]+'" class="teamLink" data-theme="b" data-role="button" >'+teamNames[i]+'</a>';
}
$('#items').prepend(AllTeams).trigger('create');

您正在以正确的顺序将所有团队添加到字符串变量中,然后最后将整个集合添加一次。 注意:我在每个链接中添加了一个名为teamLink的类,因此我可以在排序后轻松迭代它们。

然后是可排序的部分:

$("#items").sortable({
      stop: function( event, ui ) {
          teamNames = [];
          teamId = [];
          $(".teamLink").each(function() {
              var href = $(this).prop('href');
              var name = $(this).text();
              var id = href.substr(href.lastIndexOf("#") + 1);
              teamId.push(id);
              teamNames.push(name)
          });
          $("#items").listview('refresh');
      }
}).disableSelection();

在stop回调中,首先清空2个全局数组,然后使用类teamLink迭代所有链接。从文本中获取href和团队名称中的id并重建阵列。在小提琴中,我添加了一个警报,在每次排序后显示新数组,以便您可以看到新订单。

注意:在您的问题中的代码中,teamID和teamNames在某些地方拼写错误。您也可以在同一个循环中创建页面,将链接添加到面板。