|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;(function() { |
|
|
'use strict' |
|
|
|
|
|
function scaleImageMap() { |
|
|
function resizeMap() { |
|
|
function resizeAreaTag(cachedAreaCoords, idx) { |
|
|
function scale(coord) { |
|
|
var dimension = 1 === (isWidth = 1 - isWidth) ? 'width' : 'height' |
|
|
return ( |
|
|
padding[dimension] + |
|
|
Math.floor(Number(coord) * scalingFactor[dimension]) |
|
|
) |
|
|
} |
|
|
|
|
|
var isWidth = 0 |
|
|
areas[idx].coords = cachedAreaCoords |
|
|
.split(',') |
|
|
.map(scale) |
|
|
.join(',') |
|
|
} |
|
|
|
|
|
var scalingFactor = { |
|
|
width: image.width / image.naturalWidth, |
|
|
height: image.height / image.naturalHeight, |
|
|
} |
|
|
|
|
|
var padding = { |
|
|
width: parseInt( |
|
|
window.getComputedStyle(image, null).getPropertyValue('padding-left'), |
|
|
10 |
|
|
), |
|
|
height: parseInt( |
|
|
window.getComputedStyle(image, null).getPropertyValue('padding-top'), |
|
|
10 |
|
|
), |
|
|
} |
|
|
|
|
|
cachedAreaCoordsArray.forEach(resizeAreaTag) |
|
|
} |
|
|
|
|
|
function getCoords(e) { |
|
|
|
|
|
return e.coords.replace(/ *, */g, ',').replace(/ +/g, ',') |
|
|
} |
|
|
|
|
|
function debounce() { |
|
|
clearTimeout(timer) |
|
|
timer = setTimeout(resizeMap, 250) |
|
|
} |
|
|
|
|
|
function start() { |
|
|
if ( |
|
|
image.width !== image.naturalWidth || |
|
|
image.height !== image.naturalHeight |
|
|
) { |
|
|
resizeMap() |
|
|
} |
|
|
} |
|
|
|
|
|
function addEventListeners() { |
|
|
image.addEventListener('load', resizeMap, false) |
|
|
window.addEventListener('focus', resizeMap, false) |
|
|
window.addEventListener('resize', debounce, false) |
|
|
window.addEventListener('readystatechange', resizeMap, false) |
|
|
document.addEventListener('fullscreenchange', resizeMap, false) |
|
|
} |
|
|
|
|
|
function beenHere() { |
|
|
return 'function' === typeof map._resize |
|
|
} |
|
|
|
|
|
function getImg(name) { |
|
|
return document.querySelector('img[usemap="' + name + '"]') |
|
|
} |
|
|
|
|
|
function setup() { |
|
|
areas = map.getElementsByTagName('area') |
|
|
cachedAreaCoordsArray = Array.prototype.map.call(areas, getCoords) |
|
|
image = getImg('#' + map.name) || getImg(map.name) |
|
|
map._resize = resizeMap |
|
|
} |
|
|
|
|
|
var |
|
|
map = this, |
|
|
areas = null, |
|
|
cachedAreaCoordsArray = null, |
|
|
image = null, |
|
|
timer = null |
|
|
|
|
|
if (!beenHere()) { |
|
|
setup() |
|
|
addEventListeners() |
|
|
start() |
|
|
} else { |
|
|
map._resize() |
|
|
} |
|
|
} |
|
|
|
|
|
function factory() { |
|
|
function chkMap(element) { |
|
|
if (!element.tagName) { |
|
|
throw new TypeError('Object is not a valid DOM element') |
|
|
} else if ('MAP' !== element.tagName.toUpperCase()) { |
|
|
throw new TypeError( |
|
|
'Expected <MAP> tag, found <' + element.tagName + '>.' |
|
|
) |
|
|
} |
|
|
} |
|
|
|
|
|
function init(element) { |
|
|
if (element) { |
|
|
chkMap(element) |
|
|
scaleImageMap.call(element) |
|
|
maps.push(element) |
|
|
} |
|
|
} |
|
|
|
|
|
var maps |
|
|
|
|
|
return function imageMapResizeF(target) { |
|
|
maps = [] |
|
|
|
|
|
switch (typeof target) { |
|
|
case 'undefined': |
|
|
case 'string': |
|
|
Array.prototype.forEach.call( |
|
|
document.querySelectorAll(target || 'map'), |
|
|
init |
|
|
) |
|
|
break |
|
|
case 'object': |
|
|
init(target) |
|
|
break |
|
|
default: |
|
|
throw new TypeError('Unexpected data type (' + typeof target + ').') |
|
|
} |
|
|
|
|
|
return maps |
|
|
} |
|
|
} |
|
|
|
|
|
if (typeof define === 'function' && define.amd) { |
|
|
define([], factory) |
|
|
} else if (typeof module === 'object' && typeof module.exports === 'object') { |
|
|
module.exports = factory() |
|
|
} else { |
|
|
window.imageMapResize = factory() |
|
|
} |
|
|
|
|
|
if ('jQuery' in window) { |
|
|
window.jQuery.fn.imageMapResize = function $imageMapResizeF() { |
|
|
return this.filter('map') |
|
|
.each(scaleImageMap) |
|
|
.end() |
|
|
} |
|
|
} |
|
|
})() |
|
|
|