Mejora de la experiencia del usuario con enlaces emergentes personalizados en SPFx
En el desarrollo moderno de SharePoint, el uso del elemento web de búsqueda moderna PnP (SPFx) para proporcionar resultados de búsqueda configurables puede mejorar significativamente la experiencia del usuario. Controlar cómo se abren los enlaces es una característica popular entre los desarrolladores, especialmente con el diseño de "Lista detallada". Normalmente los enlaces se abren en una nueva pestaña, pero ¿y si queremos abrirlos en una ventana emergente?
En esta publicación, veremos cómo implementar esta funcionalidad cambiando el comportamiento del vínculo del elemento web de búsqueda moderna PnP. En lugar de abrir los resultados de la búsqueda en una nueva pestaña, mostraremos cómo forzar la apertura del enlace en una ventana emergente personalizada, lo que dará como resultado una experiencia de usuario más integrada.
El desafío surge cuando se utiliza una fórmula como ``, que por defecto es una nueva pestaña. Sin embargo, al usar JavaScript, podemos anular este comportamiento y abrir el enlace en una ventana emergente controlada. Esto permite una mayor flexibilidad a la hora de mostrar contenido dentro de la misma sesión de navegación.
Dominio | Ejemplo de uso |
---|---|
window.open() | Este comando abrirá una nueva ventana o pestaña del navegador. Este método abre una ventana emergente con ciertas dimensiones y propiedades, como ancho, alto y barras de desplazamiento. |
event.preventDefault() | Impide el comportamiento predeterminado de un enlace en el que se hace clic, que es abrir la URL en la misma pestaña o en una nueva. Esto nos permite personalizar cómo actúa el enlace, como abrir una ventana emergente. |
querySelectorAll() | El atributo emergente de datos selecciona todos los elementos de anclaje (). Este método devuelve una NodeList, que nos permite aplicar detectores de eventos a varios componentes simultáneamente. |
forEach() | Cada entrada en NodeList producida por querySelectorAll() recibe una acción (por ejemplo, adjuntar un detector de eventos). Esto se aplica a la gestión de muchos elementos de vínculos dinámicos en PnP Modern Search. |
addEventListener() | Esta técnica agrega un detector de eventos de clic a cada enlace que activa la función openInPopup(). Es necesario para anular el comportamiento de clic predeterminado. |
import { override } | Este decorador forma parte de SharePoint Framework (SPFx) y se utiliza para anular el comportamiento predeterminado de SPFx WebParts. Permite personalizaciones específicas, como inyectar JavaScript para proporcionar funcionalidad emergente. |
@override | En SPFx, un decorador indica que un método o propiedad anula la funcionalidad. Esto es necesario al modificar el comportamiento de los componentes de SharePoint. |
spyOn() | Supervisa las llamadas a funciones durante las pruebas unitarias con Jasmine. En este escenario, se utiliza con window.open() para garantizar que la ventana emergente se inicie correctamente durante la prueba. |
expect() | Este comando se utiliza para pruebas unitarias en Jasmine. Comprueba que se llamó a window.open() con los argumentos correctos, garantizando que la ventana emergente aparezca con la configuración deseada. |
Comprender la solución de ventana emergente en SPFx
Solución 1: usar JavaScript `window.open` para crear una ventana emergente
<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>
Solución 2: agregar JavaScript en línea directamente a la etiqueta de enlace
<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.
Solución 3: Enfoque de backend usando SPFx con inyección de 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');
}
Prueba unitaria para el comportamiento de la ventana emergente de JavaScript
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));
});
});
Explorando el manejo de eventos y la inyección dinámica de JavaScript en SPFx
Conclusiones clave para implementar ventanas emergentes en SPFx
Referencias y recursos
- La información sobre PnP Modern Search WebPart (SPFx) y la personalización del comportamiento de los enlaces se obtuvo de la documentación oficial. Para más detalles, visite el Repositorio GitHub de búsqueda moderna PnP .
- Orientación sobre el uso de métodos JavaScript como ventana.abierta() y los oyentes de eventos fueron referenciados desde el Documentos web de MDN para JavaScript.
- Detalles sobre las personalizaciones de SharePoint Framework (SPFx), incluida la inyección de JavaScript y @anular, se puede encontrar en el Descripción general del marco de SharePoint .