3

JavaScript を使用して、Chrome ブラウザー用の Gmail 拡張機能を作成しています。このコードを使用してsend、ページからボタン要素を取得しようとしています:Compose

SendButton  = document.getElementById('js_frame').contentDocument.getElementsByClassName('T-I J-J5-Ji Bq nS T-I-KE L3')[0];

しかし、その後、. というメッセージが表示され続けますtypeof SendButton is undefined

どうすればこれを解決できますか?

4

2 に答える 2

1

間違ったドキュメントを探しています。

Gmail#js_frameは、UI 以外のものを担当する非表示のフレームです (その本体には<script>タグのみが含まれます。FYI)。前の質問で、正しい参照を取得する方法をすでに示しました。

  • document.getElementById('canvas_frame').contentDocument存在する場合
  • documentif#canvas_frameは存在しませんが、存在js_frameします。js_frame` は、ヘルプ ページなど、Gmail ドメインで Gmail 以外のページを除外するために使用されます。

したがって、取得した後doc2(前の回答を参照)、そのドキュメントの要素をクエリする必要があります。

// Paste declaration of doc2 from https://stackoverflow.com/a/14032326/938089
// And to get the button when available
if (doc2) {
    sendButton = doc2.getElementsByClassName('T-I J-J5-Ji Bq nS T-I-KE L3')[0];
}
于 2012-12-25T20:20:34.467 に答える
0

作成フィールドが作成されるたびに変更され、ユーザーごとに変更される可能性があるため、送信ボタンのクラスまたは id 属性に依存することはできません。では、ボタンについて何がわかるでしょうか。

  • innerHTML は「Send」です (脚注を参照)
  • 値が「ボタン」のロール属性があります
  • 「新しいメッセージを作成する」コンテナの中にあり、「差出人」、「宛先」などの他のラベルもあります (脚注 2 を参照)。

その情報を使用して、ボタンを取得するネイティブ Javascript で優れた Xpath クエリを使用できます。

var xpath = '//div[@role="button" and text()="Send"]'
var query = document.evaluate(xpath, document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
var button = query.iterateNext();

[role="button"]ライブラリを jQuery として使用している場合は、前の回答で提供されている css セレクターとフィルター関数を自由に使用してください。

これは、テーブル情報を親として追加することで改善される可能性がありますが、これで十分なはずです (詳細については、Developer Mozilla Introduction to Xpath を参照してください)。うまくいけば、答えは良いパフォーマンスを提供します。

更新: Gmail はいくつかのクラスに固執しているようです (クラスT-I J-J5-Jiは古いバージョンと新しいバージョンの間で共有されているようです)。それでも、私はそれを使用しません。他の開発者がそのクラスに出くわし、それだけでボタンを取得している場合、特にコメントがなく、変数名が貧弱な場合、あなたが取得しているものを理解する方法はありません使用されている。

実際に回答を取得するソリューションでは、次のような CSS クエリ セレクターを使用しますdiv > div > div > div > table div。どちらも同じ理由で使いません。さらに、説明が不十分な正規表現を思い出させます。あなたは自分のためにコーディングしているだけでなく、プロジェクトについて何も知らないかもしれない未来のあなた自身にもコーディングしています。


脚注: または、ユーザーの言語に相当するもの。すべてのユーザーが英語の Gmail を使用しているかどうかはわかりませんが、そのような仮定はしません。私があなただったら、「送信」の最も一般的なキーワードのロケールで辞書を作成し、それらのほとんどを繰り返し評価します。繰り返すことができる言語の量は、Gmail がサポートする言語に限定される可能性があります。

脚注 2: 実際には、[作成] を押すと、ラベルの [From] と [To] が追加されますが、すぐに入力しないとラベルが消えて、innerHTML の [Recipients] と [Subject] を含むいくつかの div だけが表示されます。 "

于 2012-12-25T20:55:23.217 に答える