1

Java SE API リファレンス ドキュメント [ http://docs.oracle.com/javase/8/docs/api/ ]の簡単な Greasemonkey スクリプトを作成しています。次のようになります。

// ==UserScript==
// @id          Test
// @grant       none
// @include     http://docs.oracle.com/javase/8/docs/api/*
// @version     1
// @run-at      docuitment-end
// ==UserScript==


var classNamesFrame = null;
var classNamesDoc = null;
var classNamesATags = null;
var classNames = null;

function printClassNames()
{
  classNamesATags = classNamesDoc.getElementsByTagName('a');
  classNames = new Array();
  var i;
  for (i = 0; i < classNamesATags.length; i++) {
    classNames.push(classNamesATags[i].textContent);
  }
  console.log(classNames);
  console.log(classNamesDoc.URL);
  console.log('Total number of classes: ' + classNamesATags.length);
  alert("printClassNames called");
}


classNamesFrame = document.getElementsByName('packageFrame') [0];
classNamesDoc = classNamesFrame.contentDocument;
classNamesFrame.onload = printClassNames;
//classNamesFrame.addEventListener("DOMContentLoaded", printClassNames, false);

関数printClassNames()は、すべてのクラスがリストされているフレームで見つかったすべてのクラスの名前を出力します。フレームの読み込みが完了したら、そうする必要があります。ただし、onloadイベントはフレームの HTML ドキュメントが読み込まれる前に呼び出されます。

DOMContentLoadedイベントを使用してみましたが、呼び出されません。

printClassNamesフレームのロードが完全に終了した後に呼び出されるようにするにはどうすればよいですか?

4

2 に答える 2

1

そのスクリプトにはさまざまなエラーがあります (以下のリスト) が、主なものは、間違ったcontentDocument.

これは<about:blank>、実際のページ コンテンツに置き換えられるまで、Firefox がフレーム コンテンツを返すためです。classNamesDoc変数は空白値を指したままです。(Chrome ではフレームの処理と更新が若干異なることに注意しclassNamesDocてください。)

それで、classNamesDoc = classNamesFrame.contentDocument;内側に移動するprintClassNames()と、最も明白な問題が解決されます。

その他の問題、「最悪が最初」:

  • ひどく不正なメタデータ ブロックです。行が正しくありません// ==/UserScript==。これにより、閲覧するすべてのページと (i) フレームに対してスクリプトが実行 (およびクラッシュ) します。

  • スクリプトは、すべてのページ/フレームでサイレントにクラッシュします (Firefox では、Chrome はこれらのエラーを報告します) が、1 つの小さなサブセットです。classNamesFrame使用する前に の値を確認する必要があります。

    たとえばdocs.oracle.com/javase/8/docs/api/、このスクリプトはページで 4 回実行され、そのうちの 3 回で静かにクラッシュします。

  • @nameディレクティブがありません。 これにより、スコーピング、更新、およびメンテナンスの問題が発生する可能性があり、スクリプトのアップロードと共有が妨げられる可能性があります。

  • 構文エラー。@run-at document-endただし、この場合、このディレクティブはおそらくまったく必要ありません。

すべてをまとめると、スクリプトは次のようになります。

// ==UserScript==
// @name        Test
// @grant       none
// @include     http://docs.oracle.com/javase/8/docs/api/*
// @version     1
// ==/UserScript==

var classNamesFrame = null;
var classNamesDoc = null;
var classNamesATags = null;
var classNames = null;

function printClassNames()
{
  classNamesDoc = classNamesFrame.contentDocument;
  classNamesATags = classNamesDoc.getElementsByTagName('a');
  classNames = new Array();
  var i;
  for (i = 0; i < classNamesATags.length; i++) {
    classNames.push(classNamesATags[i].textContent);
  }
  console.log(classNames);
  console.log(classNamesDoc.URL);
  console.log('Total number of classes: ' + classNamesATags.length);
  console.log("printClassNames called");
}

classNamesFrame = document.getElementsByName('packageFrame') [0];
if (classNamesFrame) {
    classNamesFrame.onload = printClassNames;
}

-- Firefox と Chrome の両方 (およびおそらくその他) で動作します。

于 2014-07-03T00:46:12.720 に答える
0
// ==UserScript==
// @name        Test
// @version     1
// @include     http://docs.oracle.com/javase/8/docs/api/allclasses-frame.html
// @grant       none
// ==/UserScript==

var classNamesATags = document.getElementsByTagName('a');
var classNames = [].map.call(classNamesATags, function(e) {
    return e.textContent;
});
console.log(classNames);
console.log(document.URL);
console.log('Total number of classes: ' + classNamesATags.length);
alert('printClassNames called');
于 2014-07-06T22:59:55.310 に答える