|
|
@ -3,17 +3,18 @@ import Hint from './hint'; |
|
|
|
import * as dom from 'shared/utils/dom'; |
|
|
|
import * as dom from 'shared/utils/dom'; |
|
|
|
|
|
|
|
|
|
|
|
const TARGET_SELECTOR = [ |
|
|
|
const TARGET_SELECTOR = [ |
|
|
|
'a', 'button', 'input', 'textarea', |
|
|
|
'a', 'button', 'input', 'textarea', 'area', |
|
|
|
'[contenteditable=true]', '[contenteditable=""]', '[tabindex]' |
|
|
|
'[contenteditable=true]', '[contenteditable=""]', '[tabindex]' |
|
|
|
].join(','); |
|
|
|
].join(','); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const inViewport = (win, element, viewSize, framePosition) => { |
|
|
|
const inViewport = (win, element, viewSize, framePosition) => { |
|
|
|
let { |
|
|
|
let { |
|
|
|
top, left, bottom, right |
|
|
|
top, left, bottom, right |
|
|
|
} = element.getBoundingClientRect(); |
|
|
|
} = dom.viewportRect(element); |
|
|
|
let doc = win.doc; |
|
|
|
let doc = win.document; |
|
|
|
let frameWidth = win.innerWidth || doc.documentElement.clientWidth; |
|
|
|
let frameWidth = doc.documentElement.clientWidth; |
|
|
|
let frameHeight = win.innerHeight || doc.documentElement.clientHeight; |
|
|
|
let frameHeight = doc.documentElement.clientHeight; |
|
|
|
|
|
|
|
|
|
|
|
if (right < 0 || bottom < 0 || top > frameHeight || left > frameWidth) { |
|
|
|
if (right < 0 || bottom < 0 || top > frameHeight || left > frameWidth) { |
|
|
|
// out of frame
|
|
|
|
// out of frame
|
|
|
@ -115,6 +116,7 @@ export default class Follow { |
|
|
|
let element = hint.target; |
|
|
|
let element = hint.target; |
|
|
|
switch (element.tagName.toLowerCase()) { |
|
|
|
switch (element.tagName.toLowerCase()) { |
|
|
|
case 'a': |
|
|
|
case 'a': |
|
|
|
|
|
|
|
case 'area': |
|
|
|
return this.openLink(element); |
|
|
|
return this.openLink(element); |
|
|
|
case 'input': |
|
|
|
case 'input': |
|
|
|
switch (element.type) { |
|
|
|
switch (element.type) { |
|
|
@ -162,7 +164,9 @@ export default class Follow { |
|
|
|
let all = win.document.querySelectorAll(TARGET_SELECTOR); |
|
|
|
let all = win.document.querySelectorAll(TARGET_SELECTOR); |
|
|
|
let filtered = Array.prototype.filter.call(all, (element) => { |
|
|
|
let filtered = Array.prototype.filter.call(all, (element) => { |
|
|
|
let style = win.getComputedStyle(element); |
|
|
|
let style = win.getComputedStyle(element); |
|
|
|
return style.display !== 'none' && |
|
|
|
|
|
|
|
|
|
|
|
// AREA's 'display' in Browser style is 'none'
|
|
|
|
|
|
|
|
return (element.tagName === 'AREA' || style.display !== 'none') && |
|
|
|
style.visibility !== 'hidden' && |
|
|
|
style.visibility !== 'hidden' && |
|
|
|
element.type !== 'hidden' && |
|
|
|
element.type !== 'hidden' && |
|
|
|
element.offsetHeight > 0 && |
|
|
|
element.offsetHeight > 0 && |
|
|
|