0

我为 Firefox 创建了以下 Greasemonkey 脚本,以帮助过滤长长的Java API 参考列表中的类名:

// ==UserScript==
// @name        JDK API Doc helper problematic
// @version     1
// @namespace   Xolve
// @description Provides in place search for JDK API docs
// @include     http://docs.oracle.com/javase/7/docs/api/*
// @run-at document-end
// ==/UserScript==

var classNamesFrame;
var classNamesDoc;
var classNamesHash = {};
var timeoutId;

function textBoxTextChanged(ev)
{
    window.clearTimeout(timeoutId);
    console.log(ev.target.value);
    // For case insensitive comparision
    var query = String(ev.target.value).trim().toLowerCase();
    timeoutId = window.setTimeout(filterClassNames, 600, query);

}

function filterClassNames(query)
{
    if(query.length == 0) {
        for(k in classNamesHash) {
            classNamesHash[k].style.display = "";
        }
        return;
    }
    for(k in classNamesHash) {
        if(k.startsWith(query)) {
            console.log("setting to display: " + k);
            classNamesHash[k].style.display = "block";
        }
        else {
            classNamesHash[k].style.display = "none";
        }
    }
}

function init()
{
    // Find list of class names
    classNamesDoc = classNamesFrame.contentDocument;
    classNamesATags = classNamesDoc.getElementsByTagName("a");
    for(i = 0; i < classNamesATags.length; i++) {
        // For case insensitive comparision
        classNamesHash[classNamesATags[i].textContent.toLowerCase()] = classNamesATags[i];
    }

    // Add a text box
    var textBox = classNamesDoc.createElement("input");
    var body = classNamesDoc.getElementsByTagName("body")[0];
    var classListNode = body.getElementsByClassName("indexContainer")[0];
    body.insertBefore(textBox, classListNode);
    textBox.addEventListener("keyup", textBoxTextChanged);
}

classNamesFrame = document.getElementsByName("packageFrame")[0];
classNamesFrame.onload = init;

这就是这个脚本的作用

  1. 在列出类名的框架中添加一个文本框。呼叫是查询框。

  2. 创建所有类名的哈希(转换为小写)到相应的 DOM 元素。

  3. 当用户在查询框中输入类名的前几个字符时,它会遍历哈希键并将匹配元素的显示属性设置为“块”,将非匹配元素的显示属性设置为“无”

问题

无论查询框的内容如何,​​始终显示某些元素,例如 AclEntry、Array 等,

4

1 回答 1

1

例如,这是因为有多个“AclEntry”链接。因此,当您第一次将元素添加到classNamesHash数组时,它将用第二个“AclEntry”链接覆盖第一个“AclEntry”链接,因为您使用的 id 是相同的。

你需要在这个 id 上附加一些独特的东西,然后因为你只是检查.startsWith匹配它应该仍然可以正常工作。

例如:

for(i = 0; i < classNamesATags.length; i++) {
    // For case insensitive comparision
    classNamesHash[classNamesATags[i].textContent.toLowerCase() + '_' + i] = classNamesATags[i];
}

这会将 _# 附加到数组内 id 的末尾,并应保持它们的唯一性,以便您拥有AclEntry_34AclEntry_35或类似的东西。当您尝试过滤掉 Acl* 时,它将匹配它们。

相反,所有链接现在都在classNamesHash对象中,因此可以隐藏所有不匹配的链接。

于 2013-05-18T15:04:08.537 回答