UNPKG

zombie-globbies

Version:

A very quick fix for [**Zombie**](https://github.com/assaf/zombie) to permit to crawl correctly webpages with attributes on the html tag (eg: html lang="en").

75 lines (66 loc) 2.46 kB
var FOCUS_ELEMENTS, HTML, elementType, setAttribute, setFocus, _i, _j, _len, _len1, _ref, _ref1; HTML = require("jsdom").defaultLevel; FOCUS_ELEMENTS = ["INPUT", "SELECT", "TEXTAREA", "BUTTON", "ANCHOR"]; HTML.HTMLDocument.prototype.__defineGetter__("activeElement", function() { return this._inFocus || this.body; }); setFocus = function(document, element) { var inFocus, onblur, onfocus; inFocus = document._inFocus; if (element !== inFocus) { if (inFocus) { onblur = document.createEvent("HTMLEvents"); onblur.initEvent("blur", false, false); inFocus.dispatchEvent(onblur); } if (element) { onfocus = document.createEvent("HTMLEvents"); onfocus.initEvent("focus", false, false); element.dispatchEvent(onfocus); document._inFocus = element; return document.window.browser.emit("focus", element); } } }; HTML.HTMLElement.prototype.focus = function() {}; HTML.HTMLElement.prototype.blur = function() {}; _ref = [HTML.HTMLInputElement, HTML.HTMLSelectElement, HTML.HTMLTextAreaElement, HTML.HTMLButtonElement, HTML.HTMLAnchorElement]; for (_i = 0, _len = _ref.length; _i < _len; _i++) { elementType = _ref[_i]; elementType.prototype.focus = function() { return setFocus(this.ownerDocument, this); }; elementType.prototype.blur = function() { return setFocus(this.ownerDocument, null); }; setAttribute = elementType.prototype.setAttribute; elementType.prototype.setAttribute = function(name, value) { var document; setAttribute.call(this, name, value); if (name === "autofocus") { document = this.ownerDocument; if (~FOCUS_ELEMENTS.indexOf(this.tagName) && !document._inFocus) { return this.focus(); } } }; } _ref1 = [HTML.HTMLInputElement, HTML.HTMLTextAreaElement, HTML.HTMLSelectElement]; for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { elementType = _ref1[_j]; elementType.prototype._eventDefaults.focus = function(event) { var element; element = event.target; return element._focusValue = element.value || ''; }; elementType.prototype._eventDefaults.blur = function(event) { var change, element, focusValue; element = event.target; focusValue = element._focusValue; if (focusValue !== element.value) { change = element.ownerDocument.createEvent("HTMLEvents"); change.initEvent("change", false, false); return element.dispatchEvent(change); } }; }