js中提到的dom引用是啥意思

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js中提到的dom引用是啥意思相关的知识,希望对你有一定的参考价值。

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

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

用通俗易懂的话解释一下呗;这方面的知识,是哪些呢?

这两行代码要区分的是DOM对象和jQuery对象的区别。


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

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

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

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实现的类。以一个简单的模型来说,如下:

;(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的模拟代码,你可以使用如下方式调用:

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

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


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

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

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


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

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方法的。

参考技术A   DOM即(Document Object Model)文档对象模型,通过 JavaScript操作DOM,您可以重构整个 html 文档、添加、移除、改变或重排页面上的项目。
  例:document.getElementById("标签id").style.color = "FF0000";//可以把HTML中指定ID标签的文本部分变为红色,这就是一个javascript操纵DOM的一个例子

JavaScript 对象的“值是引用”是啥意思

【中文标题】JavaScript 对象的“值是引用”是啥意思【英文标题】:What does 'value is a reference' mean for JavaScript objectsJavaScript 对象的“值是引用”是什么意思 【发布时间】:2012-08-15 08:31:24 【问题描述】:

我试图理解 JavaScript 中变量和对象的传递,结果遇到了this page。 说明 JavaScript 对象是按值传递的,但值本身是一个引用。尽管我了解该页面上给出的示例中发生了什么,但我仍然对为什么感到困惑。谁能解释一下“价值本身就是参考”是什么意思?

【问题讨论】:

复制:***.com/questions/518000/… @aquinas,我在问题中提到的链接与您所说的相同。我的问题是关于那个页面的,所以我相信它不是重复的! :) 【参考方案1】:

与 Java、Python 和许多其他语言一样,在 JavaScript 中,对象不是值

这意味着,当您评估一个表达式时,您从中获得的值要么是原始值,要么是引用(引用是指向对象的指针)。当您创建一个对象时,该表达式的计算结果为一个引用。当您访问对象的字段或调用对象的方法时,左边的东西是引用。基本上,您对对象所做的任何事情都必须通过对对象的引用来完成。没有直接处理对象的语法。

你不能有一个值“是”一个对象的变量(与 C++ 不同,你可以同时拥有一个值为对象的变量和一个值为指向对象的指针的变量);你只能有一个变量,其值是指向一个对象的引用。

从以下事实可以看出这一点:当您分配一个变量时,永远不会创建一个新对象。分配引用时,分配的变量具有原始引用值的副本,因此指向与原始引用相同的对象。没有任何东西可以放入变量中导致分配它以创建新对象。

所以如果有人说“将对象传递给函数”,我会说,不,你不能传递对象,因为对象不是值。您必须传递对对象的引用。就像在赋值中一样,当你传递一个引用时,它的值会被复制。 JavaScript 始终是按值传递的。

【讨论】:

【参考方案2】:

一些语言对函数参数有“通过引用传递”的概念,这意味着当你调用一个函数并传入一个变量通过引用函数可以修改原始变量以保存其他值- 它引用了原始变量。

当您调用函数并传入变量时,使用“按值传递”,函数只能获取值,因此无法更改传入的原始变量。

JS 只有“按值传递”,但是当您将对象作为参数传递时,“值”是对原始对象的引用,因此函数可以修改、创建或删除该对象的属性,但函数不能修改原始变量以引用其他对象或值。

例子:

function changeObj(someObj) 
    someObj.a = 1000;
    someObj.c = "test";

    someObj =  "x" : 5 ;
    console.log(someObj);   //  "x" : 5 


var o =  "a" : 1, "b" : 2 ;
changeObj(o);
console.log(o);   //  "a" : 1000, "b" : 2, "c" : "test" 

我展示的代码创建了一个变量o,它引用了一个具有ab 属性的对象。然后它调用函数changeObj 并传入o。该函数更改a 属性的值并创建一个新的c 属性- 该函数正在修改变量o 所引用的同一对象,因为它具有对该对象的引用。但随后该函数将someObj 分配给一个全新的对象。这不会影响o,因为该函数只引用了o 所指向的对象,它无法访问o 变量本身。

【讨论】:

不客气。我添加了一个示例,(我希望)让它更加清晰。【参考方案3】:

说明JavaScript对象是按值传递的,但值本身是一个引用。

这是相当令人困惑的措辞。他们的意思是当对象被传递给函数时,指向该对象的引用值被传递而不是实际的对象。

【讨论】:

...并且该引用是按值传递的。 好吧,那么,它与只是通过引用传递的对象有什么不同呢? 谢谢。我想我现在明白了。 将对象引用想象为车牌号。如果我告诉你你写在一张纸上的我的车号,你就可以找到我的车并驾驶它。如果您更改纸上的号码,它将引用另一辆车,但我的车将保留其原始号码。

以上是关于js中提到的dom引用是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

DOM是啥意思啊?

JS里面的DOM操作是啥

javascript基础部分三大核心是啥意思?

javascript中$(id)是啥意思

“启用 DOM 存储 API”是啥意思?

子页面是啥意思