2024년 9월 23일 월요일 오전 9:57:14
SPFx의 사용자 정의 팝업 링크로 사용자 경험 향상
최신 SharePoint 개발에서 PnP Modern Search WebPart(SPFx)를 사용하여 구성 가능한 검색 결과를 제공하면 사용자 환경이 크게 향상될 수 있습니다. 링크가 열리는 방식을 제어하는 것은 특히 "세부 목록" 레이아웃에서 개발자들 사이에서 인기 있는 기능입니다. 일반적으로 링크는 새 탭에서 열리지만 팝업 창에서 열고 싶다면 어떻게 해야 할까요?
이 게시물에서는 PnP Modern Search WebPart의 링크 동작을 변경하여 이 기능을 구현하는 방법을 살펴보겠습니다. 새 탭에서 검색 결과를 여는 대신 링크를 사용자 정의된 팝업 창에서 강제로 열어 더욱 통합된 사용자 경험을 제공하는 방법을 보여 드리겠습니다.
새 탭이 기본값으로 설정되는 ``와 같은 수식을 사용할 때 문제가 발생합니다. 그러나 JavaScript를 사용하면 이 동작을 무시하고 제어된 팝업 창에서 링크를 열 수 있습니다. 이를 통해 동일한 탐색 세션 내에서 콘텐츠를 더 유연하게 표시할 수 있습니다.
명령 | 사용예 |
---|---|
window.open() | 이 명령은 새 브라우저 창이나 탭을 엽니다. 이 메서드는 너비, 높이, 스크롤 막대와 같은 특정 크기 및 속성이 포함된 팝업 창을 엽니다. |
event.preventDefault() | 동일한 탭이나 새 탭에서 URL을 여는 클릭된 링크의 기본 동작을 방지합니다. 이를 통해 대신 팝업을 여는 등 링크 작동 방식을 사용자 정의할 수 있습니다. |
querySelectorAll() | data-popup 속성은 모든 앵커 요소(). 이 메소드는 NodeList를 반환하므로 이벤트 리스너를 여러 구성 요소에 동시에 적용할 수 있습니다. |
forEach() | querySelectorAll()에 의해 생성된 NodeList의 각 항목은 작업(예: 이벤트 리스너 연결)을 수신합니다. 이는 PnP Modern Search의 많은 동적 링크 요소를 관리하는 데 적용됩니다. |
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: JavaScript 삽입과 함께 SPFx를 사용하는 백엔드 접근 방식
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 Modern Search WebPart(SPFx) 및 링크 동작 사용자 정의에 관한 정보는 공식 문서에서 제공되었습니다. 자세한 내용은 다음을 방문하세요. PnP 최신 검색 GitHub 리포지토리 .
- 다음과 같은 JavaScript 메소드 사용에 대한 지침 창.열기() 이벤트 리스너는 MDN 웹 문서 자바스크립트용.
- JavaScript 삽입 및 @보수, 에서 찾을 수 있습니다. SharePoint 프레임워크 개요 .