89 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
| import { getWindow, getDocument } from 'ssr-window';
 | |
| import { elementChildren } from '../../shared/utils.js';
 | |
| export default function HashNavigation({
 | |
|   swiper,
 | |
|   extendParams,
 | |
|   emit,
 | |
|   on
 | |
| }) {
 | |
|   let initialized = false;
 | |
|   const document = getDocument();
 | |
|   const window = getWindow();
 | |
|   extendParams({
 | |
|     hashNavigation: {
 | |
|       enabled: false,
 | |
|       replaceState: false,
 | |
|       watchState: false,
 | |
|       getSlideIndex(_s, hash) {
 | |
|         if (swiper.virtual && swiper.params.virtual.enabled) {
 | |
|           const slideWithHash = swiper.slides.filter(slideEl => slideEl.getAttribute('data-hash') === hash)[0];
 | |
|           if (!slideWithHash) return 0;
 | |
|           const index = parseInt(slideWithHash.getAttribute('data-swiper-slide-index'), 10);
 | |
|           return index;
 | |
|         }
 | |
|         return swiper.getSlideIndex(elementChildren(swiper.slidesEl, `.${swiper.params.slideClass}[data-hash="${hash}"], swiper-slide[data-hash="${hash}"]`)[0]);
 | |
|       }
 | |
|     }
 | |
|   });
 | |
|   const onHashChange = () => {
 | |
|     emit('hashChange');
 | |
|     const newHash = document.location.hash.replace('#', '');
 | |
|     const activeSlideEl = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector(`[data-swiper-slide-index="${swiper.activeIndex}"]`) : swiper.slides[swiper.activeIndex];
 | |
|     const activeSlideHash = activeSlideEl ? activeSlideEl.getAttribute('data-hash') : '';
 | |
|     if (newHash !== activeSlideHash) {
 | |
|       const newIndex = swiper.params.hashNavigation.getSlideIndex(swiper, newHash);
 | |
|       if (typeof newIndex === 'undefined' || Number.isNaN(newIndex)) return;
 | |
|       swiper.slideTo(newIndex);
 | |
|     }
 | |
|   };
 | |
|   const setHash = () => {
 | |
|     if (!initialized || !swiper.params.hashNavigation.enabled) return;
 | |
|     const activeSlideEl = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector(`[data-swiper-slide-index="${swiper.activeIndex}"]`) : swiper.slides[swiper.activeIndex];
 | |
|     const activeSlideHash = activeSlideEl ? activeSlideEl.getAttribute('data-hash') || activeSlideEl.getAttribute('data-history') : '';
 | |
|     if (swiper.params.hashNavigation.replaceState && window.history && window.history.replaceState) {
 | |
|       window.history.replaceState(null, null, `#${activeSlideHash}` || '');
 | |
|       emit('hashSet');
 | |
|     } else {
 | |
|       document.location.hash = activeSlideHash || '';
 | |
|       emit('hashSet');
 | |
|     }
 | |
|   };
 | |
|   const init = () => {
 | |
|     if (!swiper.params.hashNavigation.enabled || swiper.params.history && swiper.params.history.enabled) return;
 | |
|     initialized = true;
 | |
|     const hash = document.location.hash.replace('#', '');
 | |
|     if (hash) {
 | |
|       const speed = 0;
 | |
|       const index = swiper.params.hashNavigation.getSlideIndex(swiper, hash);
 | |
|       swiper.slideTo(index || 0, speed, swiper.params.runCallbacksOnInit, true);
 | |
|     }
 | |
|     if (swiper.params.hashNavigation.watchState) {
 | |
|       window.addEventListener('hashchange', onHashChange);
 | |
|     }
 | |
|   };
 | |
|   const destroy = () => {
 | |
|     if (swiper.params.hashNavigation.watchState) {
 | |
|       window.removeEventListener('hashchange', onHashChange);
 | |
|     }
 | |
|   };
 | |
|   on('init', () => {
 | |
|     if (swiper.params.hashNavigation.enabled) {
 | |
|       init();
 | |
|     }
 | |
|   });
 | |
|   on('destroy', () => {
 | |
|     if (swiper.params.hashNavigation.enabled) {
 | |
|       destroy();
 | |
|     }
 | |
|   });
 | |
|   on('transitionEnd _freeModeNoMomentumRelease', () => {
 | |
|     if (initialized) {
 | |
|       setHash();
 | |
|     }
 | |
|   });
 | |
|   on('slideChange', () => {
 | |
|     if (initialized && swiper.params.cssMode) {
 | |
|       setHash();
 | |
|     }
 | |
|   });
 | |
| } |