【问题标题】:Bind Javascript Objects to HTML elements将 Javascript 对象绑定到 HTML 元素
【发布时间】:2013-03-10 12:55:07
【问题描述】:

我只是想和大家分享一个经验。所以我的问题是,我遇到了将 javascript 后端对象绑定到 HTML 前端元素的问题。现在,我通过谷歌搜索并阅读了一些关于这个问题的 stackoverflow 文章,许多帖子对此的回答是使用jQuery.data(),但是在我的第一次尝试中我没有成功,因为我不知道关于 jQuery 的对象创建方法。我的问题是,我想在我存储它的范围之外检索存储的数据,并且当我编写 jQuery('selectorID') 时,jQuery 总是(我认为)返回一个新的对象引用。比如:

var ref1 = $('#myID');
var ref2 = $('#myID');

if(ref1 == ref2)
{
   alert(true);
}
else
{
   alert(false);
}

总是会提示错误。然而,用 javascript 的内置 getElementById() 替换 jQuery 方法,我们将得到相同的参考!因此,以下代码将始终提示 true!

var ref1 = document.getElementById("myID");
var ref2 = document.getElementById("myID");

if(ref1 == ref2)
{
   alert(true);
}
else
{
   alert(false);
}

我的故事的一点小意思是,如果你想全局地将 javascript 对象绑定到 HTML 元素,并且正在考虑 使用 jQuery 的 data() 方法,请将数据存储在返回的引用上通过javascript的内置getElementById()。这样,无论您在何处检索引用,使用 getElementByID,您将始终获得相同的引用,并且可以使用 jQuery 的 data() 方法从中获取数据。

我的问题:

  1. 我的思维逻辑正常吗?
  2. 有没有更好的方法将 javascript 对象全局绑定到 HTML 元素?

【问题讨论】:

  • 你的逻辑显然是错误的。虽然对$() 的多次调用会返回不同的选择器对象,但jQuery 方法通常对所选对象本身进行操作。因此,对.data() 的调用将始终在您使用getElementById() 获得的同一个DOM 元素上运行。 (您可以通过实际尝试而不是调查引用相等来确定。)

标签: javascript jquery html data-binding


【解决方案1】:

无论你提到的代码不起作用的原因是什么,肯定不是事实是 jQuery 为每个查询都提供了一个新集合。给定 HTML:

<div id="somediv"> foo bar </div>

以下Javascriptworks as expected

var $ref1 = $('#somediv');
var $ref2 = $('#somediv');

console.log("$ref1:", $ref1);
console.log("$ref2:", $ref2);

// compare the collections / references
console.log("$ref1 == $ref2:", $ref1 == $ref2); // => false
console.log("$ref1 === $ref2", $ref1 === $ref2); // => false

// compare the referred DOM elements themselves
console.log("$ref1[0] == $ref2[0]:", $ref1[0] == $ref2[0]); // => true
console.log("$ref1[0] === $ref2[0]", $ref1[0] === $ref2[0]); // => true


$ref1.data('somedata', 'SOMEDATA');
console.log('$ref1->somedata:', $ref1.data('somedata')); // => SOMEDATA
console.log('$ref2->somedata:', $ref2.data('somedata')); // => SOMEDATA

【讨论】:

  • 我从来没有说过jQuery为同一个查询返回一个新的集合,我说的是jQuery返回一个新的REFERENCE到相同的对象(从内容的角度)返回!
  • 另外,我想做的是在这些 DOM 元素的引用上存储一些数据
  • @Fazi 您的问题是“将 javascript 后端对象绑定到 HTML 前端元素”。 .data() 将任意对象绑定到 DOM 元素。当我说 jQuery(即函数 $())返回 DOM 元素的集合时,这是因为它就是这样做的。 ref1ref1 在您的代码中是 DOM 元素的“智能”数组,而不是引用。在 jQuery 中,您通常可以将这样一个只有一个项目的数组视为对所述项目的引用,但它仍然是一个数组。
  • @Fazi 现在,如果您想将对象绑定到所述数组/引用,只需使用您自己的自定义属性,尽管最好以某种方式命名它们以避免破坏 jQuery 方法。如果要绑定到 DOM 元素,请使用 .data(),它实际上将绑定到 DOM 元素本身,而不是引用,正如我的代码示例所示。如果您想完全做其他事情,也许您应该发布一个问题,询问如何做到这一点 - 您实际上从未提供任何您想要完成的示例。
  • 据我了解,与这篇文章(stackoverflow.com/questions/3691125/objects-in-javascript)相关,Javascript 中的所有变量都存储在一个堆中。所以基本上使用 jQuery 的查询(即使它看似返回相同的对象)返回对全新对象的引用。例如,我的代码中的 ref1 和 ref2 是对不同“智能”数组的引用。虽然,从某种意义上说,你是对的,这确实与我的帖子无关。
【解决方案2】:

我的做法是这样的。

var ref1 = $('a');
var ref2 = $('div');

var equal = ref1.length === ref2.length;
if (equal) {
    $.each(ref1, function(i) {
        equal = equal && ref1[i] === ref2[i];

        if (!equal) {
            return false;
        }
    });
}

if (equal) {
    alert(true);
} else {
    alert(false);
}

【讨论】:

  • 我不相信“如何比较 jQuery 对象的身份”是 OP 的问题,只是他的观察。
【解决方案3】:
ref1[0] === ref2[0] // Should return true

我认为jQuery的实例是独一无二的,所以你可以比较它的匹配项,当你引用一个ID时应该只是一个元素。

你可以这样做:

var ref1 = $('#myID')[0];
var ref2 = $('#myID')[0];

【讨论】:

  • 正如我在其他地方评论的那样,“如何比较 jQuery 对象的身份”似乎不是 OP 问题的重点
【解决方案4】:

我深入研究了 jQuery 的源代码,找到了 jQuery 的构造函数。如下:

// Define a local copy of jQuery
jQuery = function( selector, context ) {
    // The jQuery object is actually just the init constructor 'enhanced'
    return new jQuery.fn.init( selector, context, rootjQuery );
}

每当您使用ref2 = $('#myID') 检索相应的jQuery 元素时,jQuery 都会为您创建一个新对象。所以== 会返回 false,因为这两个元素与 js 对象引擎完全不同。

似乎getElementById 方法更适合您的需要。但是不知道js引擎是如何执行它的getElementById方法的。

【讨论】:

  • 除非 OP 需要比较元素的身份,否则没有理由不使用 jQuery。
猜你喜欢
  • 2012-03-23
  • 2012-12-12
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
相关资源
最近更新 更多