标题写的不够清楚 , 就是说在如下一段代码中
<script type='text/javascript>
$('div').each(function(){
$(this).html('fdsada');
// 这个 $(this) 是什么 ?
})
</script>
以上一段代码中 , 其实直接使用 this 的 HTML 对象也是可以的 :
<script type='text/javascript>
$('div').each(function(){
this.innerHTML = 'fdsada';
})
</script>我在 each 的源代码中看到这样一段代码 ( 有很多 , 我只挑我需要的写 ) :
each: function( object, callback, args )
// 这里的 object 就是当前 jQuery 对象里的 this 对象 , 假如说外面使用了 $('div') , 那么这里面包含了很多 jQuery 原对象和所有的 Div HTML OBJECT 对象 .
// 那么 function 里面的处理回调函数的是这样一部分 , 针对我所举例的 $('div')
var i = 0;
for ( ; i < length; ) {
if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
break;
}可以看出来 , 使用 callback call 了 object , 也就是指向了 jQuery 内部的 this , 因为这在 jQuery 274 行
each: function( callback, args ) {
return jQuery.each( this, callback, args );
}
中调用 . 注意 ( 这是 PS 部分 , 熟悉 JQUERY 这个方法的看不看都无所谓 ) : 这个方法是 jQuery.fn.each . 而它调用的是 : jQuery.each . 两个不一样 , 一个是 prototype 中的方法 , 另一个不是 . 所以这里的 THIS 显然是经过选择器 INIT 之后的 this , 假设 init 了 $('div') , 假设页面上有 3 个 DIV , 这里面就会出现 3 个 HTML . 这个 callback , 也就是我们
$('div').each(]function(){
// codes ...
})
each 中的 FUNCTION , 而 for 中的 object[i] 显然是具体的某个 DIV 对象 , 先被使用 Array.prototype.slice 将 getElementsByTagName('div') 无用的方法剪切掉 , 只留下其中的 HTMLDIVOBJECT 后又被它将这些结果加入了 jQuery 的 this 对象 .
所以这里的 callback.call(this[i] , 指的便是某个具体 DIV 对象 , 所以你可以在 callback 中使用
$('div').each(function(){
this.innerHTML = 'fasdfdsa'
})
来达到和
$('div').each(function(){
$(this).html('fdsafdsafdsa');
})
同样的效果 .
所以 , 我也看了 jQuery 的 html:function .
我就不详解了 , 很简单 , 其实就是用
this[0].innerHTML .我这边说的可能比较粗 , 但看过 jQuery 源代码的人一定知道 .
所以我的疑问就是 , 为什么在 callback 中
this 对象等同于 jQuery $(this) 对象中的 this[0] , 难道说 callback.call(this[i] 将它合并到第 0 个去了?那之前所选择的 $('div') 里面的所有 HTML OBJECT 在哪里?非常期望高人解惑!!!谢谢!!!
<script type='text/javascript>
$('div').each(function(){
$(this).html('fdsada');
// 这个 $(this) 是什么 ?
})
</script>
以上一段代码中 , 其实直接使用 this 的 HTML 对象也是可以的 :
<script type='text/javascript>
$('div').each(function(){
this.innerHTML = 'fdsada';
})
</script>我在 each 的源代码中看到这样一段代码 ( 有很多 , 我只挑我需要的写 ) :
each: function( object, callback, args )
// 这里的 object 就是当前 jQuery 对象里的 this 对象 , 假如说外面使用了 $('div') , 那么这里面包含了很多 jQuery 原对象和所有的 Div HTML OBJECT 对象 .
// 那么 function 里面的处理回调函数的是这样一部分 , 针对我所举例的 $('div')
var i = 0;
for ( ; i < length; ) {
if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
break;
}可以看出来 , 使用 callback call 了 object , 也就是指向了 jQuery 内部的 this , 因为这在 jQuery 274 行
each: function( callback, args ) {
return jQuery.each( this, callback, args );
}
中调用 . 注意 ( 这是 PS 部分 , 熟悉 JQUERY 这个方法的看不看都无所谓 ) : 这个方法是 jQuery.fn.each . 而它调用的是 : jQuery.each . 两个不一样 , 一个是 prototype 中的方法 , 另一个不是 . 所以这里的 THIS 显然是经过选择器 INIT 之后的 this , 假设 init 了 $('div') , 假设页面上有 3 个 DIV , 这里面就会出现 3 个 HTML . 这个 callback , 也就是我们
$('div').each(]function(){
// codes ...
})
each 中的 FUNCTION , 而 for 中的 object[i] 显然是具体的某个 DIV 对象 , 先被使用 Array.prototype.slice 将 getElementsByTagName('div') 无用的方法剪切掉 , 只留下其中的 HTMLDIVOBJECT 后又被它将这些结果加入了 jQuery 的 this 对象 .
所以这里的 callback.call(this[i] , 指的便是某个具体 DIV 对象 , 所以你可以在 callback 中使用
$('div').each(function(){
this.innerHTML = 'fasdfdsa'
})
来达到和
$('div').each(function(){
$(this).html('fdsafdsafdsa');
})
同样的效果 .
所以 , 我也看了 jQuery 的 html:function .
我就不详解了 , 很简单 , 其实就是用
this[0].innerHTML .我这边说的可能比较粗 , 但看过 jQuery 源代码的人一定知道 .
所以我的疑问就是 , 为什么在 callback 中
this 对象等同于 jQuery $(this) 对象中的 this[0] , 难道说 callback.call(this[i] 将它合并到第 0 个去了?那之前所选择的 $('div') 里面的所有 HTML OBJECT 在哪里?非常期望高人解惑!!!谢谢!!!
解决方案 »
- JS 如何注册自定义的事件?
- jquery1.3 dialog ie6 下弹窗口会死浏览器
- 一个编辑器想实现的功能
- 对你来很简单啊,帮帮我吧,在线等
- 求救... iframe designMode 中 如何替换选中内容(有答案+100分)
- document.getElementById("DataGrid1").all;在谷歌中兼容性问题,顶者有分
- 请教:根据选项按纽的选择不一样,文本框是否可见!
- 请教个比较玄的问题:热点(图片超连接)上怎么打开一个没有“父子关系”的新窗口?
- 急!如何利用javascript实现查找功能?
- 请问一下怎么往infoTemplate里添加图片展示啊
- 怎么给str创建的表格入值
- 如下功能用js能否实现?
为什么在 callback.call 之后
源代码中
html 或者是其他方法能够使用
this[0] 访问到对应的 DIV OBJECT . 我看了 index: 方法 , 它跟 EACH 似乎是驴唇不对马嘴的 。因为
在 jQuery.find 的时候 , 已经 makeArray(context.getElementsByTagName('div'),'find',extra) 了 . 也就是说那里的 this[0] 就是所选的第一个元素 , 和我这里的 this 有可比性吗?因为在 CALLBACK 的循环中
this[i] , 有可能是 HTML 中的第 2/3/4/5/6/... 个元素 .
所以我问的就是 , 为什么 , 在 callback 中访问 JQUERY 本生对象(比如说 HTML()), 它得 this[0] 就是当前循环到的第 X 个对象 ?
<head>
<title>New Document</title>
<meta name="charset" content="utf-8">
<meta name="Generator" content="EditPlus ">
<meta name="Author" content="test">
<meta name="Keywords" content="Js,JavaScript,test">
<meta name="Description" content="Any about javaScript OOP Test.">
</head>
<body>
<div>
<ul>
<li>fdasdasfdas</li>
</ul>
</div>
<div>
<ul>
<li>fdasdasfdas</li>
</ul>
</div>
<div>
<ul>
<li>fdasdasfdas</li>
</ul>
</div>
<div>
<ul>
<li>fdasdasfdas</li>
</ul>
</div>
<div>
<ul>
<li>fdasdasfdas</li>
</ul>
</div>
<span></span>
<script type='text/javascript'>
(function(){
var j = function(selector,context){
return new j.fn.init(selector,context,rootj);
},
rootj,
splice = [].splice,
push = Array.prototype.push; j.fn = j.prototype = {
constructor:j,
push:push,
splice:splice,
init:function(selector,context,rootj){
if(!selector){
return this;
}
if(typeof selector=='string'){
if(!context){
return rootj.find(selector);
}else{
this.context = context;
return context.find(selector);
}
}else{
this.context = this[0] = selector;
this.length = 1;
return this;
}
},
test:function(c){
alert(c);
},
add:function(){
var ret = this.constructor();
ret.context = this.context;
return ret;
}
}
j.fn.init.prototype = j.fn; j.extend = j.fn.extend = function(){
for(i=0;i<arguments.length;i++){
for(k in arguments[i]){
this[k] = arguments[i][k];
}
}
} rootj = j(document); j.fn.extend({
find:function(selector){
if(typeof selector == "string"){// 如果是字符串的话
var ret = this.add(selector);
for(i=0,l=this.length;i<l;i++){
var length = ret.length;
makeArray(this[i].getElementsByTagName(selector),ret);
if ( i > 0 ) {
// Make sure that the results are unique
for ( n = length; n < ret.length; n++ ) {//n=1;n<4;n++
for ( r = 0; r < length; r++ ) {
if ( ret[r] === ret[n] ) {//ret[0] === ret[1]
ret.splice(n--, 1);
break;
}
}
}
}
}
var tmp = '';
for(k in ret)tmp+=k+' : '+ret[k]+'<br />';
document.getElementsByTagName('span').item(0).innerHTML = tmp;
return ret;
}
},
each:function(callback){
for(i=0;i<this.length;i++){
callback.call(this[i],i);
}
},
html:function(val){
//for(k in this)alert(k+' : '+this[k]);
if(val==''){
alert(this[0].innerHTML);
}else{
this[0].innerHTML = val;
}
}
}); var makeArray = function( array, results ) {
array = Array.prototype.slice.call( array, 0 );
if ( results ) {
results.push.apply( results, array );
return results;
}
return array;
}; window.$ = j;
})();
$('div').find('li').each(function(i){
$(this).html('kk'+i+'');
});
</script>
</body>
</html>
re:
我了个去!难道我看的不是jquery文档.核心部分:index.是这样定义的.搜索与参数表示的对象匹配的元素,并返回相应元素的索引值。
如果找到了匹配的元素,从0开始返回;如果没有找到匹配的元素,返回-1。这样再看不懂我也没撤!
var jqueryInstance=$('.div');
jqueryInstance.each(function(){
//ETC
});each方法是javascript中就有的!
哥哥,我是这个意思
each(function(){
// 在这个中使用 $(this).html() 的话
})
为什么
jQuery.fn.html
里面直接使用
this[0] 就可以访问到
each 中 callback.call(this[i] 为啥能访问到这个 this[i] 其他的我回头慢慢看 , 您能不能先给我解答了这个?拜托了,虽然效果实现了但我就是不知道为啥能访问到
//直接用this的话,这里的this就是each遍历到的div元素
//$(this)就是把each遍历到的div元素转化成jquery对象,因为只有jquery对象才有你后面的.html("...")这个方法,this本身是dom对象,是没有html()这方法的
同样的道理,不管是啥dom对象,只要用相同的形式($(dom对象))就能转化成jquery对象了。
});
这样再看不懂我也没撤!
var jqueryInstance=$('.div');
jqueryInstance.each(function(){
//ETC
});each方法是javascript中就有的!each 方法真的是 javascript 中就有的吗?
//var jqueryInstance=$('.div');
jqueryInstance.each(function(){
//ETC
});你看你这个代码还能不能运行 , 完了你就知道 .each 方法是不是 jquery 中就有的了 - - .
我不是和你喷啊,我只是觉得,你太粗心了,这个 EACH 并不是原生的 javascript 中自带的方法
JQUERY 中定义了两个
jQuery.fn.each
jQuery.each
在这里面定义的 , 至少我觉得你调用的肯定是
jQuery.fn.each 这个方法 , 不然你在里面加个 alert 试试 .我在 9 楼已经将代码贴出来了也将问题说的相当清楚了 , 你高手能否针对我的问题解答一下呢?谢谢,别随便再弄出个 eq 什么的让我看 ,然后再说 : 你什么也不懂 !!!!!.... 我差不多真的要什么懂的去了 !
jqueryInstance.each(function(){
//ETC
});我这样写只是让你去看核心的这个jquery对象实例.不要被过度的封装迷惑.
js 里 foreach 里 JQUERY 里经常用 for(k in ...
咱也不乱抓了 , 简单的来说能帮我解释下我那个代码中或是 JQUERY 代码中为啥中的 this[i] 为啥在 CALLBACK 之后再调用 JQUERY 对象 ,方法里面的 this[0] 就能准确指向 FOR 中不断循环的 THIS[I] 呢?我那个代码可以实现效果的,你赋值粘贴一下你看就明白了,虽然效果都出来了我就是不懂 THIS【0】到底是怎么指过去的
jqueryInstance.each(function(){
//ETC
});
你调的这个我清楚啊
先调用了
jQuery.fn.each
完了它直接
return jQuery.each(this,callback
它直接把当前的 this 传过去了
啊 , 我好像感觉我的问题渐渐的能够说清楚了,真不容易 ,我也对我的表述感到纠结如果是 $('div'), 那 this 里一定包含了数个 HTMLDIV 对象 。包含了所有的 DIV HTML 对象 。
问题是它一循环
for ( ; i < length; ) {
if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
break;
}
}
在 callback.call(objectp[i] , 在这个 CALLBACK 中使用
$(this).html() 调用
jQuery.fn.html 方法,为什么
它得 this[0] 可以指向 循环中的 object[i] ...
我勒个去,终于问清楚了
高手 , 我来告诉你 , 为什么
each(function(){
$(this).html('xx')
})
而 jQuery.fn.html 方法中
this[0] 就等于具体循环的 HTML OBJ 吧 .
首先 , 代码 660 行 :
for ( ; i < length; ) {
if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
break;
}
因为知道 jQuery 的 FIND 方法会通过 MAKEARRAY 将所有 getElementsByTagName('div') 将所有 DIV 对象都存入 RET 。而返回了这个 RET 对象 , 我们们接下来的调用而言 , 就是 jQuery 内部那个 this .而使用了 .each 方法之后它运行到我上面给出的那一段 , 也就是说这里的 callback.call(object[i] 是某个具体的 DIV 对象 , 对不对 ?
你可以这么干
$('div').each(function(){
this.innerHTML = 'dfdas';
})
你看是不是所有的 DIV 内容都改变了 .
那么就确认了这是个具体的 HTML OBJECT .
那么在里面使用 $(this) , 什么意思?
使用选择器选择当前这个 HTML 对象 .
根据选择其中 :
// Handle $(DOMElement)
if ( selector.nodeType ) {
this.context = this[0] = selector;
this.length = 1;
return this;
}
你自己看 , 作者写的注释还在那 . 那么 , 这个时候 this[0] 是不是就等于具体循环到的某个 OBJECT[i] ?因为 if 最后的 return this , 那是不是包含了 jQuery.fn 中的所有方法?
所以
你使用
$(this).html('xx')
在 jQuery.fn.html 方法里是不是 this[0].innerHTML ???
if 里面的第一句就写得再也清楚不过了 , 不过我确实是菜鸟 , 但我始终不大理解这和 jQuery 的 index 有什么关系?
而且我还没看这个 index 是 jQuery.fn.index 还是 jQuery.index , 我还没看这个 。但是我的问题已经非常清楚了,我还有个方法可以证明 。你可能没用过,你可以这样 :$('div').each(function(){
$(this)[0].innerHTML = 'fdsafds'
})看看是不是改变了?现在我的 THIS 是什么,清楚的一塌糊涂了吧?为什么是这样是不是也清楚的一塌糊涂了?
当然,谢谢高手!!!