jQuery移动更改页面上点击动态创建列表(数据来自JSON)

jQuery Mobile Change page on click at dynamically created list (data from JSON)

本文关键字:列表 创建 数据 JSON 动态 移动 jQuery      更新时间:2023-09-26

我是编程新手,在编辑js脚本以使事情正常工作方面获得了一些帮助。

使用:jquery.mobile-1.4.5。

我想实现这个格式(4级):

  1. 主要分类->网格按钮布局
  2. 一级子类-> listview(使用JSON动态创建)
  3. 第二级子类别-> listview(使用JSON动态创建)
  4. 第三级详细信息->基本html显示*一些第一级类别可能没有第二级类别,将直接跳转到显示第三级详细信息

目前,我设法使主要类别和第一级子类别按要求显示。但是,我不能让第一级列表视图正确显示第二级列表视图。

JSON数据:

var info = [
    //main categories: display as grid buttons
    {"id": 0, "parent": null, "policyName": "0", "policyImg": "img/1.png",}, 
    {"id": 1, "parent": null, "policyName": "1", "policyImg": "img/2.png",},
    //parent: display as 1st level catagories listview
    {"id": 8, "parent": 0, "policyName": "8", }, 
    {"id": 9, "parent": 0, "policyName": "9", }, 
    {"id": 10, "parent": 0, "policyName": "10",}, 
    //parent: display as 2nd level catagories listview
    {"id": 11, "parent": 8, "policyName": "11", "policyURL":"#",}, 
    {"id": 12, "parent": 8, "policyName": "12", "policyURL":"#",}, 
];

jQuery Mobile Script (UPDATED):

//first page
$(document).on("pageinit", "#policy-page", function () {
    var div = "";
    $.each(info, function (i, info) {
        if(info.parent == null) {
            grids = ['a','b','c','d'];
            div += '<div class="ui-block-' + grids[i%4] + '"><div class="ui-bar" style="text-align: center;"><a href="#" id="' + i + '" class="info-go ui-link ui-btn ui-shadow ui-corner-all" role="button"><img src=" ' + info.policyImg + ' " /><br />' + info.policyName + '</a></div></div>';
        }
    });
    $("#policy-grid").append(div).promise().done(function () {
        $(this).on("click", ".info-go", function (e) {
            e.preventDefault();
            $("#policy-subpage").data("info", info[this.id]);
            $.mobile.changePage("#policy-subpage");
        });
        //add refresh style function
    });
});
//second page
$(document).on("pagebeforeshow", "#policy-subpage", function () {
    var info_sub = $(this).data("info");
    var id = info_sub.id;
    var html = "";
    $.each(info, function (i, info) {
            if (id == info.parent) {
                li =  $('<li><a href="#" id="' + i + '">' + info.policyName + '</a></li>');
                li.on("click", function(e){
                        e.preventDefault();
                        alert($(this).text());
                        $("#policy-subpage2").data("info_sub2", info[this.id]);
                        $.mobile.changePage("#policy-subpage2");
                });
                $("#policy-list").append(li).promise().done(function () {
                    $(this).listview("refresh");
                });
            }
        });[![enter image description here][1]][1]
//third page
// var info_sub2 shows undefined
$(document).on("pagebeforeshow", "#policy-subpage2", function () {
    alert($(this).attr('id'));
    var info_sub2 = $(this).data("info_sub");
    var id2 = info_sub2.id;
    var html = "";
    $.each(info, function (i, info) {
        if (id2 == info.parent) {
            html += '<li><a href="#" id="' + i + '">' + info.policyName + '</a></li>';
        }
    });
    $("#policy-list2").empty();
    if (html != ""){
        $("#policy-list2").append(html);
    }
    else {
        $("#policy-list2").append("<li>No item is found.</li>");
    }
    $("#policy-list2").listview("refresh");
});

HTML(完成):

<div data-role="page" data-theme="a" id="policy-page">
        <div data-role="header">
            <a href="javascript:window.location.href='index.html';" class="transparentButton" data-icon="arrow-l" data-iconpos="notext"></a>
            <a href="javascript:window.location.href='index.html';" class="transparentButton" data-icon="home" data-iconpos="notext"></a>
            <h1>Policy</h1>
        </div>
        <div data-role="content">
            <div class="ui-grid-c" id="policy-grid">
            </div>
        </div>
    </div>
    <!--second page --> 
    <div data-role="page" id="policy-subpage">
        <div data-role="header" data-theme="b">
            <a href="#" data-rel="back" data-role="button" class="transparentButton" data-icon="arrow-l" data-iconpos="notext"></a>
            <a href="javascript:window.location.href='index.html';" class="transparentButton" data-icon="home" data-iconpos="notext"></a>
             <h1>Policy Subcategories</h1>
        </div>
        <div data-role="content">
            <ul data-role="listview" id="policy-list"></ul>
        </div>
    </div>
    <!--third page -->  
    <div data-role="page" id="policy-subpage2">
        <div data-role="header" data-theme="b">
            <a href="#" data-rel="back" data-role="button" class="transparentButton" data-icon="arrow-l" data-iconpos="notext"></a>
            <a href="javascript:window.location.href='index.html';" class="transparentButton" data-icon="home" data-iconpos="notext"></a>
             <h1>Policy Subcategories2</h1>
        </div>
        <div data-role="content">
            <ul data-role="listview" id="policy-list2"></ul>
        </div>
    </div>

我没有得到控制台下的任何错误,但它显示var info_sub2(在page3)是未定义的:https://www.dropbox.com/s/9l905xi13wt0yau/Untitled.png?dl=0(我没有足够的信誉上传截图,因此一个链接)

时,我一步一步地通过代码。所以,我想在我的第二页点击功能应该包含一些错误。然而,我无法解决它。

谁能帮我检查一下我的错误并给我一些建议?

谢谢!

主要问题是您在添加数据之前添加了事件。

您需要在创建li元素的同一循环中添加.on("click")(更多地使用示例代码):

if (id == info.parent) {
        var li =  $('<li><a href="#" id="' + i + '">' + info.policyName + '</a></li>');
        li.on("click", function(e){
                e.preventDefault();
                alert($(this).text());
                $("#policy-subpage2").data("info_sub2", info[this.id]);
                $.mobile.changePage("#policy-subpage2");
        });
        $("#policy-list").append(li).promise().done(function () {
            $(this).listview("refresh");
        });
    }

对于最后一部分,您也可以重构那里的代码:

// the li elements
var lis = [];
$.each(info, function (i, info) {
    if (id2 === info.parent) {
        var li = $('<li><a href="#" id="' + i + '">' + info.policyName + '</a></li>');
        li.on("click", function(){ alert("li: " + $(this.attr("id")); });
        list.push(li); // add to array
    }
});
// default no items
$("#policy-list2").empty();
if (lis.length === 0){
    $("#policy-list2").append("<li>No item is found.</li>");
}
else {
    // add the list
    $.each(lis, function(){
        $("#policy-list2").append(this);
    });
}

最好直接在你添加的元素上使用事件,而不是使用全局事件(它们会更慢)

缓慢:

   $(document).on("click", "li")... 
迅速

:

    $("li").on("click")... 

第一个较慢的原因是,在文档中的任何单击时,jquery将遍历事件列表并尝试每个事件是否符合规则。(所以,如果你有100个事件,jquery将迭代所有100次,每次你点击页面上的任何地方,并检查它是否匹配)。

另一方面,当你直接将函数绑定到元素上时,浏览器会更有效地在内部处理解析,并且只在绑定时调用javascript。

在点击事件上,这感觉不是很好,但是当你在鼠标悬停或鼠标移出等移动事件上尝试同样的事情时,你会很快注意到一个延迟

我解决了!

只需将第二页脚本更改为以下内容即可:

//second page
        $(document).on("pagebeforeshow", "#policy-subpage", function () {
            var id = $(this).data("id");
            var li = "";
            $.each(info, function (i, info) {
                if (id == info.parent) {
                    li =  $('<li id="' + info.id + '"><a href="#">' + info.policyName + '</a></li>');
                    li.on("click", function(e){
                            e.preventDefault();
                            alert(this.id);
                            $("#policy-subpage2").data("id", this.id);
                            $.mobile.changePage("#policy-subpage2");
                    });
                    $("#policy-list").append(li).promise().done(function () {
                        $(this).listview("refresh");
                    });
                }
            });
        });