时光博客 - WEB开发中的可用性和用户体验

jQuery Object and Dom

项目碰到一个问题,问题大概是这样的:

  1. <table width="100%" border="0" cellspacing="0" cellpadding="0"> 
  2.     <tr class="line1" filetype="a"> 
  3.       <td></td> 
  4.     </tr> 
  5.      <tr class="line2" filetype="b"> 
  6.       <td></td> 
  7.     </tr> 
  8.   </table> 

需要对上面table的每个tr(N行)绑定事件,对filetype="a"和filetype="b"的绑定不同的的右键菜单。右键菜单是通过jQuery插件contextmenu实现的。

想绑定事件,自己只能想到2种方案:

  • 第一:使用jquery的选择符分别筛选出filetype为a和b的。
  • 第二:使用普通的dom对象,通过getAttribute实现。

第一种方法尝试了,发现jQuery不支持自定义选择符,也就是类似 $("input[name='newsletter']")的标签。可能也有,但是由于项目紧没有去尝试。

第二中方法,使用普通的DOM对象来获取不同的filetype,然后给tr做绑定,但是问题来了,jQuery的插件只支持jQuery对象。上网搜索了下发现原来DOM对象转换成jQuery对象非常简单,只要在DOM对象外面加入符号"$"就可以了。比如

  1. //普通的DOM对象 
  2. var otrs = document.getElementById("filelist").getElementsByTagName("tr"); 
  3.  
  4. //jQuery对象 
  5. jotrs = $(otrs); 

经常会碰到jQuery与原生的JS混写的时候,也不知道这样的效率如何,转换成jQuery对象的时候,会带来多大的性能损耗。

另外jQuery对象转换成DOM对象稍微要复杂一点,由于jquery对象本身是一个集合。所以如果jquery对象要转换为dom对象则必须取出其中的某一项,一般可通过索引取出。

  1. $("#msg")[0],$("div").eq(1)[0],$("div").get()[1],$("td")[5] 

这些都是dom对象,可以使用dom中的方法,但不能再使用Jquery的方法。
以下几种写法都是正确的:

  1. $("#msg").html(); 
  2. $("#msg")[0].innerHTML; 
  3. $("#msg").eq(0)[0].innerHTML; 
  4. $("#msg").get(0).innerHTML; 

«  上一篇 |  下一篇  »

您可能对下面的日志感兴趣

赞助商广告

9 Responses

  1. Lin Says:
    2009-11-30, 2:45 PM

    可以先取出所有的Tr...再判断filetype呢..

  2. Kevin Says:
    2009-11-30, 2:48 PM

    if($("idoftable tr").attr("filetype")=="a") {//a事件}
    if($("idoftable tr").attr("filetype")=="b") {//b事件}
    这样应该可以,没有尝试,但是估计效率会低些...个人感觉哈,还是习惯混写,主要是知道了DOM TO jQuery

  3. Lin Says:
    2009-11-30, 3:30 PM

    $("idoftable tr").attr("filetype")永远是第一个tr的filetype属性
    e.g.
    $('tr').each(function(){
        var filetype = $(this).attr('filetype');
        if(filetype){
            switch(filetype){
                //to do
            }
        }
    });

  4. Kevin Says:
    2009-11-30, 3:32 PM

    哈哈,忘记循环了...恩,老乡写的不错。看来我还停留在for(;;;)阶段... - -!

  5. James Says:
    2009-12-01, 10:19 PM

    不用循环绑定,可以这样写(只在firefox下测试过,不知到ie可否)
    $(\"tr[filetype][filetype != \'a\']\").click(function(){
        //如果filetype 为b
    });

    $(\"tr[filetype][filetype != \'b\']\").click(function(){
       //如果filetype 为a
    });

  6. Kevin Says:
    2009-12-02, 9:18 AM

    jQ支持这样的自定义标签吗?之前试过&foo=bar,无效

  7. samool Says:
    2009-12-08, 11:02 AM

    很高深,搞不懂咯。对了,小A给我发一个最新sa2.0 10091109版的程序,支持多分类,使用ckeditor作为编辑器,还不错,要的话加我QQ:6042506

  8. Kevin Says:
    2009-12-08, 11:07 AM

    - - !加QQ好友回答问题错误...

  9. samool Says:
    2009-12-10, 1:42 PM

    sablog博客文章可以同步到QQ空间啦。。。

    同步 Sablog 博客日志到 Qzone
    http://www.samool.com/archives/24833/

Leave a Reply





验证码(*):