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的大量便利吗?我查看了他们的文档,但在任何地方都找不到这个。
这是一个错误吗?或者只是意想不到的功能?或者我在这里错过了一些东西......
答案 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>