gdg-nara / mierukun

授業見取りツール
https://gdg-nara.github.io/mierukun/
GNU General Public License v3.0
2 stars 1 forks source link

ポップアップからフォーカスが外れたことを補足できない #2

Closed tanykazy closed 1 year ago

tanykazy commented 1 year ago

拡張機能のポップアップウィンドウの外をクリックした場合に、アプリが終了されてしまい、作業中の状態が失われてしまいます。

ポップアップではなくタブで開く仕様に変更する必要があるかもしれないです。

t-cool commented 1 year ago

chatGPT 無料版の回答を共有します。

Chrome 拡張機能を開発すると仮定します。

拡張機能を起動すると新しくタブが開き、マウスカーソルのフォーカスが外れたとしても拡張機能のウィンドウが閉じないようにするには、どうすればいいですか?

これは、JavaScript の window.open メソッドを使って新しいタブを開き、そのタブ内で JavaScript の window.focus メソッドを使ってフォーカスを維持することで実現できます。

次のようなコードを拡張機能の background スクリプト内に記述することで、新しいタブを開き、フォーカスを維持することができます。

chrome.browserAction.onClicked.addListener(function(tab) {
  var newTab = window.open("your-new-tab-url", "your-new-tab-name");
  newTab.focus();
});

このコードは、ブラウザアクションアイコンがクリックされたときに新しいタブを開き、そのタブにフォーカスを移すことを実現します。新しいタブの URL とタブ名は、適切な値に置き換えてください。

t-cool commented 1 year ago

chatGPT 有料版の回答を共有します。

Chrome拡張機能で、新しいタブを開いてウィンドウを表示する場合、通常、そのウィンドウを閉じるイベントが発生すると自動的に閉じられます。

ウィンドウが閉じないようにするには、以下の手順で実装する必要があります。

  1. chrome.windows.create() APIを使用してウィンドウを作成する際に、focusedプロパティをtrueに設定します。
  2. chrome.windows.update() APIを使用してウィンドウのフォーカスを強制的に設定することができます。chrome.windows.create()で作成したウィンドウのIDを使用して、chrome.windows.update()でフォーカスを再設定します。

以下は、この機能を実装するための簡単なサンプルコードです。

chrome.windows.create({url: "popup.html", focused: true}, function(window) {
  // ウィンドウが作成された後にウィンドウIDを取得
  var windowId = window.id;

  // ウィンドウが失去したときに、フォーカスを再設定する
  chrome.windows.onFocusChanged.addListener(function(newWindowId) {
    if (newWindowId !== windowId) {
      chrome.windows.update(windowId, {focused: true});
    }
  });
});
t-cool commented 1 year ago

回答2

Chrome 拡張機能のボタンをクリックすると、別のタブで起動するようにするには、どのように実装すればいいですか?

Google Chrome 拡張機能のボタンをクリックして別のタブを起動するには、以下の手順を実行します。

拡張機能のボタンを定義する: manifest.json ファイルに拡張機能のボタンを定義します。

JavaScript コードを記述する: 拡張機能のボタンをクリックしたときの処理を記述する JavaScript コードを作成します。

以下は、拡張機能のボタンをクリックして別のタブを起動するための JavaScript コードの例です。

document.getElementById("your-button").addEventListener("click", function() {
  chrome.tabs.create({
    url: "https://www.example.com"
  });
});

このコードは、HTML ページ内の id が "your-button" の要素を取得し、そのクリックイベントにリスナーを追加します。リスナー内では、chrome.tabs.create() メソッドを使用して新しいタブを開きます。

t-cool commented 1 year ago

@tanykazy

chatGPT に解決してもらいました。

Angular での拡張機能開発で、拡張機能の画面からマウスのフォーカスが外れた場合でも、拡張機能の画面が閉じないようにするにはどうすればいいですか?

Angular での拡張機能開発で、拡張機能の画面がマウスのフォーカスが外れた場合にも閉じないようにするには、JavaScript の window.blur イベントを検知し、イベントのデフォルト動作をキャンセルすることができます。

以下は、Angular で拡張機能の画面がマウスのフォーカスが外れた場合でも閉じないようにする例です。

window オブジェクトの blur イベントを検知する:

// extension-button.component.ts
import { Component, HostListener } from '@angular/core';

@Component({
  selector: 'app-extension-button',
  templateUrl: './extension-button.component.html',
  styleUrls: ['./extension-button.component.css']
})
export class ExtensionButtonComponent {
  @HostListener('window:blur', ['$event'])
  onBlur(event: FocusEvent) {
    event.preventDefault();
  }
}

このように、HostListener デコレータを使って window オブジェクトの blur イベントを検知し、イベントのデフォルト動作をキャンセルすることで、拡張機能の画面がマウスのフォーカスが外れた場合でも閉じないようにすることができます。

t-cool commented 1 year ago

解決したので閉じます。 https://github.com/gdg-nara/mierukun/commit/11f24af727092da76c18e8c028fdca46b8bb18d9

tanykazy commented 1 year ago

すみません。 フォーカスではなく、拡張機能のポップアップウィンドウ以外をクリックした場合でした。 その場合、すべての状態が失われてしまいます。

t-cool commented 1 year ago

@tanykazy 別タブで起動する実装に変わったので解決でOKでしょうか?

tanykazy commented 1 year ago

ありがとうございます。 ポップアップ以外の部分をクリックすると閉じてしまっていましたが、これで明示的にタブを閉じる操作を行わないと終了しなくなりました。