如何对网站列表进行排序(即 id / sub-class 标识不佳)?

How to sort a website list (That has poor id / sub-class identification)?

我正在尝试制作一个 Greasemonkey 脚本,该脚本将重做页面右侧的列表,以便它们从 A 到 Z 列出,无论它们开始时的布局如何。

站点是 http://ustvgo.tv/,相关的 HTML 是:

<div id="recent-posts-3" class="mh-widget widget_recent_entries">
    <h4 class="mh-widget-title"><span class="mh-widget-title-inner">Recent Posts</span></h4>
    <ul>
        <li><a href="http://ustvgo.tv/fox-sports-1/">Fox Sports 1</a></li>
        <li><a href="http://ustvgo.tv/disneyxd/">DisneyXD</a></li>
        <!-- etc. -->
    </ul>
</div>

<a> 个节点没有 ID 或子类。

我已经得到它来提取 link 的文本部分并将其添加到空白所在的拆分数组中,但我终其一生都无法将其吐出那个带有编号的数组,这样我就可以在 link 文本前面添加一个新 ID,并且 link 文本仍然和原来一样。

<a href="http://ustvgo.tv/fox-sports-1/">Fox Sports 1</a> 会变成 <a href="http://ustvgo.tv/fox-sports-1/">ID="name" Fox Sports 1</a> 这样我就可以让脚本按名称 ID 文本 A - Z 对列表进行排序。

如何对该列表进行排序?

对一组节点进行排序:

  1. 首先确定控制显示顺序的HTML。 (请注意,如果通过 CSS 更改视觉顺序,它可能会变得复杂。为此提出一个新问题。)
    在本例中,它是 <li> 个元素。
  2. 使用 techniques like these 为这些节点及其容器识别 CSS/jQuery 选择器
    在这种情况下,容器的选择器是:#recent-posts-3 > ul
    项目的选择器是:#recent-posts-3 > ul > li(或容器上的 .find ("li"))。
  3. 根据需要对节点进行排序(通常在 textContent 上)。
    参考 the .localeCompare() doc.

  4. 按排序顺序将节点重新附加到容器。请注意,当您在现有节点上使用 .appendChild().appendTo() 等时,它会 将该节点 移动到新位置。

  5. 请注意,此问答针对静态页面。动态/javascript-加载/AJAX-驱动的页面可能需要不同的方法。为此打开一个新问题。

因此,这是一个完整的工作 Tampermonkey/Violentmonkey 脚本,用于对该列进行排序。 (它可能也适用于 Greasemonkey 4+,但是 you should not use that engine anyway):

// ==UserScript==
// @name     USTVGO, sort "Recent Posts"
// @match    *://ustvgo.tv/*
// @noframes
// @grant    none
// ==/UserScript==
/* global jQuery, $ */
/* eslint-disable no-multi-spaces, curly */
'use strict';

var $ = jQuery;  //  The page loads jQuery (and we are in grant none mode), but doesn't set `$`.
var recentPostsLst  = $("#recent-posts-3 > ul");
var itemsToSort     = recentPostsLst.find ("li");

itemsToSort.sort (sortByLinkTextAscending).appendTo (recentPostsLst);

function sortByLinkTextAscending (nodeA, nodeB) {
     var valA_Text  = $(nodeA).find ("a").text ().trim ();
     var valB_Text  = $(nodeB).find ("a").text ().trim ();

     return valA_Text.localeCompare (valB_Text, 'en', {sensitivity: 'base'} );
}