zoukankan      html  css  js  c++  java
  • DOM对象和jQuery对象的区别

    var cvs = $("#cvs_"+this.index).getContext("2d"); //错的

    var cvs = $("#cvs_"+this.index)[0].getContext("2d");//对的

    DOM对象和jQuery对象是两种不同的对象,它们的实例也因此具有不同的属性和方法。通常要操作页面中的节点,我们都需要想办法获取对该节点的引用。比如如下代码:

    1
    var dom = document.getElementById('节点id');

    这是通过节点的id来获取一个页面节点,也就是对节点的引用。这个时候,我们对变量dom的任何操作,实际上就是对页面节点的操作,比如说修改样式、移除节点、获取属性等等。如下:

    1
    2
    3
    dom.style.display = 'none'// 隐藏节点
    dom.parentNode.removeChild(dom); // 删除节点
    var height = dom.offsetHeight; // 获取节点高度

    像上面的style、parentNode、removeChild、offsetHeight等等,都是DOM对象的属性或方法。

    因为DOM对象不属于javascript的一部分,它是各个浏览器对javascript的扩展,但各个浏览器又都在实现上有一些不一致,导致javascript代码需要处理很多兼容性问题。为了解决这些兼容性问题,提高开发效率,jQuery库就诞生了。

    jQuery解决了兼容性问题,再加上它的实现极其巧妙,因此得到了很多人的吹捧。以前有一点javascript基础的人,要写出稍微复杂些的特效,几乎都不可能,但因为jQuery的出现,类似显示隐藏、各种动画效果,都只需要简单的几行代码即可。有些人甚至觉得,jQuery甚至都能替代javascript,而且在各个前端学习的站点、博客中,也是将jQuery和javascript并列作为一类。

    但问题是,不了解基础的javascript,在遇到问题、异常的时候,你就只能干瞪眼了。任何语言,框架和库都无法取代最基础的语法,而且框架和库也都是由最简单的语法丰富起来的。

    jQuery实际上可以说是一个大的类——javascript实现的类。以一个简单的模型来说,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    ;(function(window, undefined){
             
        window.$ = window.jQuery = jQuery;
         
        // 定义jQuery类
        function jQuery(selector, content){
            content = content || document;
            var eles = content.querySelectorAll(selector);
            var len = eles.length;
             
            // 给jQuery对象添加长度属性
            this.length = len;
             
            // 方便获取dom对象,获取实例:jQuery('#id')[0];
            for(var i = 0; i < len; i++){
                this[i] = eles[i];
            }
        }
         
        // 扩展原型
        jQuery.prototype = {
            // 构造函数
            constructor : jQuery,
             
            // 根据索引获取dom对象
            get : function(index){
                return this[index];
            }
             
        }
    })(window);

    这是一段jQuery的模拟代码,你可以使用如下方式调用:

    1
    var jqObj = new jQuery('.class');

    因为jQuery的特殊处理,写jQuery代码的时候不需要new即可用,但这里没有处理,所以需要加上new关键字。

    上面返回的jqObj,就是我定义的jQuery的一个对象,它是jQuery对象,已经不是DOM对象了。我可以写如下代码:

    1
    var dom = jqObj.get(1); // 获取jQuery对象中下标为1的DOM对象

    然后变量dom就和之前的变量dom一样,可以使用DOM对象的属性和方法了。

    但是,我们不能写下面的代码,否则它就会报异常:

    1
    jqObj.style.color = 'red';

    因为jQuery对象的实例,根本就没有style这个属性。jQuery也是一样的,jQuery对象和DOM对象是两种不同的对象,它们的内部结构(比如上面的get方法是自定义的)也是不同的。当你把jQuery对象当做DOM对象使用时,你调用该对象的任何属性和方法,都有可能触发一个属性或方法未定义的异常,因为这个属性或方法确实不存在。

    所以,如果你使用了jQuery库,那你就得在操作节点的时候,注意区分这个节点对象到底是DOM对象,还是jQuery对象。基本上jQuery的方法如果返回节点对象,返回值大多是jQuery对象,但也有例外,比如get等。

    回到你的题目,通过jQuery获取的canvas对象,实际上是jQuery对象封装后的对象。它没有getContext方法,所以会报错。但jQuery对象可以像访问数组一样,通过中括号来获取对应的DOM对象,所以第二种返回了最原始的Canvas对象,它是具有getContext方法的。

  • 相关阅读:
    eclipse中的Invalid text string (xxx).
    在jsp文件中出现Unknown tag (c:out)
    eclipse 界面复原
    ecilpse 纠错插件
    Multiple annotations found at this line:- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
    Port 8080 required by Tomcat v9.0 Server at localhost is already in use. The server may already be running in another process, or a system process may be using the port.
    调用第三方https接口
    调用第三方http接口
    创建带值枚举
    spring整合redis之Redis配置文件
  • 原文地址:https://www.cnblogs.com/zhxling/p/5262787.html
Copyright © 2011-2022 走看看