apply不是这么用的 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY> <div>1</div> <div>3</div> <div>3</div><Script> (function(){ var ele = {}; ele.push = Array.prototype.push; var t = document.getElementsByTagName('div'); var tmp = Array.prototype.slice.call(t,0); for(i=0;i<tmp.length;i++){ if(i==0)ele.push(ele,tmp[i]); } for(k in ele)alert(k+' / '+ele[k]); })(); </Script> </BODY> </HTML>
(function(){ var ele = []; ele.push = Array.prototype.push; var t = document.getElementsByTagName('div'); for(var i=0;i<t.length;i++){ if(i==0)ele.push.call(ele,t[i]); } for(k in ele)alert(k+' / '+ele[k]); })();这样呢?
push是数组的方法,你定义的var ele = {}是一个对象,谢谢。。(function(){ var ele = []; ele.push = Array.prototype.push; var t = document.getElementsByTagName('div'); var tmp = Array.prototype.slice.call(t,0); for(i=0;i<tmp.length;i++){ if(i==0)ele.push.apply(ele,tmp[i]); } for(k in ele)alert(k+' / '+ele[k]); })();
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE></TITLE> </HEAD> <BODY>
<div>1</div>
<div>3</div>
<div>3</div><Script>
(function(){
var ele = {};
ele.push = Array.prototype.push;
var t = document.getElementsByTagName('div');
var tmp = Array.prototype.slice.call(t,0);
for(i=0;i<tmp.length;i++){
if(i==0)ele.push(ele,tmp[i]);
}
for(k in ele)alert(k+' / '+ele[k]);
})();
</Script>
</BODY>
</HTML>
我有一个问题 , 如果我用了 apply , 也就是
ele.push.apply(ele,tmp[i]);
那么是不是相当于
var x = new ele;
这个时候
x[0] 就等于 tmp[0]?
这个我自己会去确定 , 还有一个疑问 , 什么偏偏只有 IE 8 及其以下版本无效 ? 其他浏览器全部有效 ?
( IE 9.0 也是 OK 的 )
(function(){
var ele = [];
ele.push = Array.prototype.push;
var t = document.getElementsByTagName('div');
for(var i=0;i<t.length;i++){
if(i==0)ele.push.call(ele,t[i]);
}
for(k in ele)alert(k+' / '+ele[k]);
})();这样呢?
var tmp = Array.prototype.slice.call(t,0);
不能运行 , 纠结了 , 为啥不能使用呢 ?
ele 声明为数组呢 ?
我就执迷与对象 ? 难道不行吗 ? 纠结
ele.push = Array.prototype.push;
这一行呢 ?
谁能告诉我 , 如果声明为对象 , 需要怎样做 ?
var ele = [];
ele.push = Array.prototype.push;
var t = document.getElementsByTagName('div');
var tmp = Array.prototype.slice.call(t,0);
for(i=0;i<tmp.length;i++){
if(i==0)ele.push.apply(ele,tmp[i]);
}
for(k in ele)alert(k+' / '+ele[k]);
})();
跟这个问题有点像,可以参考http://topic.csdn.net/u/20090925/14/f67dbf2e-90e5-441b-ae6e-7551e3da880d.html
是我看 jQuery 看的不到位 .
jQuery 中有这么一段 :
var makeArray = function( array, results ) {
array = Array.prototype.slice.call( array, 0 ); if ( results ) {
results.push.apply( results, array );
return results;
}
return array;
};
定义了 makeArray . 我就理解为任何浏览器都支持这个 Array.prototype.slice.call 了 , 因为你 $('div') 的时候 , 它使用了这个方法将选中的 DIV 添加进了 JQUERY 对象 .
仔细一看下面还来了这么一段
try {
Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;// Provide a fallback method if it does not work
} catch( e ) {
makeArray = function( array, results ) {
var i = 0,
ret = results || []; if ( toString.call(array) === "[object Array]" ) {
Array.prototype.push.apply( ret, array ); } else {
if ( typeof array.length === "number" ) {
for ( var l = array.length; i < l; i++ ) {
ret.push( array[i] );
} } else {
for ( ; array[i]; i++ ) {
ret.push( array[i] );
}
}
} return ret;
};
}
果然是 #3 的方法 , 数组 . 坑爹的 , 怪我没认真看它 .
(function(){
var ele = {length:1,push:Array.prototype.push};
alert(ele.push);
var t = document.getElementsByTagName('div');
for (var i=0;i<t.length;i++){
ele.push(t[i]);
}
for(k in ele)alert(k+' / '+ele[k]);
})();
哈哈哈哈 , 试试看吧 , 加入把那个对象里的 length 拿掉看看 ?哥这也是看 jQuery 的选择器看来的
// Handle $(DOMElement)
if ( selector.nodeType ) {
this.context = this[0] = selector;
this.length = 1;
return this;
} // The body element only exists once, optimize finding it
if ( selector === "body" && !context && document.body ) {
this.context = document;
this[0] = document.body;
this.selector = selector;
this.length = 1;
return this;
}
看这两个入口 , 哪个没有 this.length ?
jQuery 对象要是没有 this.length , 你把这个删掉 , 你在选 $('div') 你看它说啥 .
无论你 $('xx') 无论什么,都要经过这个 .
因为你 $('div') 相当于 rootjQuery.find('div')
rootjQuery = $(document);
所以无论你干啥 , 都要经过这两个 。哥看了半天终于发现了 , 所以写出了最上面的代码 ,哈哈哈哈 KO 了
不过有时候 , 还真不能迷信小花 , 全心花则不如全不信花