jQuery移动更改页面上点击动态创建列表(数据来自JSON)
jQuery Mobile Change page on click at dynamically created list (data from JSON)
我是编程新手,在编辑js脚本以使事情正常工作方面获得了一些帮助。
使用:jquery.mobile-1.4.5。
我想实现这个格式(4级):
- 主要分类->网格按钮布局
- 一级子类-> listview(使用JSON动态创建)
- 第二级子类别-> listview(使用JSON动态创建)
- 第三级详细信息->基本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");
});
}
});
});
相关文章:
- 在 d3 中为数据列表创建元素
- 增加新<李>仅由有序列表创建的元素<ol>
- JavaScript-从脚本中的单词列表创建一个html表或网格
- 下拉列表创建订单,不能在每个下拉列表中选择相同的数字
- 我可以为 4 个不同的下拉列表创建一个循环吗?
- 从 Dojo 中的对象列表创建表的最佳方法
- 使用 jQuery 从元素列表创建特定属性的数组
- 从动态创建的单个列表创建嵌套列表
- 如何从节点和链接列表创建 d3 径向树
- XML解析器/从XML节点列表创建一个XML DOM文档
- 使用选项卡从列表创建片段
- 为复选框列表 - 动态响应列表创建一个过滤器搜索框
- 从Scraped Javascript表列表创建DataFrame
- Twitter引导程序下拉列表创建了一个滚动条
- 循环元素's列表创建一个没有jQuery的转盘
- 下拉列表创建基于输入的搜索栏角
- 使用2个下拉列表创建2个并排的表行来比较数据- JSON
- 如何使用html dom为国家列表创建对象数组
- 如何用未知数量的子列表创建递归列表
- 从按钮列表创建可重用的按钮css/jquery