|
3149 | 3149 | if (_.isObject(sd.para.heatmap.collect_tags)) { |
3150 | 3150 | if (sd.para.heatmap.collect_tags.div === true) { |
3151 | 3151 | sd.para.heatmap.collect_tags.div = { |
3152 | | - ignore_tags: ignore_tags_default |
| 3152 | + ignore_tags: ignore_tags_default, |
| 3153 | + max_level: 1 |
3153 | 3154 | }; |
3154 | 3155 | } else if (_.isObject(sd.para.heatmap.collect_tags.div)) { |
3155 | 3156 | if (sd.para.heatmap.collect_tags.div.ignore_tags) { |
|
3160 | 3161 | } else { |
3161 | 3162 | sd.para.heatmap.collect_tags.div.ignore_tags = ignore_tags_default; |
3162 | 3163 | } |
| 3164 | + if (sd.para.heatmap.collect_tags.div.max_level) { |
| 3165 | + var supportedDivLevel = [1, 2, 3]; |
| 3166 | + if (_.indexOf(supportedDivLevel, sd.para.heatmap.collect_tags.div.max_level) === -1) { |
| 3167 | + sd.para.heatmap.collect_tags.div.max_level = 1; |
| 3168 | + } |
| 3169 | + } |
3163 | 3170 | } else { |
3164 | 3171 | sd.para.heatmap.collect_tags.div = false; |
3165 | 3172 | } |
|
3222 | 3229 |
|
3223 | 3230 | sd.setInitVar = function() { |
3224 | 3231 | sd._t = sd._t || 1 * new Date(); |
3225 | | - sd.lib_version = '1.16.16'; |
| 3232 | + sd.lib_version = '1.17.1'; |
3226 | 3233 | sd.is_first_visitor = false; |
3227 | 3234 | sd.source_channel_standard = 'utm_source utm_medium utm_campaign utm_content utm_term'; |
3228 | 3235 | }; |
|
4127 | 4134 | source: 'sa-web-sdk', |
4128 | 4135 | type: 'v-is-vtrack', |
4129 | 4136 | data: { |
4130 | | - sdkversion: '1.16.16' |
| 4137 | + sdkversion: '1.17.1' |
4131 | 4138 | } |
4132 | 4139 | }, |
4133 | 4140 | '*' |
|
4279 | 4286 | } |
4280 | 4287 | } |
4281 | 4288 |
|
| 4289 | + if (sd.para.heatmap && sd.para.heatmap.collect_tags && _.isObject(sd.para.heatmap.collect_tags)) { |
| 4290 | + _.each(sd.para.heatmap.collect_tags, function(val, key) { |
| 4291 | + if ((key !== 'div') && val) { |
| 4292 | + sd.heatmap.otherTags.push(key); |
| 4293 | + } |
| 4294 | + }); |
| 4295 | + } |
| 4296 | + |
4282 | 4297 | if (heatmapMode.isSeachHasKeyword()) { |
4283 | 4298 | heatmapMode.hasKeywordHandle(); |
4284 | 4299 | } else if (window.parent !== self && vtrackMode.isSearchHasKeyword()) { |
|
5728 | 5743 |
|
5729 | 5744 |
|
5730 | 5745 | var heatmap = (sd.heatmap = { |
5731 | | - getElementPath: function(element, ignoreID) { |
| 5746 | + otherTags: [], |
| 5747 | + getTargetElement: function(element, e) { |
| 5748 | + var that = this; |
| 5749 | + var target = element; |
| 5750 | + if (typeof target !== 'object') { |
| 5751 | + return null; |
| 5752 | + } |
| 5753 | + if (typeof target.tagName !== 'string') { |
| 5754 | + return null; |
| 5755 | + } |
| 5756 | + var tagName = target.tagName.toLowerCase(); |
| 5757 | + if (tagName.toLowerCase() === 'body' || tagName.toLowerCase() === 'html') { |
| 5758 | + return null; |
| 5759 | + } |
| 5760 | + if (!target || !target.parentNode || !target.parentNode.children) { |
| 5761 | + return null; |
| 5762 | + } |
| 5763 | + |
| 5764 | + var parent_ele = target.parentNode; |
| 5765 | + var hasA = that.hasElement(e.originalEvent || e); |
| 5766 | + var trackAttrs = sd.para.heatmap.track_attr; |
| 5767 | + var otherTags = that.otherTags; |
| 5768 | + |
| 5769 | + if (tagName === 'a' || tagName === 'button' || tagName === 'input' || tagName === 'textarea' || _.hasAttributes(target, trackAttrs)) { |
| 5770 | + return target; |
| 5771 | + } else if (_.indexOf(otherTags, tagName) > -1) { |
| 5772 | + return target; |
| 5773 | + } else if (parent_ele.tagName.toLowerCase() === 'button' || parent_ele.tagName.toLowerCase() === 'a' || _.hasAttributes(parent_ele, trackAttrs)) { |
| 5774 | + return parent_ele; |
| 5775 | + } else if (tagName === 'area' && parent_ele.tagName.toLowerCase() === 'map' && _.ry(parent_ele).prev().tagName && _.ry(parent_ele).prev().tagName.toLowerCase() === 'img') { |
| 5776 | + return _.ry(parent_ele).prev(); |
| 5777 | + } else if (hasA) { |
| 5778 | + return hasA; |
| 5779 | + } else if (tagName === 'div' && sd.para.heatmap.collect_tags.div && that.isDivLevelValid(target)) { |
| 5780 | + var max_level = sd.para.heatmap && sd.para.heatmap.collect_tags && sd.para.heatmap.collect_tags.div && sd.para.heatmap.collect_tags.div.max_level || 1; |
| 5781 | + if (max_level > 1 || that.isCollectableDiv(target)) { |
| 5782 | + return target; |
| 5783 | + } else { |
| 5784 | + return null; |
| 5785 | + } |
| 5786 | + } else if (that.isStyleTag(tagName) && sd.para.heatmap.collect_tags.div) { |
| 5787 | + var parentTrackDiv = that.getCollectableParent(target); |
| 5788 | + if (parentTrackDiv && that.isDivLevelValid(parentTrackDiv)) { |
| 5789 | + return parentTrackDiv; |
| 5790 | + } |
| 5791 | + } |
| 5792 | + return null; |
| 5793 | + }, |
| 5794 | + getDivLevels: function(element, rootElement) { |
| 5795 | + var path = heatmap.getElementPath(element, true, rootElement); |
| 5796 | + var pathArr = path.split(' > '); |
| 5797 | + var ans = 0; |
| 5798 | + _.each(pathArr, function(tag) { |
| 5799 | + if (tag === 'div') { |
| 5800 | + ans++; |
| 5801 | + } |
| 5802 | + }); |
| 5803 | + return ans; |
| 5804 | + }, |
| 5805 | + isDivLevelValid: function(element) { |
| 5806 | + var max_level = sd.para.heatmap && sd.para.heatmap.collect_tags && sd.para.heatmap.collect_tags.div && sd.para.heatmap.collect_tags.div.max_level || 1; |
| 5807 | + |
| 5808 | + var allDiv = element.getElementsByTagName('div'); |
| 5809 | + for (var i = allDiv.length - 1; i >= 0; i--) { |
| 5810 | + if (heatmap.getDivLevels(allDiv[i], element) > max_level) { |
| 5811 | + return false; |
| 5812 | + } |
| 5813 | + } |
| 5814 | + return true; |
| 5815 | + }, |
| 5816 | + getElementPath: function(element, ignoreID, rootElement) { |
5732 | 5817 | var names = []; |
5733 | 5818 | while (element.parentNode) { |
5734 | 5819 | if (element.id && !ignoreID && /^[A-Za-z][-A-Za-z0-9_:.]*$/.test(element.id)) { |
5735 | 5820 | names.unshift(element.tagName.toLowerCase() + '#' + element.id); |
5736 | 5821 | break; |
5737 | 5822 | } else { |
5738 | | - if (element === document.body) { |
| 5823 | + if (rootElement && element === rootElement) { |
| 5824 | + names.unshift(element.tagName.toLowerCase()); |
| 5825 | + break; |
| 5826 | + } else if (element === document.body) { |
5739 | 5827 | names.unshift('body'); |
5740 | 5828 | break; |
5741 | 5829 | } else { |
|
5915 | 6003 | } |
5916 | 6004 | }, |
5917 | 6005 | hasElement: function(e) { |
5918 | | - var path = e._getPath(); |
| 6006 | + var path = e._getPath ? e._getPath() : heatmap.getElementPath(e.target, true).split(' > '); |
5919 | 6007 | if (_.isArray(path) && path.length > 0) { |
5920 | 6008 | for (var i = 0; i < path.length; i++) { |
5921 | 6009 | if (path[i] && path[i].tagName && path[i].tagName.toLowerCase() === 'a') { |
|
5948 | 6036 | continue; |
5949 | 6037 | } |
5950 | 6038 | var tag = target.children[i].tagName.toLowerCase(); |
5951 | | - if (this.isStyleTag(tag, isVisualMode)) { |
| 6039 | + var max_level = sd.para && sd.para.heatmap && sd.para.heatmap.collect_tags && sd.para.heatmap.collect_tags.div && sd.para.heatmap.collect_tags.div.max_level; |
| 6040 | + if ((tag === 'div' && max_level > 1) || this.isStyleTag(tag, isVisualMode)) { |
5952 | 6041 | if (!this.isCollectableDiv(target.children[i], isVisualMode)) { |
5953 | 6042 | return false; |
5954 | 6043 | } |
|
5970 | 6059 | if (parentName === 'body') { |
5971 | 6060 | return false; |
5972 | 6061 | } |
5973 | | - if (parentName && parentName === 'div' && this.isCollectableDiv(parent, isVisualMode)) { |
| 6062 | + var max_level = sd.para && sd.para.heatmap && sd.para.heatmap.collect_tags && sd.para.heatmap.collect_tags.div && sd.para.heatmap.collect_tags.div.max_level; |
| 6063 | + if (parentName && parentName === 'div' && (max_level > 1 || this.isCollectableDiv(parent, isVisualMode))) { |
5974 | 6064 | return parent; |
5975 | 6065 | } else if (parent && this.isStyleTag(parentName, isVisualMode)) { |
5976 | 6066 | return this.getCollectableParent(parent, isVisualMode); |
|
6105 | 6195 | return false; |
6106 | 6196 | } |
6107 | 6197 | var target = ev.target || ev.srcElement; |
6108 | | - if (typeof target !== 'object') { |
6109 | | - return false; |
6110 | | - } |
6111 | | - if (typeof target.tagName !== 'string') { |
6112 | | - return false; |
6113 | | - } |
6114 | | - var tagName = target.tagName.toLowerCase(); |
6115 | | - if (tagName.toLowerCase() === 'body' || tagName.toLowerCase() === 'html') { |
6116 | | - return false; |
6117 | | - } |
6118 | | - if (!target || !target.parentNode || !target.parentNode.children) { |
6119 | | - return false; |
6120 | | - } |
6121 | | - |
6122 | | - var parent_ele = target.parentNode; |
6123 | | - var hasA = that.hasElement(e); |
6124 | | - var trackAttrs = sd.para.heatmap.track_attr; |
6125 | | - if (tagName === 'a' || tagName === 'button' || tagName === 'input' || tagName === 'textarea' || _.hasAttributes(target, trackAttrs)) { |
6126 | | - that.start(ev, target, tagName); |
6127 | | - } else if (parent_ele.tagName.toLowerCase() === 'button' || parent_ele.tagName.toLowerCase() === 'a' || _.hasAttributes(parent_ele, trackAttrs)) { |
6128 | | - that.start(ev, parent_ele, target.parentNode.tagName.toLowerCase()); |
6129 | | - } else if (tagName === 'area' && parent_ele.tagName.toLowerCase() === 'map' && _.ry(parent_ele).prev().tagName && _.ry(parent_ele).prev().tagName.toLowerCase() === 'img') { |
6130 | | - that.start(ev, _.ry(parent_ele).prev(), _.ry(parent_ele).prev().tagName.toLowerCase()); |
6131 | | - } else if (hasA) { |
6132 | | - that.start(ev, hasA, hasA.tagName.toLowerCase()); |
6133 | | - } else if (tagName === 'div' && sd.para.heatmap.collect_tags.div && that.isCollectableDiv(target)) { |
6134 | | - that.start(ev, target, tagName); |
6135 | | - } else if (that.isStyleTag(tagName)) { |
6136 | | - if (sd.para.heatmap.collect_tags.div) { |
6137 | | - var divTarget = that.getCollectableParent(target); |
6138 | | - if (divTarget) { |
6139 | | - that.start(ev, divTarget, 'div'); |
6140 | | - } |
6141 | | - } |
| 6198 | + var theTarget = sd.heatmap.getTargetElement(target, e); |
| 6199 | + if (theTarget) { |
| 6200 | + that.start(ev, theTarget, theTarget.tagName.toLowerCase()); |
6142 | 6201 | } |
6143 | 6202 | }); |
6144 | 6203 | } |
|
0 commit comments