Add Support module and added support for attachEvent.

Note that attachEvent support is currently useless until $ works in Internet Explorer.
This commit is contained in:
Nate B 2011-06-30 17:53:50 -06:00
parent fae6542845
commit 2c307ddb3b
2 changed files with 116 additions and 25 deletions

View File

@ -14,6 +14,17 @@ Browser support: IE9+, Latest versions of Firefox, Chrome, Safari, Opera
## Modules: ##
**Support**: Provides browser feature detection
properties:
* attachEvent:
True if `attachEvent` is supported
* addEventListener:
True if `addEventListener` is supported
* querySelector:
True if `querySelectorAll` is supported
**Ajax**: simple, jQuery-like ajax functions
functions:
@ -60,6 +71,7 @@ Browser support: IE9+, Latest versions of Firefox, Chrome, Safari, Opera
**Event**: wrapper for applying events to DOM objects
*Depends on the `Support` module*
functions:

101
kis.js
View File

@ -9,8 +9,11 @@
"use strict";
// Property name for expandos on DOM objects
var kis_expando = "KIS_0_1_0";
//Browser requirements check
if (typeof document.querySelectorAll !== "function" || typeof window.addEventListener !== "function")
if (!document.querySelectorAll)
{
return;
}
@ -19,7 +22,7 @@
$_ = {};
window.$_ = window.$_ || $_;
$_ = window.$_ = window.$_ || $_;
/**
* $
@ -35,6 +38,23 @@
window.$ = $;
/**
* Support
*
* Module for browser feature detection
*/
(function (){
var support = {
attachEvent: typeof window.attachEvent === "function",
addEventListener: typeof window.addEventListener === "function",
querySelector: typeof document.querySelectorAll === "function"
};
$_.support = support;
}());
/**
* Ajax
*
@ -108,12 +128,12 @@
}
};
window.$_.get = function (url, data, callback)
$_.get = function (url, data, callback)
{
ajax._do(url, data, callback, false);
};
window.$_.post = function (url, data, callback)
$_.post = function (url, data, callback)
{
ajax._do(url, data, callback, true);
};
@ -126,7 +146,7 @@
*/
(function (){
window.$_.hb = (history.pushState) ? false : true;
$_.hb = (history.pushState) ? false : true;
var qs = {
parse: function (hb)
@ -207,7 +227,7 @@
}
};
window.$_.qs = qs;
$_.qs = qs;
}());
@ -249,18 +269,25 @@
}
};
window.$_.store = store;
$_.store = store;
}());
/**
* Event object
*
* Event api wrapper
* Requires Support module
*/
(function (){
var attach, remove, add_remove, e;
var attach, remove, add_remove, e, support;
support = $_.support;
// Define the proper attach and remove functions
// based on browser support
if(support.addEventListener)
{
attach = function (sel, event, callback)
{
if (typeof sel.addEventListener === "function")
@ -268,7 +295,6 @@
sel.addEventListener(event, callback, false);
}
};
remove = function (sel, event, callback)
{
if (typeof sel.removeEventListener === "function")
@ -276,6 +302,59 @@
sel.removeEventListener(event, callback, false);
}
};
}
else if(support.attachEvent)
{
attach = function (sel, event, callback)
{
function listener () {
// Internet Explorer fails to correctly set the 'this' object
// for event listeners, so we need to set it ourselves.
callback.apply(sel, arguments);
}
if (typeof sel.attachEvent === "function")
{
remove(sel, event, callback); // Make sure we don't have duplicate listeners
sel.attachEvent("on" + event, listener);
// Store our listener so we can remove it later
// TODO: Fix memory leak in IE6/7 with event listeners
var expando = sel[kis_expando] = sel[kis_expando] || {};
expando.listeners = expando.listeners || {};
expando.listeners[event] = expando.listeners[event] || [];
expando.listeners[event].push({
callback: callback,
listener: listener
});
}
};
remove = function (sel, event, callback)
{
if(typeof typeof sel.detachEvent === "function")
{
var expando = sel[kis_expando];
if (expando && expando.listeners
&& expando.listeners[event])
{
var listeners = expando.listeners[event];
for (var i=0; i<listeners.length; i++)
{
if (listeners[i].callback === callback)
{
sel.detachEvent("on" + event, listeners[i].listener);
listeners.splice(i, 1);
if(listeners.length === 0)
{
delete expando.listeners[event];
}
return;
}
}
}
}
};
}
add_remove = function (sel, event, callback, add)
{
@ -335,7 +414,7 @@
}
};
window.$_.event = e;
$_.event = e;
}());
@ -616,7 +695,7 @@
}
};
window.$_.dom = d;
$_.dom = d;
}());
}());