0

Java API リファレンスの長いリストでクラス名をフィルタリングするのに役立つ、Firefox 用の次の Greasemonkey スクリプトを作成しました。

// ==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配列に追加すると、使用している ID が同じであるため、最初の「AclEntry」リンクが 2 番目のリンクで上書きされます。

この ID に一意のものを追加する必要があります。.startsWith一致するかどうかを確認しているだけなので、問題なく動作するはずです。

例えば:

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

これにより、配列内の id の末尾に _# が追加され、それらを一意に保つ必要があるため、AclEntry_34andAclEntry_35またはそのようなものになります。Acl* を除外しようとすると、両方に一致します。

逆に、すべてのリンクがclassNamesHashオブジェクト内にあるため、一致しないリンクはすべて非表示にできます。

于 2013-05-18T15:04:08.537 に答える