【问题标题】:TableSorter 2.0 No Parsers DetectedTableSorter 2.0 未检测到解析器
【发布时间】:2019-03-01 04:09:45
【问题描述】:

我正在尝试使用此处的 TableSorter 2 包进行表格排序:https://mottie.github.io/tablesorter/docs/#Introduction。理想情况下,我想从服务器中提取数据,然后实时更新或单击排序选项。现在数据全部填充,但是当您单击标题时,数据没有排序。我错过了什么明显的东西吗?

index.html

<!doctype html>
<html lang="en">
  <head>

    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
    <link rel="stylesheet" href="/css/styles.css">
    <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.31.1/js/jquery.tablesorter.min.js"></script>
    <title>LTIIT Phone Status</title>
  </head>
  <body>
      <div class='container'>
          <table id="techtable"class="table tablesorter">
              <thead>
                <tr>
                  <th scope="col">User Name</th>
                  <th scope="col">Status</th>
                  <th scope="col">Queue</th>
                  <th scope="col">Call Status</th>
                </tr>
              </thead>
              <tbody>
              </tbody>
            </table>
            <!-- Horizontal Line Divider -->
            <hr>
      </div>

    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
    <script src="js/index.js"></script>
  </body>

</html>

index.js

function getCurrentMembers() {
    $.get('memberstatus', (data) => {
        data.forEach(element => {
            membername = element.username.replace('/','');
            membername = membername.replace('-',"");
            membername = membername.replace(' ','');
            if (element.loggedin == 1) {
                $("#techtable tbody").append(`
                <tr id="${membername}row">
                <td id="${membername}">${element.username}</td>
                <td id="${membername}status" class="text-success">Online</td>
                <td id="${membername}queue">${element.queue}</td>
                <td id="${membername}callstatus">Ready</td>
                </tr>`)
            } else {
                $("#techtable tbody").append(`
                <tr id="${membername}row">
                <td id="${membername}">${element.username}</td>
                <td id="${membername}status" class="text-danger">Offline</td>
                <td id="${membername}queue">Offline</td>
                <td id="${membername}callstatus">Offline</td>
                </tr>`)
            }
        });
    });
    $("#techtable").tablesorter({ debug:true });
}
$('document').ready(function(){

    getCurrentMembers();
});

来自控制台的错误

Detecting parsers for each column
jquery.tablesorter.min.js:1   No parsers detected!
jquery.tablesorter.min.js:1 Building cache for 0 rows (showing 0 rows in log) and 4 columns (0 ms)

Chrome 网络标签对“memberstatus”的响应

[{"username":"TestUser1","loggedin":1,"queue":"FirstResponder"},{"username":"TestUser2","loggedin":0,"queue":"OFFLINE"},{"username":"TestUser3","loggedin":1,"queue":"FirstResponder"},{"username":"TestUser4","loggedin":0,"queue":"TestQueue"},{"username":"TestUser5","loggedin":1,"queue":"TestQueue"}]

server.js NodeJS 文件

//.env file in parent directory that holds variable values - TO BE EXCLUDED FROM GIT!
require('dotenv').config();

//SQLite3 Requirements
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('UserStatus.db');

db.serialize(function() {
    db.run("CREATE TABLE IF NOT EXISTS users (username TEXT,loggedin INTEGER, queue TEXT)");
});

//Express Web Server Requirements
const express = require('express');
const app = express();
const path = require('path');
const bodyParser = require('body-parser');


//Start the server
const server = app.listen(process.env.Express_Port, () => console.log('Listening on port '+ process.env.Express_Port))

//Express Web uses
app.use(bodyParser.json());
app.use(express.static(path.join(__dirname + '/public')));


//Express Get requests
app.get('/', (req,res) => {
    res.sendFile(path.join(__dirname + '/index.html'));
});

app.get('/memberstatus', (req,res) => {
    //send back db information
    db.all(`SELECT * FROM users`, (err,rows)=>{
        if (err) throw err;
        res.send(rows);
    });
});

【问题讨论】:

  • 在这个fiddle 中有效。为了调查,需要更多细节。我认为问题出在返回的 data 值中。
  • 嗨@gaetanoM,感谢您的回复。我已经更新了原始帖子以显示返回的数据值。

标签: javascript jquery tablesorter


【解决方案1】:

现在数据全部填充,但是当您单击标题时,数据没有排序。

您可以添加sortlist属性:

$("#techtable").tablesorter({ sortList: [[0,0], [1,0], [2,0], [3,0]] });

var data = [{"username":"TestUser1","loggedin":1,"queue":"FirstResponder"},{"username":"TestUser2","loggedin":0,"queue":"OFFLINE"},{"username":"TestUser3","loggedin":1,"queue":"FirstResponder"},{"username":"TestUser4","loggedin":0,"queue":"TestQueue"},{"username":"TestUser5","loggedin":1,"queue":"TestQueue"}];
data.forEach(element => {
    membername = element.username.replace('/','');
    membername = membername.replace('-',"");
    membername = membername.replace(' ','');
    if (element.loggedin == 1) {
        $("#techtable tbody").append(`
            <tr id="${membername}row">
                <td id="${membername}">${element.username}</td>
                <td id="${membername}status" class="text-success">Online</td>
                <td id="${membername}queue">${element.queue}</td>
                <td id="${membername}callstatus">Ready</td>
            </tr>`)
    } else {
        $("#techtable tbody").append(`
            <tr id="${membername}row">
                <td id="${membername}">${element.username}</td>
                <td id="${membername}status" class="text-danger">Offline</td>
                <td id="${membername}queue">Offline</td>
                <td id="${membername}callstatus">Offline</td>
            </tr>`)
    }
});
$("#techtable").tablesorter({ sortList: [[0,0], [1,0], [2,0], [3,0]] });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.31.1/css/theme.default.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.31.1/js/jquery.tablesorter.min.js"></script>


<div class='container'>
    <table id="techtable"class="table tablesorter">
        <thead>
        <tr>
            <th scope="col">User Name</th>
            <th scope="col">Status</th>
            <th scope="col">Queue</th>
            <th scope="col">Call Status</th>
        </tr>
        </thead>
        <tbody>
        </tbody>
    </table>
    <!-- Horizontal Line Divider -->
    <hr>
</div>

【讨论】:

  • 我有点不知所措,上面的内容我仍然得到“未检测到解析器!”。这可能与我如何将数据发送回网页有关吗?我确实最终添加了 sortList 参数无济于事。
  • 未检测到解析器:您确定没有空值或 undef 值或 utf 字符....?
  • 我看不到。 JSON 返回 3 个字段而我的表中有 4 个字段是否重要?第四行“呼叫状态”是从 Asterisk VOIP 服务器实时更新的,不需要数据库条目。
【解决方案2】:

我注意到在日志中它显示了调用 tablesorter 函数之后的数据,即使它之前被调用过。

我最终将 .get 调用更改为 .ajax 并添加了这个完整的选项:

    $.ajax({url: "/memberstatus", dataType : "json",contentType :"application/json",method:"GET", success: function(data){
        console.log(data);
        data.forEach(element => {
            membername = element.username.replace('/','');
            membername = membername.replace('-',"");
            membername = membername.replace(' ','');
            if (element.loggedin == 1) {
                $("#techtable tbody").append(`
                <tr id="${membername}row">
                <td id="${membername}">${element.username}</td>
                <td id="${membername}status" class="text-success">Online</td>
                <td id="${membername}queue">${element.queue}</td>
                <td id="${membername}callstatus">Ready</td>
                </tr>`)
            } else {
                $("#techtable tbody").append(`
                <tr id="${membername}row">
                <td id="${membername}">${element.username}</td>
                <td id="${membername}status" class="text-danger">Offline</td>
                <td id="${membername}queue">Offline</td>
                <td id="${membername}callstatus">Offline</td>
                </tr>`)
            }
        });
      }, complete: function(){
        $("#techtable").tablesorter({ sortList: [[0,0], [1,0], [2,0], [3,0]],debug:true });
      }});
}

现在按预期工作。感谢您的帮助。

【讨论】:

  • 这听起来很奇怪。在任何情况下,您都可以使用.getJSON() 或将dataType 添加到您的.get()。如果在此之前调用了 tablesorted,则意味着还有另一个调用....感谢分享
猜你喜欢
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 2016-03-18
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
相关资源
最近更新 更多