Javascript Dom元素ID分配给JS对象?我疯了还是......?

时间:2013-04-11 18:11:33

标签: javascript jquery html object variable-assignment

Hokay,所以我最近在一些移动浏览器上调试了我们的应用程序的JS问题,解决方案给我的启示似乎完全是疯了:

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

    var varname = varname || { ... }

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

这是怎么回事?也许它只是迟到了,我忽略了一些东西,但它看起来像某个地方我的HtmlElements被分配给id为var name的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}"/> || { ...

和对象ALREADY EXISTS,作为<section> HTMLElement的一个实例。这种情况发生在所有浏览器上,但较新的浏览器似乎知道足以覆盖对象(?)。我唯一的外部脚本是JQuery,据我所知,如果你可以通过Javascript中的ID引用HTMLElements,那么首先不会删除使用JQuery的大量便利吗?我查看了他们的文档,但在任何地方都找不到这个。

这是一个错误吗?或者只是意想不到的功能?或者我在这里错过了一些东西......

1 个答案:

答案 0 :(得分:4)

在某些浏览器中(全部?),具有ID的元素将自动在窗口上生成具有所述Id的属性。但是,如果你声明变量,它应该覆盖它,但是这几乎打破了你正在做的事情。我建议直接在窗口上声明它,如果它是需要其他脚本可用的东西。

<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/