【问题标题】:Javascript Dom element ID assigned to JS object? Am I insane or...?分配给 JS 对象的 Javascript Dom 元素 ID?我是疯了还是……?
【发布时间】:2013-04-04 01:36:00
【问题描述】:

好吧,所以我最近一直在调试我们的应用在某些移动浏览器上的 JS 问题,而该解决方案给我的启示似乎完全是疯狂的:

我的问题是,在普通的 android 浏览器和 iOS Safari(没有其他地方)上,当我在对象上调用函数时,它会返回一个错误,即该对象没有这样的函数。我想,标准错误......除了我之前明确定义了该对象和函数 - 作为伪命名空间,如

    var varname = varname || { ... }

现在,'varname' 作为 JS 对象之前没有被创建,所以 ||只是为了安全,因为这些插件被称为一堆......但在某种程度上我无法解释,页面前面的<section>,id =“varname”,已经在那个js对象中了。

这怎么可能?也许只是太晚了,我忽略了一些东西,但看起来我的 HtmlElements 被分配给 id 作为 var 名称的 javascript 对象。

我只写了 3.5 年的 js 代码,但我要么发现了一些奇怪的错误,要么不得不认真重新评估我的 JS 知识。

这是任何怀疑者的确切代码(JSTL 提供了部分 ID,但我认为这与它没有任何关系):

    <section id="attr<c:out value="${thisFieldAndAttrs.id}" />" class="attr"> ...

几百行之后(但没有提及任何attr###),我去创建一个对象:

    var attr<c:out value="${thisFieldAndAttrs.id}"/> = attr<c:out value="${thisFieldAndAttrs.id}"/> || { ...

并且对象已经存在,作为&lt;section&gt; HTMLElement 的一个实例。这发生在所有浏览器上,但较新的浏览器似乎知道足以覆盖对象(?)。我拥有的唯一外部脚本是 JQuery,据我所知,如果您可以在 Javascript 中通过它们的 ID 引用 HTMLElements,那会不会首先消除使用 JQuery 的很多便利?我查看了他们的文档,找不到任何提到这一点的地方。

这是一个错误吗?或者只是非常意想不到的功能?还是我在这里遗漏了什么...

【问题讨论】:

  • 不幸的是,非常期待的功能。浏览器将任何具有id 属性的元素放入window 对象中。如您所见,像&lt;section id="varname"&gt;&lt;/section&gt; 这样的元素在window 中创建了一个属性作为“varname”-window.varname,它可以像varname 一样单独引用。我不相信这是任何标准的一部分,因此不应该被信任。同时,我不确定您是否应该为 JSP 循环中的每个项目创建一个变量...您可能可以更有效地做到这一点

标签: javascript jquery html object variable-assignment


【解决方案1】:

在某些浏览器(全部?)中,具有 ID 的元素会自动在具有该 ID 的窗口上生成一个属性。但是,如果您声明变量,它应该覆盖它,但这几乎破坏了您正在做的事情。如果其他脚本需要使用它,我建议直接在 window 上声明它。

<div id="section"></div>
<script>
    console.log(section); // div element
    (function(){
        var section = section || {};
        console.log(section); // object

        window.section = section;
    })();
    console.log(section); // object
</script>

http://jsfiddle.net/8u8sn/3/

【讨论】:

  • 不过有一个问题,它需要在 var 部分测试 window.section,这会让你回到第一方。您需要确认 window.section 是您要查找的对象类型,而不是我猜的 dom 元素。
  • 疯了,我现在可能已经创建了 50 个网站,但从未听说过这个。我已经尽我所能搜索它,但你知道这是否在某处的规范中定义吗?我想确切地确定何时需要担心它,因为这不是我第一次使用匹配对象的 id。另外,这不会使 jquery 快捷方式 $(#id) 变得多余吗?
  • @user2264631 是的,除非在窗口中覆盖了所述 id。例如,如果您包含 jQuery,则无法以这种方式访问​​ id="jQuery"。我不会使用它,因为它看起来很脆弱。如果某个 var 关键字在某处被遗漏,它可能会覆盖 window 的该属性,如您所知 document.getElementById() 将始终获取该元素。
猜你喜欢
  • 2011-07-21
  • 1970-01-01
  • 2016-01-08
  • 2019-02-24
  • 1970-01-01
  • 2023-04-08
  • 2011-03-27
  • 1970-01-01
  • 2012-06-06
相关资源
最近更新 更多