fix(aio): handle clicks deep within anchor tags
This commit is contained in:
		
							parent
							
								
									745731e1a3
								
							
						
					
					
						commit
						f90258162a
					
				| @ -308,13 +308,35 @@ describe('AppComponent', () => { | |||||||
|   describe('click intercepting', () => { |   describe('click intercepting', () => { | ||||||
|     it('should intercept clicks on anchors and call `location.handleAnchorClick()`', |     it('should intercept clicks on anchors and call `location.handleAnchorClick()`', | ||||||
|             inject([LocationService], (location: LocationService) => { |             inject([LocationService], (location: LocationService) => { | ||||||
|       const anchorElement: HTMLAnchorElement = document.createElement('a'); | 
 | ||||||
|       anchorElement.href = 'some/local/url'; |       const el = fixture.nativeElement as Element; | ||||||
|       fixture.nativeElement.append(anchorElement); |       el.innerHTML = '<a href="some/local/url">click me</a>'; | ||||||
|  |       const anchorElement = el.getElementsByTagName('a')[0]; | ||||||
|       anchorElement.click(); |       anchorElement.click(); | ||||||
|       expect(location.handleAnchorClick).toHaveBeenCalledWith(anchorElement, 0, false, false); |       expect(location.handleAnchorClick).toHaveBeenCalledWith(anchorElement, 0, false, false); | ||||||
|     })); |     })); | ||||||
| 
 | 
 | ||||||
|  |     it('should intercept clicks on elements deep within an anchor tag', | ||||||
|  |             inject([LocationService], (location: LocationService) => { | ||||||
|  | 
 | ||||||
|  |       const el = fixture.nativeElement as Element; | ||||||
|  |       el.innerHTML = '<a href="some/local/url"><div><img></div></a>'; | ||||||
|  |       const imageElement  = el.getElementsByTagName('img')[0]; | ||||||
|  |       const anchorElement = el.getElementsByTagName('a')[0]; | ||||||
|  |       imageElement.click(); | ||||||
|  |       expect(location.handleAnchorClick).toHaveBeenCalledWith(anchorElement, 0, false, false); | ||||||
|  |     })); | ||||||
|  | 
 | ||||||
|  |     it('should ignore clicks on elements without an anchor ancestor', | ||||||
|  |             inject([LocationService], (location: LocationService) => { | ||||||
|  | 
 | ||||||
|  |       const el = fixture.nativeElement as Element; | ||||||
|  |       el.innerHTML = '<div><p><div><img></div></p></div>'; | ||||||
|  |       const imageElement  = el.getElementsByTagName('img')[0]; | ||||||
|  |       imageElement.click(); | ||||||
|  |       expect(location.handleAnchorClick).not.toHaveBeenCalled(); | ||||||
|  |     })); | ||||||
|  | 
 | ||||||
|     it('should intercept clicks not on the search elements and hide the search results', () => { |     it('should intercept clicks not on the search elements and hide the search results', () => { | ||||||
|       const searchResults: SearchResultsComponent = fixture.debugElement.query(By.directive(SearchResultsComponent)).componentInstance; |       const searchResults: SearchResultsComponent = fixture.debugElement.query(By.directive(SearchResultsComponent)).componentInstance; | ||||||
|       spyOn(searchResults, 'hideResults'); |       spyOn(searchResults, 'hideResults'); | ||||||
|  | |||||||
| @ -133,14 +133,16 @@ export class AppComponent implements OnInit { | |||||||
| 
 | 
 | ||||||
|     if (eventTarget.tagName === 'FOOTER' && metaKey && altKey) { |     if (eventTarget.tagName === 'FOOTER' && metaKey && altKey) { | ||||||
|       this.dtOn = !this.dtOn; |       this.dtOn = !this.dtOn; | ||||||
|  |       return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Deal with anchor clicks
 |     // Deal with anchor clicks; climb DOM tree until anchor found (or null)
 | ||||||
|     if (eventTarget instanceof HTMLImageElement) { |     let target = eventTarget; | ||||||
|       eventTarget = eventTarget.parentElement; // assume image wrapped in Anchor
 |     while (target && !(target instanceof HTMLAnchorElement)) { | ||||||
|  |       target = target.parentElement; | ||||||
|     } |     } | ||||||
|     if (eventTarget instanceof HTMLAnchorElement) { |     if (target) { | ||||||
|       return this.locationService.handleAnchorClick(eventTarget, button, ctrlKey, metaKey); |       return this.locationService.handleAnchorClick(target as HTMLAnchorElement, button, ctrlKey, metaKey); | ||||||
|     } |     } | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user