关于我们┊AboutMe

昵称:Hopol(■童■)

联系:QQ:18883

邮箱:info(at)18883.com

主页:www.18883.com

手机浏览 日志归档 RSS 2.0 订阅
Register | Login

JS类库Behaviour v1.1

这个类库最大的好处就是
1.能用CSS选择器方式来选择页面中的元素
2.同时将事件定义在该元素上
以上两点都在JS中完成
这样做的效果就是做到将页面元素跟事件完全分开,而使页面HTML代码部分更加清爽
如果再配上最近炒得很火得AJAX与CSS+DIV布局,页面能干净到极点
该JS类库为 Behaviour v1.1
/*
     Behaviour v1.1 by Ben Nolan, June 2005. Based largely on the work
     of Simon Willison (see comments by Simon below).
    
     Description:
         
         Uses css selectors to apply javascript behaviours to enable
         unobtrusive javascript in html documents.
         
     Usage:     
     
     var myrules = {
             'b.someclass' : function(element){
                 element.onclick = function(){
                     alert(this.innerHTML);
                 }
             },
             '#someid u' : function(element){
                 element.onmouseover = function(){
                     this.innerHTML = "BLAH!";
                 }
             }
     };
     
     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){
                             continue;
                     }
    
                     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 {
                 
window.onload = function() {
                     
oldonload();
                     
func();
                 }
             }
     }
}
    
Behaviour.start();
    
/*
     The following code is Copyright (C) Simon Willison 2004.
    
     document.getElementsBySelector(selector)
     - returns an array of element objects from the current document
         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 
         contained inside the 'div' element which has id="main"
    
     New in version 0.4: Support for CSS2 and CSS3 attribute selectors:
     See http://www.w3.org/TR/css3-selectors/#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 
*/
    
function getAllChildren(e) {
     
// Returns all children of element. Workaround required for IE5/Windows. Ugh.
     
return e.all e.all e.getElementsByTagName('*');
}
    
document.getElementsBySelector = function(selector) {
     
// Attempt to fail gracefully in lesser browsers
     
if (!document.getElementsByTagName) {
     return new Array();
     }
     
// Split selector in to tokens
     
var tokens selector.split(' ');
     var 
currentContext = new Array(document);
     for (var 
0tokens.lengthi++) {
     
token tokens[i].replace(/^s+/,'').replace(/s+$/,'');;
     if (
token.indexOf('#') > -1) {
         
// Token is an ID selector
         
var bits token.split('#');
         var 
tagName bits[0];
         var 
id bits[1];
         var 
element document.getElementById(id);
         if (
tagName && element.nodeName.toLowerCase() != tagName) {
             
// tag with that ID not found, return false
             
return new Array();
         }
         
// Set currentContext to contain just this element
         
currentContext = new Array(element);
         continue; 
// Skip to next token
     
}
     if (
token.indexOf('.') > -1) {
         
// Token contains a class selector
         
var bits token.split('.');
         var 
tagName bits[0];
         var 
className bits[1];
         if (!
tagName) {
             
tagName '*';
         }
         
// Get elements matching tag, filter them for class selector
         
var found = new Array;
         var 
foundCount 0;
         for (var 
0currentContext.lengthh++) {
             var 
elements;
             if (
tagName == '*') {
                 
elements getAllChildren(currentContext[h]);
             } else {
                 
elements currentContext[h].getElementsByTagName(tagName);
             }
             for (var 
0elements.lengthj++) {
             
found[foundCount++] = elements[j];
             }
         }
         
currentContext = new Array;
         var 
currentContextIndex 0;
         for (var 
0found.lengthk++) {
             if (
found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b'))) {
             
currentContext[currentContextIndex++] = found[k];
             }
         }
         continue; 
// Skip to next token
     
}
     
// Code to deal with attribute selectors
     
if (token.match(/^(w*)[(w+)([=~|^$*]?)=?"?([^\]"]*)"?\]$/)) {
         var tagName = RegExp.$1;
         var attrName = RegExp.$2;
         var attrOperator = RegExp.$3;
         var attrValue = RegExp.$4;
         if (!tagName) {
             tagName = '*';
         }
         // Grab all of the tagName elements within current context
         var found = new Array;
         var foundCount = 0;
         for (var h = 0; h < currentContext.length; h++) {
             var elements;
             if (tagName == '*') {
                 elements = getAllChildren(currentContext[h]);
             } else {
                 elements = currentContext[h].getElementsByTagName(tagName);
             }
             for (var j = 0; j < elements.length; j++) {
             found[foundCount++] = elements[j];
             }
         }
         currentContext = new Array;
         var currentContextIndex = 0;
         var checkFunction; // This function will be used to filter the elements
         switch (attrOperator) {
             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'))); };
             break;
             case '|': // Match start with value followed by optional hyphen
             checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
             break;
             case '^': // Match starts with value
             checkFunction = function(e) { return (e.getAttribute(attrName).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); };
             break;
             case '*': // Match ends with value
             checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
             break;
             default :
             // Just test for existence of attribute
             checkFunction = function(e) { return e.getAttribute(attrName); };
         }
         currentContext = new Array;
         var currentContextIndex = 0;
         for (var k = 0; k < found.length; k++) {
             if (checkFunction(found[k])) {
             currentContext[currentContextIndex++] = found[k];
             }
         }
         // 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;
     var foundCount = 0;
     for (var h = 0; h < currentContext.length; h++) {
         var elements = currentContext[h].getElementsByTagName(tagName);
         for (var j = 0; j < elements.length; j++) {
             found[foundCount++] = elements[j];
         }
     }
     currentContext = found;
     }
     return currentContext;
}
    
/* That revolting regular expression explained 
/^(\w+)\[(\w+)([=~\|\^\$\*]?)=?"
?([^]"]*)"?]$/
     ---/     ---/-------------/     -------/
     |         |             |                     |
     |         |             |                 
The value
     
|         |     ~,|,^,$,* or =
     |     
Attribute 
     Tag
*/

Tags: javascript, 类库

« 上一篇 | 下一篇 »

只显示10条记录相关文章

正则表达式练习器、Javascript脚本程序调试器 (浏览: 2779, 评论: 0)
常用JS网页广告代码 (浏览: 2365, 评论: 0)
模仿AS效果的导航菜单 (浏览: 2044, 评论: 0)
比PS和Flash做的还好的按钮 (浏览: 2144, 评论: 0)

发表评论