PageSourceSearch

https://con-med.ru/js/jquery.iframetracker.js

js con-med.ru collected 2026-09-24 09:13:10 UTC 6,048 bytes, 201 lines download raw bytes

vendor: 6,048 bytes, lines 1-201
1(function (root, factory) {
2	if (typeof define === 'function' && define.amd) {
3		define(["jquery"], function (a0) {
4			return (factory(a0));
5		});
6	} else if (typeof module === 'object' && module.exports) {
7		module.exports = factory(require("jquery"));
8	} else {
9		factory(root["jQuery"]);
10	}
11}(this, function (jQuery) {
12
13/*!
14 * jQuery iframe click tracking plugin
15 *
16 * @author Vincent Paré
17 * @copyright © 2013-2018 Vincent Paré
18 * @license http://opensource.org/licenses/Apache-2.0
19 * @version 2.1.0
20 */
21(function($) {
22	// Tracking handler manager
23	$.fn.iframeTracker = function(handler) {
24		// Building handler object from handler function
25		if (typeof handler == "function") {
26			handler = {
27				blurCallback: handler
28			};
29		}
30
31		var target = this.get();
32		if (handler === null || handler === false) {
33			$.iframeTracker.untrack(target);
34		} else if (typeof handler == "object") {
35			$.iframeTracker.track(target, handler);
36		} else {
37			throw new Error("Wrong handler type (must be an object, or null|false to untrack)");
38		}
39		return this;
40	};
41
42	// Iframe tracker common object
43	$.iframeTracker = {
44		// State
45		focusRetriever: null,  // Element used for restoring focus on window (element)
46		focusRetrieved: false, // Says if the focus was retrieved on the current page (bool)
47		handlersList: [],      // Store a list of every trakers (created by calling $(selector).iframeTracker...)
48		isIE8AndOlder: false,  // true for Internet Explorer 8 and older
49
50		// Init (called once on document ready)
51		init: function() {
52			// Determine browser version (IE8-) ($.browser.msie is deprecated since jQuery 1.9)
53			try {
54				if ($.browser.msie === true && $.browser.version < 9) {
55					this.isIE8AndOlder = true;
56				}
57			} catch (ex) {
58				try {
59					var matches = navigator.userAgent.match(/(msie) ([\w.]+)/i);
60					if (matches[2] < 9) {
61						this.isIE8AndOlder = true;
62					}
63				} catch (ex2) {}
64			}
65
66			// Listening window blur
67			$(window).focus();
68			$(window).blur(function(e) {
69				$.iframeTracker.windowLoseFocus(e);
70			});
71
72			// Focus retriever (get the focus back to the page, on mouse move)
73			$("body").append('<div style="position:fixed; top:0; left:0; overflow:hidden;"><input style="position:absolute; left:-300px;" type="text" value="" id="focus_retriever" readonly="true" /></div>');
74			this.focusRetriever = $("#focus_retriever");
75			this.focusRetrieved = false;
76
77			// Special processing to make it work with my old friend IE8 (and older) ;)
78			if (this.isIE8AndOlder) {
79				// Blur doesn't works correctly on IE8-, so we need to trigger it manually
80				this.focusRetriever.blur(function(e) {
81					e.stopPropagation();
82					e.preventDefault();
83					$.iframeTracker.windowLoseFocus(e);
84				});
85
86				// Keep focus on window (fix bug IE8-, focusable elements)
87				$("body").click(function(e) {
88					$(window).focus();
89				});
90				$("form").click(function(e) {
91					e.stopPropagation();
92				});
93
94				// Same thing for "post-DOMready" created forms (issue #6)
95				try {
96					$("body").on("click", "form", function(e) {
97						e.stopPropagation();
98					});
99				} catch (ex) {
100					console.log("[iframeTracker] Please update jQuery to 1.7 or newer. (exception: " + ex.message + ")");
101				}
102			}
103		},
104
105		// Add tracker to target using handler (bind boundary listener + register handler)
106		// target: Array of target elements (native DOM elements)
107		// handler: User handler object
108		track: function(target, handler) {
109			// Adding target elements references into handler
110			handler.target = target;
111
112			// Storing the new handler into handler list
113			$.iframeTracker.handlersList.push(handler);
114
115			// Binding boundary listener
116			$(target)
117				.bind("mouseover", { handler: handler }, $.iframeTracker.mouseoverListener)
118				.bind("mouseout",  { handler: handler }, $.iframeTracker.mouseoutListener);
119		},
120
121		// Remove tracking on target elements
122		// target: Array of target elements (native DOM elements)
123		untrack: function(target) {
124			if (typeof Array.prototype.filter != "function") {
125				console.log("Your browser doesn't support Array filter, untrack disabled");
126				return;
127			}
128
129			// Unbinding boundary listener
130			$(target).each(function(index) {
131				$(this)
132					.unbind("mouseover", $.iframeTracker.mouseoverListener)
133					.unbind("mouseout", $.iframeTracker.mouseoutListener);
134			});
135
136			// Handler garbage collector
137			var nullFilter = function(value) {
138				return value === null ? false : true;
139			};
140			for (var i in this.handlersList) {
141				// Prune target
142				for (var j in this.handlersList[i].target) {
143					if ($.inArray(this.handlersList[i].target[j], target) !== -1) {
144						this.handlersList[i].target[j] = null;
145					}
146				}
147				this.handlersList[i].target = this.handlersList[i].target.filter(nullFilter);
148
149				// Delete handler if unused
150				if (this.handlersList[i].target.length === 0) {
151					this.handlersList[i] = null;
152				}
153			}
154			this.handlersList = this.handlersList.filter(nullFilter);
155		},
156
157		// Target mouseover event listener
158		mouseoverListener: function(e) {
159			e.data.handler.over = true;
160			$.iframeTracker.retrieveFocus();
161			try {
162				e.data.handler.overCallback(this, e);
163			} catch (ex) {}
164		},
165
166		// Target mouseout event listener
167		mouseoutListener: function(e) {
168			e.data.handler.over = false;
169			$.iframeTracker.retrieveFocus();
170			try {
171				e.data.handler.outCallback(this, e);
172			} catch (ex) {}
173		},
174
175		// Give back focus from an iframe to parent page
176		retrieveFocus: function() {
177			if (document.activeElement && document.activeElement.tagName === "IFRAME") {
178				$.iframeTracker.focusRetriever.focus();
179				$.iframeTracker.focusRetrieved = true;
180			}
181		},
182
183		// Calls blurCallback for every handler with over=true on window blur
184		windowLoseFocus: function(e) {
185			for (var i in this.handlersList) {
186				if (this.handlersList[i].over === true) {
187					try {
188						this.handlersList[i].blurCallback(e);
189					} catch (ex) {}
190				}
191			}
192		}
193	};
194
195	// Init the iframeTracker on document ready
196	$(document).ready(function() {
197		$.iframeTracker.init();
198	});
199})(jQuery);
200
201}));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.