无法在初始化之前调用表上的方法;试图调用方法“刷新”

Posted

技术标签:

【中文标题】无法在初始化之前调用表上的方法;试图调用方法“刷新”【英文标题】:Cannot call methods on table prior to initialization; attempted to call method 'refresh' 【发布时间】:2020-02-03 02:21:57 【问题描述】:

我想列出从数据库表到 html 页面的所有数据。目前一共3行数据,但只列出了2行数据。

HTML。

<script src="lib/jquery-1.11.2.min.js"></script>
<script src="lib/jquery.mobile-1.4.5.min.js"></script>
<div class="expandable-content">
    <div id="SearchResult" class="ui-content">
        <table data-role="table" data-mode="reflow" class="uiresponsive" id="CoTable">
            <thead>
                <tr>
                    <th>User</th>
                    <th>Personnel</th>
                    <th>License</th>
                </tr>
            </thead>
            <tbody id="mybody"></tbody>
        </table>
    </div>
</div>

JS.

function searchperson() 
    var xmlhttp = new XMLHttpRequest();
    var url = serverURL() + "/searchfriends.php";
    url += "?userid=" + localStorage.getItem("userid") + "&search=" + 
    $("#search").val();

xmlhttp.onreadystatechange = function () 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) 
        getSearchResults(xmlhttp.responseText);
    

xmlhttp.open("GET", url, true);
xmlhttp.send();

function getSearchResults(response) 
    var arr = JSON.parse(response);
    var i;
    $("#mybody").find("tr").remove();
    for (i = 0; i < arr.length; i++) 
        $("#mybody").append("<tr><td>" + arr[i].userid +
            "</td><td>"
            + arr[i].personnel + "</td><td>"
            + arr[i].license + "</td></tr>");
    

    $('#Results').bind('pageinit', function () 
    $('#CoTable').table('refresh');
    //$("#CoTable").table('refresh');

我希望列出所有数据,但只列出了 2 行数据。 [未捕获的错误:。] 我使用了 jquery 移动页面 ID,它消除了错误,但仍然缺少数据。请帮忙,非常感谢。

【问题讨论】:

当页面加载时,你需要做$("#CoTable").table()(可能的选项作为参数)来初始化表格。 见api.jquerymobile.com/table的例子 @Barmar api 提到如果表上有data-mode="reflow",它将自动初始化。因此,这可能更多是调用 getSearchResults 的时间问题。 @Taplar 大概是在执行搜索的 AJAX 请求的回调中调用的。所以 jquery-mobile 库应该已经加载了。 删除pageinit 函数。添加$('#CoTable').table('rebuild'); 【参考方案1】:

对于 JQM 表小部件,该方法称为 rebuild(参考:https://api.jquerymobile.com/table/)。

由于 http 请求的异步行为,您可能不知道何时会收到响应,因此恕我直言,处理该响应的最简单方法是检查表小部件是否已经实例化,并且然后调用需要的方法:

function isInstanceOf(id, widget) 
  var el = document.getElementById(id);
  return !!$.data(el, 'mobile-' + widget);


function addRow(id, evt) 
  var html = '',
      $table = $('#' + id),
      isInstance = isInstanceOf(id, 'table'),
      tableMethod = isInstance ? 'rebuild' : null;

  html += '<tr>';
  html += '<td>' + id + '</td>';
  html += '<td>' + evt + '</td>';
  html += '<td>' + isInstance + '</td>';
  html += '<td>' + (isInstance ? tableMethod : '[create]') + '</td>';
  html += '</tr>';
  $table.find('tbody').append(html);
  $table.table(tableMethod);


$(document).ready(function() 
    addRow("CoTable", "DomReady");
);
$(document).on("pagecontainercreate", function(e, ui) 
    addRow("CoTable", e.type);
 );
$(document).on("tablecreate", function(e, ui) 
    addRow(e.target.id, e.type);
);
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
  <link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.css" />
  <script src="https://code.jquery.com/jquery-2.2.4.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/jquerymobile/1.4.5/jquery.mobile.js"></script>
</head>

<body>
  <div data-role="page">
    <div data-role="header" data-theme="b">
      <h1>jQuery Mobile Table</h1>
    </div>
    <div data-role="content">
      <table data-role="table" data-mode="reflow" id="CoTable" class="ui-responsive">
        <thead>
          <tr>
            <th data-priority="1">Id</th>
            <th data-priority="persist">Source</th>
            <th data-priority="2">Instanced</th>
            <th data-priority="3">Method</th>
          </tr>
        </thead>
        <tbody></tbody>
      </table>
    </div>
  </div>
</body>

</html>

不用担心event 序列。

这里是一个笨蛋:https://plnkr.co/edit/S8m8BPYnsfUFklYLwEz7?p=preview

【讨论】:

以上是关于无法在初始化之前调用表上的方法;试图调用方法“刷新”的主要内容,如果未能解决你的问题,请参考以下文章

错误:无法在初始化之前调用自动完成的方法;试图调用方法“销毁”

未捕获的错误:在初始化之前无法调用可拖动的方法;试图调用方法“禁用”

jQuery mobile +主干:无法在初始化之前调用listview上的方法

不能调用表上的方法?表变量

jquery ui Dialog:无法在初始化之前调用对话框上的方法

LifecycleProcessor 未初始化 - 在通过上下文调用生命周期方法之前调用“刷新”