WEB前端开发工程师的随记–黑妞HAHA

——专注web前端开发,关注用户体验

Category Archives: YUI/mootools/jquery

YUI3 Anim组件

渐隐效果:

YUI().use('anim-base', function(Y) {
    var anim = new Y.Anim({
        node: '#demo',
        to: { opacity: 0 }
    });

    var onClick = function(e) {
        e.preventDefault();
        anim.run();
    };

    Y.one('#demo .yui3-remove').on('click', onClick);
});

demo地址:http://developer.yahoo.com/yui/3/examples/anim/end-event_clean.html

缩放效果:

YUI().use('anim', function(Y) {
    var module = Y.one('#demo');

    // add fx plugin to module body
    var content = module.query('.yui3-bd').plug(Y.Plugin.NodeFX, {
        from: { height: 0 },
        to: {
            height: function(node) { // dynamic in case of change
                return node.get('scrollHeight'); // get expanded height (offsetHeight may be zero)
            }
        },

        easing: Y.Easing.easeOut,
        duration: 0.5
    });

    var onClick = function(e) {
        module.toggleClass('yui-closed');
        content.fx.set('reverse', !content.fx.get('reverse')); // toggle reverse
        content.fx.run();
    };

    // use dynamic control for dynamic behavior
    var control = Y.Node.create(
        '<a title="show/hide content">' +
            '<em>toggle</em>' +
        '</a>'
    );

    // append dynamic control to header section
    module.query('.yui3-hd').appendChild(control);
    control.on('click', onClick);
});

demo地址:http://developer.yahoo.com/yui/3/examples/anim/reverse_clean.html

yui3组件开发 Alloy UI

YUI3中:checked/:disabled/:enabled浏览器支持测试

<!DOCTYPE html>
<html>
<head>
<meta  content="text/html; charset=gbk"/>
<title>YUI3中:checked/:disabled/:enabled浏览器支持测试</title>
</head>
<body>
<ul id="input_con">
<li><input type="checkbox" disabled="disabled" checked="checked" value="111"/><strong>111</strong></li>
<li><input type="checkbox" disabled="disabled" checked="checked" value="222"/><strong>222</strong></li>
<li><input type="checkbox" disabled="disabled" checked="checked" value="333"/><strong>333</strong></li>
<li><input type="checkbox" checked="checked" value="0001"/>0001</li>
<li><input type="checkbox" disabled="disabled" checked="checked" value="444"/><strong>444</strong></li>
<li><input type="checkbox" checked="checked" value="0002"/>0002</li>
<li><input type="checkbox" value="0003"/>0003</li>
<li><input type="checkbox"/>0004</li>
<li><input type="checkbox"/>0005</li>
<li><input type="checkbox"/>0006</li>
<li><input type="checkbox"/>0007</li>
<li>正确结果:11 6 7 4</li>
<li>执行结果:<span id="txt_result"></span></li>
<li>结论::checked/:disabled/:enabled浏览器支持测试,FF/Safari/chrome都支持,IE6/IE7/IE8都不支持</li>
</ul>

<script src="http://static.alimama.com/union/js/sys/mm.js" type="text/javascript"></script>
<script type="text/javascript">
YUI().use("node","dom",function(Y){
var input_con = Y.one("#input_con");
var txt_result = Y.one("#txt_result");
var len_checkboxs = input_con.all("input").size();
var checked_checkbox = input_con.all(":checked");
var disabled_checkbox = input_con.all(":disabled");
var enabled_checkbox = input_con.all(":enabled");
var val_result = "总数:"+ len_checkboxs +"个\n选中:"+ checked_checkbox.size() +"个\n可用:"+ enabled_checkbox.size() +"个\n不可用:"+ disabled_checkbox.size() +"个";
txt_result.set("innerHTML",val_result);


//各种浏览器兼容写法
function len_checkbox(attr){
var num=0;
//YUI3
var inputs = input_con.all("input");
inputs.each(function(node,index){
//ie6/ie7不支持node.getAttribute("checked") == "checked",但是支持node.get("checked") == true
if(node.get(attr) == true){
num++;
//alert(node.get("value"));
}
});


/*
//纯js
var inputs = document.getElementById("input_con").getElementsByTagName("input");
for(var i=0;i<inputs.length;i++){
if(inputs[i].getAttribute(attr)){
//alert(inputs[i].value);
num++;
}
}
*/
return num;
}
var len_disabled = len_checkbox("disabled");
var len_checked = len_checkbox("checked");
alert("不可用:"+len_disabled);
alert("选中:"+len_checked);
});
</script>
</body>
</html>

YUI event事件

YUI的Event包可以用来操纵DOM事件,也可以自定义事件。
1. 要使用Event,首先要引入YUI3的种子文件:

<script src="http://yui.yahooapis.com/3.0.0/build/yui/yui-min.js"></script>

然后加载相应模块:

YUI().use('event', function(Y) {
});

2. 设置事件响应函数:on()
有两个on方法,一个是YUI的,一个是Node的

Y.on(“click”, handleClick, “#foo p”) 设置元素”#foo p”的click事件处理函数为handleClick。

foo.on(“click”, handleClick) 的作用与上面的一样

对于YUI的on方法,参数如下:

1) 事件名。关于各事件在主要浏览器中的兼容性,可以参见这里:

http://www.quirksmode.org/dom/events/index.html

2) 事件处理句柄

3) 元素,可以是多个,多个的写法是这样:[“#foo p”, “#bar”]

4) 上下文对象,即事件处理函数中的this,如果忽略,就是target元素的Node

5) 参数,可以有多个,按顺序为事件处理函数中event之后的参数
3. 移除事件响应函数
有三种方式:

1) 在事件名前加前缀,然后用YUI的detach移除

2) 保存事件句柄,然后通过该句柄移除

3) 用YUI的detach,指定事件名、处理函数和元素

YUI().use('node-base', function(Y) {
  //an event handler:
    function handleClick(e) {
        Y.log(e);
    }

    var fooHandle = Y.on("eventcatgory|click", handleClick, "#foo");

    //第一种
    Y.detach('eventcategory|click');
	Y.detach('eventcategory|*');

    //第二种
    fooHandle.detach();
    Y.detach(fooHandle);

    //第三种
    Y.detach("click", handleClick, "#foo");
});

另外,Event.purgeElement可以清理所有通过on添加的事件处理函数,而且可以

设定是否对子元素递归清理。
4.模拟鼠标事件
可以通过Node.simulate()模拟鼠标事件,可以模拟7种鼠标事件:

* click

* dblclick

* mousedown

* mouseup

* mouseover

* mouseout

* mousemove

同时可以指定一些附加信息,例如:

YUI().use('node-event-simulate', function(Y) {
    Y.one("body").simulate("click", { shiftKey: true });
});

模拟按下Shift键的click事件,这些附加信息包括:

* detail – click的次数.

* screenX/screenY

* clientX/clientY

* ctrlKey/altKey/shiftKey/metaKey

* button – 0:左,1:右, 2:中

* relatedTarget
5. 模拟键盘事件
可以模拟以下事件:

* keyup

* keydown

* keypress

keyup和keydown必须指定keyCode,keypress必须指定charCode,另外还可以

指定ctrlKey, altKey, shiftKey和metaKey,以下是几个例子:

YUI().use('node-event-simulate', function(Y) {
     var node = Y.one("#myDiv");

    node.simulate("keydown", { keyCode: 97 });

    //simulate typing "a"
    node.simulate("keypress", { charCode: 97, altKey: true });
});

6. available(onAvailable)和contentready(onContentReady)事件
available事件在一个元素刚刚出现在DOM树中时触发。

contentready事件在一个元素和它的下一个元素都可以用getElementById获得

时触发,以保证该元素已加载完毕(除了动态加载的内容以外)
7. domready(onDOMReady)事件
domready事件在DOM树构建完成时触发,有可能是在图像加载完毕以前。
8. delegate方法
事件代理(Event delegate)机制可以在父元素处唯一绑定一个listener监听该

父元素的多个子元素处发生的事件,以如下的html为例:

<div id="container">
    <ul>
        <li id="item-1"><em>Item Type One</em></li>
        <li id="item-2"><em>Item Type Two</em></li>
        <li id="item-3"><em>Item Type Three</em></li>
    </ul>
</div>

以下这段代码将一listener绑定到”container”,却监听着其3个子元素(<li>)处的

click事件:

YUI().use("event-delegate", function(Y) {

	Y.delegate("click", function(e) {
		Y.log("Default scope: " + this.get("id"));
 		Y.log("Clicked list item: " + e.currentTarget.get("id"));
		Y.log("Event target: " + e.target);
		Y.log("Delegation container: " + e.container.get("id"));
 	}, "#container", "li");
});

9. focus和blur事件
DOM的focus和blur事件是不做冒泡传递的,但YUI的Event utility的focus和blur事件

却可以,因此可以实现集中的事件处理。

以下是一段示例代码:

YUI().use("event-focus", function(Y) {
    var handle = Y.on("focus", function(e, arg1, arg2, etc) {
		Y.log("target: " + e.target + ", arguments: " + arg1 + ", " + arg2 + ", " + etc);
    }, "#toolbar", Y, "arg1", "arg2", "etc");
});

其中”#toolbar”是一个包含3个按钮的<div>,如下:

<div id="toolbar">
    <input type="button" id="button-cut" name="button-cut" value="Cut">
    <input type="button" id="button-copy" name="button-copy" value="Copy">
    <input type="button" id="button-paste" name="button-paste" value="Paste">
</div>

10. mouseenter和mouseleave事件
YUI也提供mouseenter和mouseleave事件,代码如下所示:

YUI().use("event-mouseenter", function(Y) {
	Y.on("mouseenter", function (e) {
		Y.log("Mouse entered: " + this.get("id"));
	}, "#container");
	Y.on("mouseleave", function (e) {
		Y.log("Mouse left: " + this.get("id"));
	}, "#container");
});

11. 自定义事件

可以使用on实现简单的自定义事件。注册listener是这样的:

Y.on('customapp:started', function(arg1, arg2, arg3) {
    Y.log('Custom App Started, now I can do a a few things);
});

激发这个事件是这样的:

YUI().use('event-custom', function(Y) {
    Y.fire('customapp:started', 1, 2, 3);
});

另外可以用augment将一对象提升为Event target,用publish定义一个Event,注册listener

还是用on,激发事件还是用fire,下面是示例代码:

YUI().use('event-custom', function(Y) {

	function Publisher() {
		this.publish("publisher:testEvent", {});
	}

	Y.augment(Publisher, Y.EventTarget, null, null, 'test');

	publisher = new Publisher();
	publisher.on("publisher:testEvent", function(e){
		alert(e);
	});

	publisher.fire("publisher:testEvent", 'test arg1');
});

其中publish只有当需要覆盖默认配置时才需要。

jquery 基础总结

$(document).ready(function(){})
//相当于onload事件

jQuery对象与dom对象的转换
$("#msg").html();
$("#msg")[0].innerHTML;
$("#msg").eq(0)[0].innerHTML;
$("#msg").get(0).innerHTML;

如何获取jQuery集合的某一项
$("div").eq(2).html();              //调用jquery对象的方法
$("div").get(2).innerHTML;       //调用dom的方法属性

同一函数实现set和get
$("#msg").html();              //返回id为msg的元素节点的html内容。
$("#msg").html("<b>new content</b>");
$("#msg").text();              //返回id为msg的元素节点的文本内容。
$("#msg").text("<b>new content</b>");

$("#msg").height();              //返回id为msg的元素的高度
$("#msg").height("300");       //将id为msg的元素的高度设为300
$("#msg").width();              //返回id为msg的元素的宽度
$("#msg").width("300");       //将id为msg的元素的宽度设为300

$("input").val(");       //返回表单输入框的value值
$("input").val("test");       //将表单输入框的value值设为test

$("#msg").click();       //触发id为msg的元素的单击事件
$("#msg").click(fn);       //为id为msg的元素单击事件添加函数
同样blur,focus,select,submit事件都可以有着两种调用方法

集合处理功能
$("p").each(function(i){this.style.color=['#f00','#0f0','#00f']})
// 为索引分别为0,1,2的p元素分别设定不同的字体颜色。

$("tr").each(function(i){this.style.backgroundColor=['#ccc','#fff'][i%2]})
//实现表格的隔行换色效果

$("p").click(function(){.html())})
//为每个p元素增加了click事件,单击某个p元素则弹出其内容\

操作元素的样式
$("#msg").css("background");              //返回元素的背景颜色
$("#msg").css("background","#ccc")       //设定元素背景为灰色
$("#msg").height(300); $("#msg").width("200");       //设定宽高
$("#msg").css({ color: "red", background: "blue" });//以名值对的形式设定样式
$("#msg").addClass("select");       //为元素增加名称为select的class
$("#msg").removeClass("select");       //删除元素名称为select的class
$("#msg").toggleClass("select");       //如果存在(不存在)就删除(添加)名称为select的class

绑定事件
$("p").bind("click", function(){.text());});       //为每个p元素添加单击事件
$("p").unbind();       //删除所有p元素上的所有事件
$("p").unbind("click")       //删除所有p元素上的单击事件

YUI3 Node.simulate()模拟鼠标事件

触发事件,类似于mootools的fireEvent()方法

YUI().use('node-event-simulate', function(Y) {
 Y.one("#test").simulate("click", { shiftKey: true });
});

YUI3中Node好用的方法 substitute模版替换

从字符串直接创建结点

var str = ‘<div class=”item”><input type=”text” name=”user.name” value=”username” size=”20″/></div>’;
var node = Y.Node.create(str);

前面添加

Y.one(’body’).prepend(node);

后面添加

Y.one(’body’).append(node);

模板替换,依赖’substitute’模块

var html,
 templ = ‘<li><a href=”{link}”  title=”{title}”>{title}</a></li>’
 data = [
 {title: 'link 1', link: 'http://URL_1'},
 {title: 'link 2', link: 'http://URL_2'},
 {title: 'link 3', link: 'http://URL_3'},
 {title: 'link 4', link: 'http://URL_4'},
 {title: 'link 5', link: 'http://URL_5'}
 ];
 html = ‘<ul>’;
 Y.each(data, function(e){
 html += Y.substitute(templ, {link: e.link, title: e.title});
 });
 html += ‘</ul>’;
 Y.one(’body’).prepend(html);

连写

Y.one(’body’).prepend(html).all(’a').addClass(’foo’);

insert结点

Y.one(’#cont’).insert(html, ‘after’); //在#cont后插入
Y.one(’#cont’).insert(html, ‘before’); //在#cont前插入
Y.one(’#cont’).insert(html, ‘replace’); //替换#cont
Y.one(’#cont’).insert(html, 2); //在#cont的childNodes[2]前插入
Y.one(’#cont’).insert(html, refNode); //在refNode前插入

删除结点

node.remove();

替换结点

node.replace(newnode);

dom查找:

node.next() //node的下一个兄弟结点
node.previous() //node的前一个兄弟结点
node.ancestor(’.cont’) //找到第一个class名为cont的父结点
nodelist.filter(’a[title]‘); //符合条件的保留
nodelist.odd(); //奇数项保留
nodelist.even(); //偶数项保留
NodeList对象同样支持each和some遍历。

YUI3中Y.mix方法编写功能模块

Y.mix(fun1, fun2, 0, null, 1);//将fun1的prototype上的属性添加到obj上:
Y.mix(obj, fun1, 0, null, 3);//将obj的属性添加到fun1的prototype上:
Y.mix(fun1, obj, 0, null, 4);//Y.mix实现了相当灵活的代码重用。一个object或function可以被mix到任意地方。

Y.mix

Y.mix(obj1, obj2); //将obj2的成员添加到obj1中,重复不覆盖

Y.merge 将若干对象合并成一个新对象,重复的覆盖

var newobj = Y.merge(obj1, obj2, obj3, …);

Y.extend 从一个function对象上继承,包括原型链上和自身的方法和属性。

var fn1 = function(){
this.foo3 = function(){};
};
fn1.prototype = {
foo1: function(){},
foo2: function(){}
};
var fn2 = function(){
fn2.superclass.constructor.call(this);
};
Y.extend(fn2, fn1, {
//fn2原型链上的方法
});

var fn = new fn2();
fn.foo3();

ppt 电子书项目总结 前端 by 拔赤

YUI 2.x和YUI 3.x的DOM方法对应表

html code:

<div id="idname"></div>
<div class="classname"></div>

YUI2中DOM使用方法:

(function() {
  YAHOO.util.Dom.get('idname');
  YAHOO.util.Dom.getElementsByClassName('classname').addClass('mytest');
  YAHOO.util.Dom.getElementsByClassName('classname', 'div').addClass('mytest');
})();

YUI3中DOM使用方法:

YUI().use('node', function(Y) {
   Y.one('#idname').addClass('mytest');
   Y.one('.classname').addClass('mytest');
});

YUI2.x的Node功能是由YAHOO.util.Dom提供的,其与YUI3.0的对应关系如下:

2.x (via YAHOO.util.Dom) 3.0
addClass myNode.addClass
batch NodeList[methodName], NodeList.each, or Y.each
generateId Y.guid
get Y.one
getAncestorBy myNode.ancestor
getAncestorByClassName myNode.ancestor
getAncestorByTagName myNode.ancestor
getChildren myNode.get(‘children’)
getChildrenBy myNode.all
getClientRegion myNode.get(‘viewportRegion’)
getDocumentHeight myNode.get(‘docHeight’)
getDocumentScrollLeft myNode.get(‘docScrollX’)
getDocumentScrollTop myNode.get(‘docscrollY’)
getDocumentWidth myNode.get(‘docWidth’)
getElementsBy myNode.all
getElementsByClassName myNode.all
getFirstChild myNode.one
getFirstChildBy myNode.one
getLastChild myNode.one
getLastChildBy myNode.one
getNextSibling myNode.next
getNextSiblingBy myNode.next
getPreviousSibling myNode.previous
getPreviousSiblingBy myNode.previous
getRegion myNode.get(‘region’)
getStyle myNode.getStyle
getViewportHeight myNode.get(‘winHeight’)
getViewportWidth myNode.get(‘winWidth’)
getX myNode.getXY
getY myNode.getXY
getXY myNode.getXY
hasClass myNode.hasClass
inDocument myNode.inDoc
insertAfter myNode.insert
insertBefore myNode.insert
isAncestor myNode.contains (Note myNode.contains(myNode) === true)
removeClass myNode.removeClass
replaceClass myNode.replaceClass
setStyle myNode.setStyle
setX myNode.setXY
setY myNode.setXY
setXY myNode.setXY