/*
Behaviour v1.1 by Ben Nolan, June 2005. Based largely on the work
of Simon Willison (see comments by Simon below).
-
+ Small fixes by J.Dobrowolski for Front Accounting May 2008
Description:
-
+
Uses css selectors to apply javascript behaviours to enable
unobtrusive javascript in html documents.
-
- Usage:
-
+
+ Usage:
+
var myrules = {
'b.someclass' : function(element){
element.onclick = function(){
}
}
};
-
+
Behaviour.register(myrules);
-
+
// Call Behaviour.apply() to re-apply the rules (if you
// update the dom, etc).
License:
-
+
This file is entirely BSD licensed.
-
+
More information:
-
+
http://ripcord.co.nz/behaviour/
-
-*/
+
+*/
var Behaviour = {
list : new Array,
-
+
register : function(sheet){
Behaviour.list.push(sheet);
},
-
+
start : function(){
Behaviour.addLoadEvent(function(){
Behaviour.apply();
});
},
-
+
apply : function(){
for (h=0;sheet=Behaviour.list[h];h++){
for (selector in sheet){
- list = document.getElementsBySelector(selector);
-
- if (!list){
+ var sels = selector.split(',');
+ for (var n = 0; n < sels.length; n++) {
+ list = document.getElementsBySelector(sels[n]);
+
+ if (!list){
continue;
- }
+ }
- for (i=0;element=list[i];i++){
+ for (i=0;element=list[i];i++){
sheet[selector](element);
+ }
}
}
}
},
-
+
addLoadEvent : function(func){
var oldonload = window.onload;
-
+
if (typeof window.onload != 'function') {
window.onload = func;
} else {
document.getElementsBySelector(selector)
- returns an array of element objects from the current document
- matching the CSS selector. Selectors can contain element names,
+ matching the CSS selector. Selectors can contain element names,
class names and ids and can be nested. For example:
-
+
elements = document.getElementsBySelect('div#main p a.external')
-
- Will return an array of all 'a' elements with 'external' in their
- class attribute that are contained inside 'p' elements that are
+
+ Will return an array of all 'a' elements with 'external' in their
+ class attribute that are contained inside 'p' elements that are
contained inside the 'div' element which has id="main"
New in version 0.4: Support for CSS2 and CSS3 attribute selectors:
Version 0.4 - Simon Willison, March 25th 2003
-- Works in Phoenix 0.5, Mozilla 1.3, Opera 7, Internet Explorer 6, Internet Explorer 5 on Windows
- -- Opera 7 fails
+ -- Opera 7 fails
*/
function getAllChildren(e) {
var tokens = selector.split(' ');
var currentContext = new Array(document);
for (var i = 0; i < tokens.length; i++) {
- token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');;
+ token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');
if (token.indexOf('#') > -1) {
// Token is an ID selector
var bits = token.split('#');
continue; // Skip to next token
}
// Code to deal with attribute selectors
-/* Original reg expression /^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/
+/* Original reg expression /^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/
was replaced by new RegExp() cuz compressor fault */
if (token.match(new RegExp('^(\\w*)\\[(\\w+)([=~\\|\\^\\$\\*]?)=?"?([^\\]"]*)"?\\]$'))) {
var tagName = RegExp.$1;
case '=': // Equality
checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
break;
- case '~': // Match one of space seperated words
- checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };
+ case '~': // Match one of space seperated words
+ checkFunction = function(e) { var a=e.getAttribute(attrName); return (a && a.match(new RegExp('\\b'+attrValue+'\\b'))); };
break;
case '|': // Match start with value followed by optional hyphen
- checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
+ checkFunction = function(e) { var a=e.getAttribute(attrName); return (a && a.match(new RegExp('^'+attrValue+'-?'))); };
break;
case '^': // Match starts with value
- checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
+ checkFunction = function(e) { var a=e.getAttribute(attrName); return (a && a.indexOf(attrValue) == 0); };
break;
case '$': // Match ends with value - fails with "Warning" in Opera 7
- checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
+ checkFunction = function(e) { var a=e.getAttribute(attrName); return (a && a.lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
break;
- case '*': // Match ends with value
- checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
+ case '*': // Match contains value
+ checkFunction = function(e) { var a=e.getAttribute(attrName); return (a && a.indexOf(attrValue) > -1); };
break;
default :
// Just test for existence of attribute
// alert('Attribute Selector: '+tagName+' '+attrName+' '+attrOperator+' '+attrValue);
continue; // Skip to next token
}
-
+
if (!currentContext[0]){
return;
}
-
+
// If we get here, token is JUST an element (not a class or ID selector)
tagName = token;
var found = new Array;
return currentContext;
}
-/* That revolting regular expression explained
+/* That revolting regular expression explained
/^(\w+)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/
\---/ \---/\-------------/ \-------/
| | | |
| | | The value
| | ~,|,^,$,* or =
- | Attribute
+ | Attribute
Tag
*/