如何在listview中使用jquery动态显示列表分隔符?

Posted

技术标签:

【中文标题】如何在listview中使用jquery动态显示列表分隔符?【英文标题】:How to display the list dividers dynamically using jquery in listview? 【发布时间】:2013-08-13 09:27:19 【问题描述】:

我正在动态使用data-role="list-divider" 在列表视图中显示类别数据。与list-divider 一起,我正在显示有关列表视图中每个项目的描述。但这些描述来自每个项目的相关文件。当我显示带有list-divider 的列表视图以及描述时,我遇到了问题,然后列表视图显示为所有分隔符应首先组合,然后在显示带有描述的列表项下方。如何正确显示带有描述的列表视图。

http://jsfiddle.net/yC8VS/2/

$("#list").append('<li data-role="list-divider">' + section + '</li>');
$(this).children().each(function () 
   var content = $(this).text();
   var order = $(this).attr("order");
   var seq = order + '' + $(this).attr('order');
   var file = $(this).attr('file');
   $.mobile.activePage.append('<div id="files" style="display: none"></div>');
   $('#files').load(file, function (data) 
     var txt = $(data).find('p').text();
     $("#list").append('<li><a href="" class="style1" data-sequence="s' + seq + '" file="' + file + '"><h2>' + content + ' </h2><p class="description">' + txt + '</p></a></li>');
     $("#list").listview('refresh');
   );
);

提前致谢。

【问题讨论】:

【参考方案1】:
$('#files').load(file, function (data)

是问题所在。这是一个异步函数,这意味着它不会阻塞。因此,这些部分是在 load() 调用添加内容的函数之前添加的。

使用带有 async:false 的 ajax 加载数据,然后列表正确显示。


[编辑 1]

http://jsfiddle.net/uECUY/

展示了一些使异步调用同步的工作。很难它使用绑定功能,这可能不适用于所有平台(https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Function/bind)

...您还可以更改超时功能的延迟,因为 50 毫秒是一个非常短的间隔,这会导致更高的负载...


[编辑 2]

为没有绑定功能的浏览器添加绑定功能,如上文章链接所述:

if (!Function.prototype.bind) 
    Function.prototype.bind = function (oThis) 
        if (typeof this !== "function") 
            // closest thing possible to the ECMAScript 5 internal IsCallable function
            throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
        

        var aArgs = Array.prototype.slice.call(arguments, 1),
            fToBind = this,
            fNOP = function () ,
            fBound = function () 
                return fToBind.apply(this instanceof fNOP && oThis ? this : oThis,
                aArgs.concat(Array.prototype.slice.call(arguments)));
            ;

        fNOP.prototype = this.prototype;
        fBound.prototype = new fNOP();

        return fBound;
    ;


[编辑 3]

进一步改进了sn-p,可以在没有绑定功能的情况下工作。

http://jsfiddle.net/uECUY/4/

【讨论】:

我在“#files”中加载数据..但是我必须在 ajax 中提到这个“#files”。 如果将 $.ajax() 与 async:false 一起使用,则需要手动将数据添加到“#files”。例如 $("#files").append(); 如果添加上述绑定代码后仍然无法正常工作,则需要使用 $.ajax() 或者在开始添加列表元素之前需要加载数据。 另外,我注意到您多次添加“#files” div,这会导致多个对象具有相同的 id...这可能会导致进一步的问题... 你不回复了,现在是什么状态?

以上是关于如何在listview中使用jquery动态显示列表分隔符?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用类似表格的 DataTemplate 在 UWP ListView 中动态缩放列宽

jquery mobile listview使用ajax动态加载后,跳转到其他页面返回时数据没有保存如何解决?

jQuery Mobile 的 Listview 小部件中的复选框列

如何使用json动态转换listview静态?

如何将 lodash 对象(过滤器对象)动态转换为 jquery listview

wpf中如何实现Combobox作为ListView某列显示