0

Tampermonkey を使用して Opera にユーザースクリプトを書き込もうとしています (ViolentMonkey を試しても同じ結果が得られましたが)。このスクリプトは、ルーターの構成ページで実行され、表示される統計に基づいていくつかの値を計算します。

問題は、それが .asp ページであり、frameset(body 要素はありませんが、これが asp にとって正常かどうかはわかりませんが、使用したことはありません) とそのframe中に 3 つの要素しかないことです。いくつかの DOM メソッドを試した後、URL が変更されないため、実際にページ上の内容を検出するためにいくつかの非常に洗練されていないアプローチが必要になりますが、MutationObserverどれがお尻を蹴るかにつまずきましたが、イベントを返すことができないようです。私が何をしようと。

MutationObserver試着すると動作し、google.com正常に報告されます。これまでの私のコードは、この機能のテストにすぎないため、ここMutationObserverからコピー/貼り付けしたもので、次のようになります (わずかに変更されています)。

// ==UserScript==
// @name       meh
// @match      http://192.168.1.1/cgi-bin/index.asp
// @run-at     document-end
// ==/UserScript==

// MDN code starts here
var target = document.body;

var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    console.log(mutation.type);
  });    
});

var config = { attributes: true, childList: true, characterData: true, subtree: true };

observer.observe(target, config);
// end of userscript

この正確なコードは、で完全に正常に動作しgoogle.comます。また、@matchオブザーバーをコンソール (ここには示されていません) に記録して、適切な URL と一致することを確認するため、ディレクティブは問題ではありません。

などのターゲットとしてさまざまな要素を試しました(それが問題だった場合)、構成の有無にwindow.frames['framename'].document.bodyかかわらず、ディレクティブに使用してみました。何があっても、コンソールにログインするミューテーションはありません。subtreedocument-start@run-at

この特定のケースに関してオンラインで何も見つけることができなかったので、質問する必要があります.aspページについて混乱する可能性のある特別なものはありますか、それともsとsとMutationObserver関係がありますか?frameframeset

編集 - 非常に皮肉なことに、ルーターのインターフェイス以外で自分のコードをテストできるオンラインの唯一の場所は、The World's Worst Websiteです。framesetjsfiddle や codepen でさえ、 andに我慢できませんframe

4

1 に答える 1

0

これを休ませてあげます。私はもともと、グリースモンキー API を使用して値を保存することを避け (フレームのコンテキスト内にいて、更新すると、保存された変数が消去されるため)、よりエレガントでシンプルなチェック方法を使用するために、この方法で問題にアプローチしたいと考えていました。特定のフレームが特定の URL で読み込まれるかどうか。ブラウザー (Chrome、Firefox、Opera) は、新しい URL がロードされたときにイベントを生成しないことが判明しました(サンドボックス化のために動作が同じなのか、それとも古代とは異なる動作なのframeかはわかりません)。iframesiframesframes

全体として、このようなことを行う必要がある場合 (フレームの更新間でユーザースクリプトの変数を維持する)、具体的に監視したいフレームを@matchディレクティブでターゲットにして、グリースモンキー API (またはユーザースクリプト拡張機能が持っている任意の API) を使用します。値を永続的に保存するため)。自分で作成している Web サイトでこれを行う場合は、フレームを使用しない(できれば) か、必要な場所にイベント ハンドラーを使用postMesssageまたは添付します。

要点は、フレームがひどいです。

于 2014-08-04T05:10:59.723 に答える