使用移动版jquery和cordova时,可折叠列表视图的头部不能刷新

header of collapsible listview not refreshing using jquery mobile and cordova

本文关键字:视图 列表 可折叠 头部 刷新 不能 移动 jquery cordova      更新时间:2023-09-26

我正在使用Cordova和JQuery Mobile 1.4.3构建一个应用程序,它从web服务中提取数据。一旦cordova加载并更新DOM,我就不会遇到获取数据的问题。

数据显示在一个可折叠的列表中,每个标题和视图根据从web服务返回的数据更新。

但是,一旦DOM更新完成,可折叠标题不会刷新其样式,而内容会刷新。此外,标题也是可点击的。

我已经在网上搜索了一个解决方案,但无法找到一种方法来获得可折叠的标题来刷新他们的视图。

我试过使用$("#id").collapsible('refresh'),但无济于事。

任何关于如何更新UI的帮助将是伟大的

下面的代码。

index.html的头脚本

<script type="text/javascript">
   document.addEventListener("deviceready", onDeviceReady, false);
   function onDeviceReady() {
      init();
   }              
</script>

标记片段

<div data-role="page" id="home" data-title="Home">
    <div data-role="header" data-id="foo" data-position="fixed">
        <h1>Title</h1>
        <a href="#menu" data-icon="bars" data-iconpos="notext" data-transition="slide" data-corners="false" data-shadow="false" class="ui-btn-right"></a>
    </div>
    <div data-role="content" id="collapsible_set">
        <h3 id="date"></h3>
        <div data-role="collapsibleset" id="datacollapsible" data-inset="false">
            <!-- First Collapsible -->
            <div data-role="collapsible" id="test" class="content">
                <h3 class="title"></h3>
                <ul data-role="listview" data-inset="false">
                    <li style="font-size: 1.4em;">
                        <p class="description" style="overflow: visible; text-overflow: clip; white-space: normal"></p>
                        <p>Source:</p>
                        <p><a href="" target="_blank" class="source"></a></p>
                        <div data-role="controlgroup">
                            <a href="#" data-role="button" data-icon="star">Add to Favorites</a>
                            <a href="#" data-role="button">Share</a>
                        </div>
                    </li>
                </ul>
            </div>
           <!-- More Collapsibles below -->
         </div>
 </div>

JS

var data;
var pattern = new RegExp('^http');

function init() {
    initializeDataSet();
    insertData();
    $("#test").collapsible('refresh');
}
function insertData() {        
    // set date
    var date = new Date();
    var options = {
        weekday: "long", year: "numeric", month: "long", day: "numeric"};
    var outputDate = date.toLocaleString("en-us", options);
    $("#date").html("" + outputDate);
    // Get content elements and add data
    var content = $('.content');
    if (content) {
        for (var i = 0; i < content.length; i++) {
            var temp = content[i];
            temp.getElementsByTagName('h3')[0].innerHTML = data[i]['title'];
            if(data[i]['word']){
                temp.getElementsByTagName('p')[0].innerHTML = data[i]['word'] + ": " + data[i]['description'];
            } else {
                temp.getElementsByTagName('p')[0].innerHTML = data[i]['description'];                    
            }
            if(pattern.test(data[i]['source'])) {
                temp.getElementsByTagName('a')[0].setAttribute("href", data[i]['source']);
                temp.getElementsByTagName('a')[0].setAttribute("target", "_blank");
            } else {
                temp.getElementsByTagName('a')[0].removeAttribute("href");
                temp.getElementsByTagName('a')[0].removeAttribute("target");
            }
            temp.getElementsByTagName('a')[0].innerHTML = data[i]['source'];
        }
    }
}
/**
 * initialise the dataset to a global variable when the app launches.
 * @returns {undefined}
 */
function initializeDataSet() {
    // make request to get data
    var request = createRequest();
    if (request === null) {
        alert("Error, can't get data");
        return;
    }
    request.onreadystatechange = function() {
        if (request.readyState === 4) {
            if (request.status === 200) {
                data = JSON.parse(request.responseText);
            }
        }
    };
    var params = "date=" + createDate();
    request.open("POST", "URL FROM WHERE I AM GETTING DATA", false);
    //Send the proper header information along with the request
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.send(params);
}
function createDate() {
    var date = new Date();
    var day = date.getDate();
    if (day < 10) {
        day = "0" + day.toString();
    }
    var month = date.getMonth() + 1;
    if (month < 10) {
        month = "0" + month.toString();
    }
    return date.getFullYear() + "-" + month + "-" + day; 
}

首先,您需要了解jQM如何增强其小部件,例如可折叠可折叠的初始HTML标记在小部件创建后不会保持原样。

<div data-role="collapsible">
   <h3>Header</h3>
   <p>Contents</p>
</div>

将上面的HTML标记转换为以下内容:

<div data-role="collapsible" class="ui-collapsible ui-collapsible-themed-content">
   <!-- Header -->
   <h3 class="ui-collapsible-heading">
      <a href="#" class="ui-collapsible-heading-toggle ui-btn ui-btn-icon-left ui-btn-inherit ui-icon-minus">
         Header
      </a>
   </h3>
   <!-- Contents -->
   <div class="ui-collapsible-content ui-body-inherit" aria-hidden="false">           
      <p>Contents</p>
   </div>
</div>

你没有正确更新可折叠的header/content,你需要瞄准内部元素。下面是一个例子:

Edit:我忘了说你不需要调用refresh方法,因为你没有替换可折叠的任何部分。

var data = [{
    "title": "foo1",
        "content": "foo1 content"
}, {
    "title": "foo2",
        "content": "foo2 content"
}];
$.each(data, function (i, value) {
    $("#datacollapsible .ui-collapsible:eq(" + i + ")")
        .find("h3 a")
        .text(value.title)
        .end()
        .find(".ui-collapsible-content p")
        .text(value.content);
});