2024年9月23日月曜日 9:51:11
SPFx のカスタム ポップアップ リンクによるユーザー エクスペリエンスの向上
最新の SharePoint 開発では、PnP モダン検索 Web パーツ (SPFx) を使用して構成可能な検索結果を提供すると、ユーザー エクスペリエンスを大幅に向上させることができます。リンクを開く方法を制御することは、特に「詳細リスト」レイアウトで開発者の間で人気のある機能です。通常、リンクは新しいタブで開きますが、ポップアップ ウィンドウで開きたい場合はどうすればよいでしょうか。
この投稿では、PnP モダン検索 Web パーツのリンク動作を変更することでこの機能を実装する方法を説明します。検索結果を新しいタブで開くのではなく、カスタマイズされたポップアップ ウィンドウでリンクを強制的に開くことで、より統合されたユーザー エクスペリエンスを実現する方法を示します。
この問題は、デフォルトで新しいタブが表示される「」のような数式を使用するときに発生します。ただし、JavaScript を使用すると、この動作をオーバーライドして、制御されたポップアップ ウィンドウでリンクを開くことができます。これにより、同じブラウジング セッション内でコンテンツをより柔軟に表示できるようになります。
指示 | 使用例 |
---|---|
window.open() | このコマンドは、新しいブラウザ ウィンドウまたはタブを開きます。このメソッドは、幅、高さ、スクロールバーなどの特定の寸法とプロパティを備えたポップアップ ウィンドウを開きます。 |
event.preventDefault() | クリックされたリンクのデフォルトの動作、つまり URL を同じタブまたは新しいタブで開くことを防止します。これにより、代わりにポップアップを開くなど、リンクの動作をカスタマイズできます。 |
querySelectorAll() | data-popup 属性はすべてのアンカー要素を選択します ()。このメソッドは NodeList を返します。これにより、イベント リスナーを複数のコンポーネントに同時に適用できます。 |
forEach() | querySelectorAll() によって生成される NodeList 内の各エントリは、アクション (イベント リスナーのアタッチなど) を受け取ります。これは、PnP 最新検索の多くの動的リンク要素の管理に当てはまります。 |
addEventListener() | この手法では、openInPopup() 関数をトリガーするクリック イベント リスナーを各リンクに追加します。これは、デフォルトのクリック動作をオーバーライドするために必要です。 |
import { override } | このデコレータは SharePoint Framework (SPFx) の一部であり、SPFx WebParts のデフォルト動作をオーバーライドするために使用されます。 JavaScript を挿入してポップアップ機能を提供するなど、特定のカスタマイズが可能になります。 |
@override | SPFx では、デコレータはメソッドまたはプロパティが機能をオーバーライドすることを示します。これは、SharePoint コンポーネントの動作を変更するときに必要です。 |
spyOn() | Jasmine による単体テスト中の関数呼び出しを監視します。このシナリオでは、テスト中にポップアップが適切に起動されることを保証するために、window.open() とともに使用されます。 |
expect() | このコマンドは、Jasmine の単体テストに使用されます。 window.open() が正しい引数で呼び出されているかどうかをチェックし、ポップアップが適切な設定で表示されることを保証します。 |
SPFx のポップアップ ウィンドウ ソリューションを理解する
解決策 1: JavaScript `window.open` を使用してポップアップ ウィンドウを作成する
<script>
function openInPopup(url) {
// Define popup window features
const features = 'width=800,height=600,resizable=yes,scrollbars=yes';
// Open URL in popup
window.open(url, '_blank', features);
}
// Override link behavior
document.querySelectorAll('a[data-popup="true"]').forEach(function (link) {
link.addEventListener('click', function (event) {
event.preventDefault(); // Prevent default link behavior
openInPopup(this.href); // Open in popup
});
});
</script>
// HTML for the link:
<a href="{{slot item @root.slots.PreviewUrl}}" data-popup="true" style="color: {{@root.theme.semanticColors.link}}">
{{slot item @root.slots.Destination}}
</a>
解決策 2: インライン JavaScript をリンク タグに直接追加する
このメソッドは HTML リンク タグ内に JavaScript をインラインで埋め込むため、外部依存関係がほとんどない軽量の動的フロントエンド システムに最適です。
<a href="{{slot item @root.slots.PreviewUrl}}"
onclick="event.preventDefault(); window.open(this.href, '_blank', 'width=800,height=600');"
style="color: {{@root.theme.semanticColors.link}}">
{{slot item @root.slots.Destination}}
</a>
// The window.open parameters define the size and behavior of the popup.
解決策 3: SPFx と JavaScript インジェクションを使用したバックエンド アプローチ
import { override } from '@microsoft/decorators';
import { BaseClientSideWebPart } from '@microsoft/sp-webpart-base';
export default class PopupWebPart extends BaseClientSideWebPart {
@override
public render(): void {
this.domElement.innerHTML = `
<a href="{{slot item @root.slots.PreviewUrl}}" onclick="openPopup(this.href)">
{{slot item @root.slots.Destination}}
</a>
`;
}
}
function openPopup(url: string): void {
window.open(url, '_blank', 'width=800,height=600,resizable=yes');
}
JavaScript ポップアップ動作の単体テスト
単体テストでは、ポップアップ機能がブラウザーや環境間で一貫していることを保証できます。フロントエンド検証のための基本的な Jasmine テストを次に示します。
describe('Popup Functionality', function() {
it('should open the link in a popup window', function() {
spyOn(window, 'open');
const testUrl = 'http://example.com';
openInPopup(testUrl);
expect(window.open).toHaveBeenCalledWith(testUrl, '_blank', jasmine.any(String));
});
});
SPFx でのイベント処理と動的 JavaScript インジェクションの探索
SPFx でポップアップ ウィンドウを実装するための重要なポイント
参考文献とリソース
- PnP モダン検索 Web パーツ (SPFx) およびリンク動作のカスタマイズに関する情報は、公式ドキュメントから入手しました。詳細については、次のサイトを参照してください。 PnP 最新検索 GitHub リポジトリ 。
- 次のような JavaScript メソッドの使用に関するガイダンス window.open() イベントリスナーはから参照されました MDN ウェブ ドキュメント JavaScript用。
- JavaScript インジェクションなど、SharePoint Framework (SPFx) のカスタマイズに関する詳細 @オーバーライド、で見つけることができます SharePoint フレームワークの概要 。