Created
April 27, 2010 17:13
-
-
Save ryanflorence/381015 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
--- | |
script: Browser.Features.extras | |
description: Taken directly from jQuery 1.4.2 and adapted for MooTools. A collection of properties that represent the presence of different browser features or bugs. | |
license: MIT-style license. | |
authors: "The jQuery Core Developers", Ryan Florence (http://ryanflorence.com) | |
requires: | |
- core:1.2.4:[Browser] | |
provides: [Browser.Features.extras] | |
... | |
*/ | |
(function(document, undefined) { | |
var root = document.documentElement, | |
script = document.createElement("script"), | |
div = document.createElement("div"), | |
id = "script" + (new Date).getTime(); | |
div.style.display = "none"; | |
div.innerHTML = " <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>"; | |
var all = div.getElementsByTagName("*"), | |
a = div.getElementsByTagName("a")[0]; | |
// Can't get basic test support | |
if ( !all || !all.length || !a ) { | |
return; | |
} | |
$extend(Browser.Features, { | |
// IE strips leading whitespace when .innerHTML is used | |
leadingWhitespace: div.firstChild.nodeType === 3, | |
// Make sure that tbody elements aren't automatically inserted | |
// IE will insert them into empty tables | |
tbody: !div.getElementsByTagName("tbody").length, | |
// Make sure that link elements get serialized correctly by innerHTML | |
// This requires a wrapper element in IE | |
htmlSerialize: !!div.getElementsByTagName("link").length, | |
// Get the style information from getAttribute | |
// (IE uses .cssText insted) | |
style: /red/.test( a.getAttribute("style") ), | |
// Make sure that URLs aren't manipulated | |
// (IE normalizes it by default) | |
hrefNormalized: a.getAttribute("href") === "/a", | |
// Make sure that element opacity exists | |
// (IE uses filter instead) | |
// Use a regex to work around a WebKit issue. See #5145 | |
opacity: /^0.55$/.test( a.style.opacity ), | |
// Verify style float existence | |
// (IE uses styleFloat instead of cssFloat) | |
cssFloat: !!a.style.cssFloat, | |
// Make sure that if no value is specified for a checkbox | |
// that it defaults to "on". | |
// (WebKit defaults to "" instead) | |
checkOn: div.getElementsByTagName("input")[0].value === "on", | |
// Make sure that a selected-by-default option has a working selected property. | |
// (WebKit defaults to false instead of true, IE too, if it's in an optgroup) | |
optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected, | |
parentNode: div.removeChild( div.appendChild( document.createElement("div") ) ).parentNode === null, | |
// Will be defined later | |
deleteExpando: true, | |
checkClone: false, | |
scriptEval: false, | |
noCloneEvent: true, | |
boxModel: null | |
}); | |
script.type = "text/javascript"; | |
try { | |
script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); | |
} catch(e) {} | |
root.insertBefore( script, root.firstChild ); | |
// Make sure that the execution of code works by injecting a script | |
// tag with appendChild/createTextNode | |
// (IE doesn't support this, fails, and uses .text instead) | |
if ( window[ id ] ) { | |
Browser.Features.scriptEval = true; | |
delete window[ id ]; | |
} | |
// Test to see if it's possible to delete an expando from an element | |
// Fails in Internet Explorer | |
try { | |
delete script.test; | |
} catch(e) { | |
Browser.Features.deleteExpando = false; | |
} | |
root.removeChild( script ); | |
if ( div.attachEvent && div.fireEvent ) { | |
div.attachEvent("onclick", function click() { | |
// Cloning a node shouldn't copy over any | |
// bound event handlers (IE does this) | |
Browser.Features.noCloneEvent = false; | |
div.detachEvent("onclick", click); | |
}); | |
div.cloneNode(true).fireEvent("onclick"); | |
} | |
div = document.createElement("div"); | |
div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>"; | |
var fragment = document.createDocumentFragment(); | |
fragment.appendChild( div.firstChild ); | |
// WebKit doesn't clone checked state correctly in fragments | |
Browser.Features.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; | |
// Figure out if the W3C box model works as expected | |
// document.body must exist before we can do this | |
window.addEvent('domready', function() { | |
var div = document.createElement("div"); | |
div.style.width = div.style.paddingLeft = "1px"; | |
document.body.appendChild( div ); | |
Browser.Features.boxModel = div.offsetWidth === 2; | |
document.body.removeChild( div ).style.display = 'none'; | |
div = null; | |
}); | |
// Technique from Juriy Zaytsev | |
// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ | |
var eventSupported = function( eventName ) { | |
var el = document.createElement("div"); | |
eventName = "on" + eventName; | |
var isSupported = (eventName in el); | |
if ( !isSupported ) { | |
el.setAttribute(eventName, "return;"); | |
isSupported = typeof el[eventName] === "function"; | |
} | |
el = null; | |
return isSupported; | |
}; | |
Browser.Features.submitBubbles = eventSupported("submit"); | |
Browser.Features.changeBubbles = eventSupported("change"); | |
// release memory in IE | |
root = script = div = all = a = null; | |
})(document, undefined); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment