欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

如何判断两个jq对象是同一个对象 不能用jquery对象来判断相等(因为它们是指向不同的引用) 可以用is方法或者转换成object来比较

如果说要判断是否同一对象,当然是用 === 来判断,但实际上两个不同的 jQuery 对象可能是对同一个/组 DOM 对象的封装,这个时候可以用 is 来判断,比如
 
var a = $(".editor");
var b = $(".editor");

console.log(a === b);//这是false

console.log(a.is(b));//这是true


比如鼠标聚焦对象,和我期望的对象是否相等。我这样使用

html:
<textarea class="editor"></textarea>
js:
if( $('.editor')[0] == $(':focus')[0] ){ alert('ok'); } 


建议还是用 $a.get(0) == $b.get(0) 来判断吧($a和$b均为jq对象) 如果用$a[0]的话,在$a.length为0的情况下会报下标越界错误,除非先做好判断。

0





感觉问题有两种理解,如下说明。
html:<div id="test1" class="test1"></div>
js: $('#test1') 和 $('.test1') 两个jquery Object
1.如果是判断两个jquery Object是否引用的同一个DOM元素,则可以使用jquery的is方法,如下:

$('#test1').is('.test') //这是true 

示例中应该得到的是true. 2.如果是判断两个jquery Object是否相等,即

$('#test1') == $('.test')  //这是false

那这种情况下,就是两个引用类型在比较,那遵循就是引用类型比较的规则。
很明显示例中得到的是false.
总之,就看楼主想问的是哪种情况了。

来自 https://segmentfault.com/q/1010000003014776

jquery 对象判断

<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$("div").bind('click',function(e){
if($(this)==$(".qq")){
alert("This is qq");//此处没有显法,请问错在哪里?
}
});
});
</script>
<body>
<div class="two">two</div>
<div class="qq">qq</div>
</body>
请问,上面判断处有错吗?
收起
我主要是想判断这两个对象是否为同一对象。
展开
 
szxinhuoli | 浏览 0 次  2012-05-16 10:40
2012-05-16 11:35最佳答案
 
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
    $("div").bind('click',function(e){
		if($(this).text()==$(".qq").text()){
		    alert("This is qq");//现在可以显示了。
		}
	});
});
</script>
<body>
<div class="two">two</div>
<div class="qq">qq</div>
</body>

注意
$(this)和$(".qq") 返回的都是Jquery 对象,即HTML元素,你比较它啥意思呢? 比较引用,内存地址啊?似乎JQUERY 的API 不支持这样的比较,你必须比较它们的内容或者值,或者转换为dom对象再比较相等。
 
追问
谢谢。
追答
你要知道 Jquery 对象都有唯一的标示,就是那个"ID=XXX",不能有重复,你这里虽然是没有定义,但是jquery 给它有默认值,class 是可以重复滴,这也是它的优势,所以理论上肯定不一样,你的比较应该是没有意义的。它又不想JAVA 的内存模型样,还有个地址什么的,让你来比较。



guiguzi629 

采纳率:25% 擅长: 暂未定制

其他回答

你应该这样改
if($(this).attr('class') == 'qq'){
alert('this is qq');
}
你根据单前点击的对象来获取他的class属性值来判断,希望可以帮到你。
a403038779  | 2012-05-16 11:46
评论 
1 0
你用$ ,那就表示new 了一个新的jquery对象,
所以不能直接这样判断2个jq对象相等
你可以尝试
if( $(this).is('.qq') ){
alert("This is qq");//此处没有显法,请问错在哪里?
}
helen5106  | 2012-05-16 11:35
评论 
1 0
if($(this).hasClass("qq")) 
或者
if($(this).is("div.qq")) 

如果你的页面只有一个div.qq,用我上面的方法就对了,标准的jquery方法~
如果不止一个div.qq,你这样判断绝对是无效的,$(".qq")返回的是一个jquery数组对象..而$(this)只是一个div...肯定是不等的..
 
追问
您好,
我主要是为了找到一种判断两对象为同一对象的方法。
.is是这个用途吗?
 
追答
.is是判断是否是某对象,用法为:
jquery对象.is(选择器),  返回布尔值
 
追问
您好,用您现在的方法是可以的

但如果两个都是对象
一个是obj 上文的象
一个是$(this)
这有办法判断它们是否为同一个吗?
wdjhz  | 2012-05-16 11:05
评论 
0 0
直接取属性,也可以

if($(this).attr("class")=="qq"){
bd9006  | 2012-05-16 10:49
评论 
0 0
$(".qq")) 多了一点?
我不知道是不是 我的做法是不判断 直接取第二行 $("div")这里直接取第二行


来自 http://zhidao.baidu.com/question/424209556.html




js 判断对象相等

 

    文笔不是很好,一直在博客园属于那种只看不说的那种,有次心血来潮,想把自己的一些心得记录下来,我认认真真写了大半个小时,谁知一点保存,会话超时然后我的东西不知道去哪里,当时想死的心都有,写博客也就没那个兴趣了。平常遇到问题可能就和周围的同事讨论下,然后就是发发贴 ,看有什么解决方案么,但这种情况不是很理想,提出的问题不知道是别人没看懂,还是我没表述清楚,发出去的问题就像肉包子打狗一样,没有了下文。下面进入今天的主题吧。

    在js 判断相等常见的就是 == (等同)和===(恒等); 
    ==, 两边值类型不同的时候,要先进行类型转换,再比较 ;
    ===,不做类型转换,类型不同的一定不等。      

   例: 
    var a = 3; 
    var b = "3"; 
    a==b 返回 true 
    a===b 返回 false 
   这个是基本类型相等的判断。

   如果是对象的判断,那又会出现什么情况呢?

复制代码
 var People = function (id, name) {
         
             this.id = id;
          
             this.name = name;
    
    }

 

     var  a = new People("3","小肖");
       var  b = new People("3","小肖");
       var  c = a; 

        console.log("对象相等判断:"+ (a==b));//false
        console.log("对象相等判断:"+ (a==c));// true
        console.log("对象相等判断:"+ (b==c)); //false
        console.log("对象相等判断:"+ (a===c));// true
复制代码

     对象都是按地址进行传递的, 这里我就自认为他们对象和java,C#一样比的对象的地址是否相等?在java中我们比较两个对象的值是否相等使用的是equal的方式,最终比的是对象的hashcode 是否相等,如果相等就可判断两个对象时等同的。在js中没有这样的函数,自然想起能否自己写一个通用的函数来做判断,自然想到如下方法:

复制代码
  var People = function (id, name) {
            this.id = id;
            this.name = name;
        }

        People.prototype.equal = function (obj) {
            if (obj instanceof People) {
                var result = true;
                for (k in this) {
                    if (this[k] != obj[k]) {
                        result = false;
                        break;
                    }
                }
                return result;
            } else {
                return false;
            }
        }
        var a = new People("3", "小肖");
        var b = new People("3", "小肖");
        var c = a;

        console.log("对象相等判断a equal b:" + (a.equal(b))); //true
复制代码

 

   好像现在能满足我的要求了,但是这只是在最一般情况下。如我对 a 或者b 进行简单的修改

a.value = 98; //对a 对象添加一个值,在java对象中显然不能这么做,但js中这样做不推荐,但并不排除 有人不这么干。
 console.log("对象相等判断a equal b:" + (a.equal(b))); //false
 delete a.value;
 b.value = 98;
 console.log("对象相等判断a equal b:" + (a.equal(b))); //true

 在这种情况也许最简单的方式那 检查两个属性的长度是否相等就可以解决问题了,这样是可以解决问题,但是又有情况又出现了,请看

复制代码
    var People = function (id, name, arr) {
            this.id = id;
            this.name = name;
            this.group = arr;
        }

        People.prototype.equal = function (obj) {
            if (obj instanceof People) {
                var result = true;
                for (k in this) {
                    if (this[k] != obj[k]) {
                        result = false;
                        break;
                    }
                }
                return result;
            } else {
                return false;
            }
        }
        var a = new People("3", "小肖", [1, 2]);
        var b = new People("3", "小肖", [1, 2]);
        console.log("对象相等判断a equal b:" + (a.equal(b))); //false
复制代码

    当对象的字段 不是基本类型,而是对象,这个时候又不相等了。本来值是相等的,我们期待的结果是返回true。这个时候可能又会想到的解决方案是我们再进行类型判断。
如果是Object类型,或者数组等(即对象类型),我们再采用递归的方式来重复调用自己来做判断。这好像也行。但这样做是不是有点把问题搞复杂了,有么有更好的思路或者方法来解决这个问题呢?

 
 
标签: javascript
2
0
 
 
 
« 上一篇:IE 坑爹的浏览器兼容模式
» 下一篇:原生JS的对象常用操作总结
posted @ 2013-06-29 11:55 地板飞 阅读(2219) 评论(10编辑 收藏
 

 
  
#1楼 2013-06-29 12:00 | 叶小钗  
叶小钗到此一游
  
#2楼 2013-06-29 12:39 | jeffreywu  
还是喜欢强类型语言
  
#3楼[楼主2013-06-29 12:48 | 地板飞  
@ codepat
各有各的好,强类型优点是好管理,缺点是不够灵活。。
  
#4楼 2013-06-29 13:48 | subying  
javascript 有时候太灵活了
  
#5楼 2013-06-29 16:22 | 里沃特  
楼主你本来就把问题越搞越复杂,那就得有得复杂的解决办法。别想太多了。递归就递归呗
  
#6楼[楼主2013-06-29 16:29 | 地板飞  
@ 里沃特
哥,不是我想的太复杂了,而是项目确实碰到这样的问题,怎么着也得解决呀。。
  
#7楼 2013-06-29 23:34 | wl7079064  
  
#8楼[楼主2013-06-29 23:52 | 地板飞  
@ wl7079064
路过也不给点意见啊。。
  
#9楼 2013-06-29 23:57 | liujb  
一楼评论亮了
  
#10楼 2013-07-01 15:54 | 小小清清  
id唯一, 就根据id来判断是不是相等就好了。

来自 http://www.cnblogs.com/stell/p/3162142.html

普通分类: