7

假设我有一个div看起来像:

<div id="testDiv">some stuff in here</div>

我有一个定义对象文字的脚本:

var testObject = 
{
    testDiv: $("#testDiv"),
    testDivProperty: this.testDiv    
};

为什么当我访问时testObject.testDiv我得到一个 jQuery 对象的引用,即

[<div id=​"testDiv">​…​&lt;/div>​]

但是当我访问时,testObject.testDivProperty我得到了对实际元素的引用,即

<div id=​"testDiv">​…​&lt;/div>​

因此无法在 ? 上执行 jQuery 操作testObject.testDivProperty

4

6 回答 6

3

在对象实例化期间尝试引用您定义的this对象并不像您期望的那样工作。

this在您的示例中实际上是指window对象。一些浏览器(例如,Chrome 和 IE)会将命名的 DOM 节点附加到document和/或window对象,这就是为什么this.testDiv使用id="testDiv". 碰巧您尝试访问的属性名称与元素 ID 具有相同的值。

为了演示真正发生的事情,试试这个:

<div id="test"></div>

var myObj = {
    prop1: $('#test'),
    prop2: this.prop1
};

this.prop1myObjshould be的上下文中undefined,但window.test可能(取决于浏览器)指的是 DOM 节点<div id="test"></div>

鉴于您的示例,您可以按如下方式完成作业:

var myObj = { prop1: $('#test') };
myObj.prop2 = myObj.prop1;

或者

var test = $('#test');
var myObj = {
    prop1: test,
    prop2: test
};
于 2013-10-02T12:06:59.270 回答
1

这行不通。thiswindow在这种情况下。

var testObject = 
{
    testDiv: $("#testDiv"),
    testDivProperty: this.testDiv // window.testDiv

}
于 2013-10-02T11:51:44.507 回答
0

在玩了一些之后,我找到了答案。在您创建第二个属性时,this指的是window,其中您有一个 id 为 的 div testDiv

所以你实际上正在这样做......

var testObject = 
{
    testDiv: $("#testDiv"),
    testDivProperty: window.testDiv    
}

我个人不知道您可以这样做,但会window.testDiv返回带有 ID 的 DOM 元素testDiv

于 2013-10-02T11:52:06.080 回答
0

实际上,在第一种情况下,获取 jQuery 对象是显而易见的并且应该被理解(正如您使用的 ' $')。在第二种情况下,DOM由于这些原因,您会引用一个简单的节点(对象) -

- 你没有在它的任何地方使用 jQuery,所以不要期望它是一个 jQuery 对象。

- 你访问this.testDiv的意思是 - 给我当前节点(正在访问)的名为“testDiv”的属性现在如果你在<body>标签中编写了这段代码,那么this 应该指向body元素的节点/对象(在 DOM 中)。我不确定这部分,但不知何故,您的 ' testDiv' 对象已注册为 body 对象中的属性(可能是因为您为此元素使用了“id”属性,从而使其独一无二)。因此,当您尝试使用获取对象时,您获得了 DOM 中元素this.testDiv的确切对象。<div>而且,javascript 默认为您提供对 DOM/javascript 对象(而不是 jQuery 对象)的简单引用。

除此之外,可以将 jQuery 对象视为普通 javascript/DOM 对象的涂层。这不是问题的一部分,但如果你想作为 jQuery 对象访问,那么,

要将 javascript 对象转换Obj为 jQuery 对象,请执行此操作 Obj=$(Obj);

新的Obj将是一个 jQuery 对象。

于 2013-10-02T12:29:11.030 回答
0

如前所述,this指的是全局窗口对象。

this.testDiv引用 DOM 元素的原因是因为 Web 浏览器中的标准行为是为每个具有 id 的 DOM 元素添加全局引用。解析元素时会添加引用,因此您的脚本代码必须位于要引用的元素下方。

是否依赖这些参考文献是另一个讨论。

于 2013-10-02T12:14:10.860 回答
0
let object = $('#someId') -- jQueryObject

accesing any custom object field

object[0].anyProp = 'anyValue'

console.log(object) -- jQuery object
console.log(object[0]) -- Raw JS object
console.log(object[0].anyProp) -- Raw JS object prop
于 2019-08-07T11:01:20.253 回答