日志标签:jquery

jQuery1.4中创建DOM的新方法

时间:2011年01月06日作者:愚人码头查看次数:4,249 views评论次数:5

在jQ1.4以前我们创建DOM并且添加到DOM树大致是这样的:


var oNewp = $("<p>我测试成功了</p>");
oNewp.addClass("red").appendTo("#target");

或者,稍微复杂一点:


$("<div></div>")
.attr("id","css")
.height(90)
.css("border","1px solid #000")
.html("fuck world!")
.appendTo(document.body);

jQuery1.4带来了一个全新的便捷地清晰的DOM对象创建方法,在 jQuery 1.4中,我们可以传递一个对象作为第二个参数。 这个参数接受一个属性的集合,这些可以传递给.attr() 方法。此外,一些event type(事件类型)能通过, 而且后面的jQuery方法能够调用: val, css, html, text, data, width, height, or offset。详见:http://www.css88.com/jqapi/#p=jQuery

例如,我们创建一个文本框:


$("<input />",{
	"class":"bg-yellow",
	"id":"fuck",
	css:{
		"border":"1px solid #000",
		"font-size":"25px"
	},
	value:"fuck world!",
	focusin:function(){
		$(this).css("border","5px solid #FF3300");
	},
	focusout:function(){
		$(this).css("border","1px solid #000");
	}
}).appendTo(document.body);

例如,我们创建一个容器:


$("<div></div>",{
"class":"bg-yellow",
	"id":"fuckie",
	css:{
		"border":"1px solid #CDCDCD",
		"font-size":"25px"
	},
	html:$("<a>",{
		href: '#',
		html:"hello world!",
	click: function(event) {
			$("#fuckie").css("background-color","#FF3300");
			alert("fuck world!!!!!!!!!!");
			event.preventDefault();
		}
	})
})

}).appendTo(document.body);

参看非常简陋的demo:http://www.css88.com/demo/jqueryCreatDom/

标签:分类:jQuery

自己实现的简单的html元素选择器,类似jquery选择器,比jquery选择器还要快!

时间:2010年11月12日作者:satanultra查看次数:4,642 views评论次数:5

最近做前端,需要选择元素,虽说有jquery和各大js库已经帮我造好了轮子,但我想试试自己实现一个,正好项目也不忙,正好加入自己的js文件中,下面是实现代码。用$g(“#content .op”)这种格式就可以调用,和jquery $()的参数一样:
function $findChilds(parentNode, text)
{
    //如果不传入父节点的话,默认为body
    if(parentNode == undefined)
        parentNode = document.body;
    var childNodes = parentNode.childNodes;
    var results = [];
    //子节点大于零才循环
    if(childNodes.length > 0)
    {
        var length = childNodes.length;
        //循环查找符合text的节点
        for(var i=0;i<length;++i)
        {
            //三种情况,className,id, tagName
            switch(text.substr(0, 1))
            {
            case '.':
                //这两种:parentNode.getElementsByClassName,parentNode.all
//都是后来加上的,如果浏览器这两种方法都不支持,那就只能暴力递归了
                if(parentNode.getElementsByClassName)
                    return parentNode.getElementsByClassName(text.substr(1));
                else if(parentNode.all)
                {
                    var finded = [];
                    var jlength = parentNode.all.length;
                    for(var j=0;j<jlength;++j)
                        if(parentNode.all[j].className == text.substr(1))
                            finded.push(parentNode.all[j]);
                    return finded;
                }
                //以上两种方法都不支持,直接判断
                if(childNodes[i].className == text.substr(1))
                    results.push(childNodes[i]);
                break;
            case '#':
                return [document.getElementById(text.substr(1))];
            default:
                return parentNode.getElementsByTagName(text);
            }
            //判断完后,把当前子元素的子元素传入$findChilds进行递归查找,返回的结果直接和现在的结果合并
            results = results.concat($findChilds(childNodes[i], text));
        }
    }
    return results;
}  

String.prototype.vtrim = function() {
      return this.replace(/^\s+|\s+$/g, '');
}  

function $g(text)
{
    //按照空格分割参数
    var values = text.vtrim().split(" ");
    var length = values.length;
    //如果只有一个选择参数的话,就直接调用dom方法返回结果。
    if(length == 1)
        switch(values[0].substr(0, 1))
        {
        case "#":
            return document.getElementById(values[0].substr(1));
        case ".":
            if(document.getElementsByClassName)
                return document.getElementsByClassName(values[0].substr(1));
        default:
            return document.getElementsByTagName(values[0]);
        }
    //每次迭代都会产生许多符合参数的结果节点,这里结果节点的名称为parentNodes,第一次循环默认为body
    var parentNodes = [document.body];
    //外层循环为迭代每个传入的参数
    for(var i = 0; i < length; ++i)
    {
        var jlength = parentNodes.length;
        var results = [];
        //这里如果values的长度为零的话,
        //就说明是多出来的空格,
        //例如:$g("      .content");这种情况不执行代码直接跳入下一循环
        var tmpValue = values[i].vtrim();
        if(tmpValue.length <= 0)
            continue;
        //内层循环为迭代每个结果节点,
        //在结果节点中查找符合选择条件的结果。当然第一次为body
        for(var j=0;j<jlength;++j)
        {
            //$findChilds就是上边的那个函数,就是选择某个节点的子节点的
            var result = $findChilds(parentNodes[j], values[i].vtrim());
            var rlength = result.length;
            //因为返回的有时候是html容器,无法直接和数组concat所以倒入数组,这里有优化空间,但暂不考虑性能先这么做
            for (var k = 0; k < rlength; ++k)
                results.push(result[k]);
        }
        //没有结果,立即返回undefined
        if(results == undefined || results.length <= 0)
            return undefined;
        //最后一次循环就直接返回结果数组,但是如果最后一个选择条件是选择id的话,那就不返回数组直接返回dom对象了
        if (i == length - 1)
        {
            if (values[i].substr(0, 1) == "#")
                return results[0];
            return results;
        }
        parentNodes = results;
    }
}

经过在ff ie6下的测试 单纯的选择id比jquery要快很多,
其他的部分选择模式我测试的少数比jquery要快。
当然测试不可能全面,还可能会有bug,而且不支持类似于.content:first-child这样的伪类选择。

【jQuery点滴】编写高性能的jQuery代码

时间:2010年11月03日作者:愚人码头查看次数:5,500 views评论次数:6

请记住 – jQuery只是JavaScript。不要以为它有能力来补偿你糟糕的代码。

这意味着,正如我们必须优化JavaScript for语句一样,我们必须优化jQuery的

1
each

方法。


// jQuery's each method source
	each: function( object, callback, args ) {
		var name, i = 0,
			length = object.length,
			isObj = length === undefined || jQuery.isFunction(object);

		if ( args ) {
			if ( isObj ) {
				for ( name in object ) {
					if ( callback.apply( object[ name ], args ) === false ) {
						break;
					}
				}
			} else {
				for ( ; i < length; ) {
					if ( callback.apply( object[ i++ ], args ) === false ) {
						break;
					}
				}
			}

		// A special, fast, case for the most common use of each
		} else {
			if ( isObj ) {
				for ( name in object ) {
					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
						break;
					}
				}
			} else {
				for ( var value = object[0];
					i < length &amp;amp;amp;amp;&amp;amp;amp;amp; callback.call( value, i, value ) !== false; value = object[++i] ) {}
			}
		}

		return object;
	}

糟糕的代码:


someDivs.each(function() {
      $('#anotherDiv')[0].innerHTML += $(this).text();
});
  1. 每一次遍历循环中都会搜寻anotherDiv 这个ID的元素
  2. 两次获取innerHTML属性
  3. 创建了一个jQuery对象,只是为了获取元素的text属性
  4. 优化的代码:

    
    var someDivs = $('#container').find('.someDivs'),
    contents = [];
    
    someDivs.each(function() {
    contents.push( this.innerHTML );
    });
    $('#anotherDiv').html( contents.join('') );
    
    这样,在

    1
    each

    (for)方法,我们唯一要执行任务的关键是增加一个新的到一个数组…而不是查询DOM中,取代了元素两次获取innerHTML属性等。

标签:,分类:jQuery

【jQuery点滴】保证你的代码安全

时间:2010年10月14日作者:愚人码头查看次数:6,038 views评论次数:4

在多人合作开发中一定要确保变量,对象,函数等命名不要冲突:
方法一:当别人使用了其他的js库,并该库使用了”$”变量,那么我们可以使用noConflict()方法:

<br />
var j = jQuery.noConflict();<br />
// Now, instead of $, we use j.<br />
j('#someDiv').hide();</p>
<p>// The line below will reference some other library's $ function.<br />
$('someDiv').style.display = 'none';<br />

方法二,把你的代码放在一个匿名函数里面,然后把jQuery作为参数传递给它,那么在这个函数体中的$是不会影响外面或者被外面影响的。

<br />
(function($) {<br />
// Within this function, $ will always refer to jQuery<br />
})(jQuery);<br />

方法三,通过ready方法传递$

<br />
jQuery(document).ready(function($) {<br />
// $ refers to jQuery<br />
});<br />
// $ is either undefined, or refers to some other library's function.<br />

一不小心写错了,谢谢 birdstudio和QiQiBoY指出!
或者使用简写:

<br />
$(function() {<br />
// let's get up in heeya<br />
});<br />

标签:,分类:jQuery

【jquery插件】图文切换效果

时间:2010年10月11日作者:愚人码头查看次数:7,919 views评论次数:2

参数说明:
effects “flaser”效果(默认)|
“scroll”效果|
“fade”效果
speed 效果执行时间;normal(默认)
标签:,分类:jQuery

【jQuery点滴】简写ready方法

时间:2010年10月10日作者:愚人码头查看次数:4,822 views评论次数:4

在jQuery中监听document 是否 ready的操作:


$(document).ready(function() {
// let's get up in heeya
});

我们可以简化成:


$(function() {
// let's get up in heeya
});

我们可以看jQuery源码,可以看出上面两种写法是一样的:


// HANDLE: $(function)
// Shortcut for document ready
if ( jQuery.isFunction( selector ) ) {
return rootjQuery.ready( selector );
}
标签:,分类:jQuery

【jQuery点滴】不要滥用$(this)

时间:2010年10月08日作者:愚人码头查看次数:5,668 views评论次数:8

如果不了解javasrcipt中基本的DOM属性和方法的话,很容易滥用jQuery对象。比如:


$('#someAnchor').click(function() {

alert( $(this).attr('id') );

});

如果你只是通过jQ对象获取简单的dom元素的属性比如id,那么你完全可以使用js原生的方法:


$('#someAnchor').click(function() {

alert( this.id );

});

诸如“src,” “href,” 和“style.”等一些属性在老版本的ie中使用了getAttribute方法。

标签:,分类:jQuery

【jQuery点滴】find选择器

时间:2010年10月03日作者:愚人码头查看次数:6,366 views评论次数:3

jQuery有非常强大的Sizzle引擎来实现选择器,jQuery做了优化,他们能很好的工作,你一般不必担心太多。然而,我们可以稍微做一些改进,将可以使你的脚本略有提高。

一般在jquery中能不要用Sizzle引擎就不要用,当然前面说了只要有可能,就尽量使用.find()方法。比如:


// Fine in modern browsers, though Sizzle does begin "running"

$('#someDiv p.someClass').hide();

// Better for all browsers, and Sizzle never inits.

$('#someDiv').find('p.someClass').hide();

上面两行代码执行的结果是完全一样的,但是下面一句的效率要比上面一句的执行效率高。
现代浏览器(除IE6,IE7)都有QuerySelectorAll支持,能允许你像CSS选择器一样获取对象,而不需要用到jQuery中的Sizzle引擎。jQuery会在使用自己的引擎之前检查是否存在这个函数。

对于IE6/IE7,就需要jQuery使用Sizzle引擎,jQuery会把你的选择器转化成一个数组,并且通过从右往左来迭代匹配。通过正则表达式匹配页面每一个元素,所以你的可以尽量减少选择器的层级,尽可能的使用最右边的选择器,比如使用ID选择器等;这个规则和我们的css的查找规则是一直的,如果你要优化css选择器也要知道这个规则:从右往左来迭代匹配!

尺度把握:

1.保持代码简单

2.尽可能的使用find()查找,使用浏览器的原生查找函数

3.尽可能使用最右边的选择器,比如ID等

标签:,分类:jQuery

【jQuery点滴】jQuery方法总是返回jQuery对象

时间:2010年10月03日作者:愚人码头查看次数:4,133 views评论次数:2

前几天看到一篇文章《14 Helpful jQuery Tricks, Notes, and Best Practices》感觉很不错,非常时候我这种入门级的人员,所以看懂一条翻译一条,

jQuery方法总是返回jQuery对象:

所以我们可以这样写(链式调用):


$someDiv.attr('class', 'someClass').hide().html('new stuff');

为了美观易读也可以这样写:


$someDiv

.attr('class', 'someClass')

.hide()

.html('new stuff');

再来看下面的例子:


var someDiv = $('#someDiv');

someDiv.hide();

我们定义的一个元素将隐藏掉,我们可以将代码简化成:


var someDiv = $('#someDiv').hide();

jquery这个特性可以减少我们遍历整个DOM的次数。我们就不用一次次的去遍历整个DOM。

当然还有一种写法,比如:


var elem = $('#elem');

elem.hide();

elem.html('bla');

elem.otherStuff();

虽然这种写法很难看,没使用点语法,但是从性能角度上说,他也是很优化的,因为他只遍历了一次dom,获取jq对象,并把值赋给了elem。在一些特殊的场合你也可以这么使用。

标签:,分类:jQuery

【jQuery插件】回到顶部

时间:2010年09月28日作者:愚人码头查看次数:7,475 views评论次数:2

最近写了个回到顶部的插件,调用方法的
$(“.go-top”).goToTop({});
$(window).bind(‘scroll resize’,function(){
$(“.go-top”).goToTop({});
});
当然可以传一些参数及参数的默认值:
pageWidth:950,//页面宽度
pageWidthJg:10,//按钮和页面的间隔距离
pageHeightJg:50,//按钮和页面底部的间隔距离
startline:20,//出现回到顶部按钮的滚动条scrollTop距离
duration:200,//回到顶部的速度时间
showBtntime:100,//显示\隐藏回到顶部按钮的速度时间
targetObg:”body”//目标位置

演示地址:http://www.css88.com/demo/goToTop/

标签:,分类:jQuery, JS
Page 2 of 41234