[英]How to check for undeclared variables when an html element has the same id name?
如何检查变量名称是否“正在使用”? 含义:如何检查变量名是否已在var varname = 'something'
语句中使用?
通常,我只会检查typeof varname == 'undefined'
,这似乎工作正常。 问题是页面上有一个id="varname"
的元素。 现在,当我检查typeof varname == 'undefined'
,无论如何我都会得到false
,因为varname
是一些HTML元素。
varname
不是“正在使用”,但它也没有undefined
。
<body id="test1"></body>
<script>
//if <body> has an id of test1, how do i check if test1 is undeclared?
console.log(typeof test1 == 'undefined'); // the <body> element causes this to be true
console.log(typeof test2 == 'undefined'); // outputs true as expected
</script>
另外,你能检查一下这个案例: var test1 = document.getElementById('test1')
是否已被执行?
实现所需内容的唯一可能方法是通过邪恶的eval()
,因为无法通过名称作为字符串访问局部变量。 (可以使用window["variableNameAsString"]
来实现全局。)
下面介绍的解决方案片段具有以下效果:
如果声明并初始化
varName
(即使为null
),则返回true
,并且可从当前范围读取。 否则返回false
。
function removeIdOfAllElementsWithId(id) {
var element, elementsFound = [];
while ((element = document.getElementById(id)) !== null) {
element.removeAttribute('id')
elementsFound.push(element);
}
return elementsFound;
}
function assignIdToElements(elements, id) {
for (var i = 0, n = elements.length; i < n; i++) { elements[i].id = id; }
}
var isDefinedEval = '(' +
function (isDefinedEvalVarname) {
var isDefinedEvalResult;
var isDefinedEvalElementsFound = removeIdOfAllElementsWithId(isDefinedEvalVarname);
try {
isDefinedEvalResult = eval('typeof '+isDefinedEvalVarname+' !== "undefined"');
} catch (e) {
isDefinedEvalResult = false;
}
assignIdToElements(isDefinedEvalElementsFound, isDefinedEvalVarname);
return isDefinedEvalResult;
}
+ ')';
要测试是否定义了名为variableName
:
eval(isDefinedEval + '("' + 'variableName' + '")') === true
要检查它是否未定义:
eval(isDefinedEval + '("' + 'variableName' + '")') === false
在小提琴中,你会发现许多单元测试证明和验证行为。
该函数必须通过eval()
因为它需要访问本地声明的变量。
要访问此类变量,必须在同一范围内声明函数。 这就是eval()
所做的:它在本地范围内声明函数,然后使用varName
作为参数调用它。
除此之外,该函数基本上: - 删除每个具有ID === varName
元素的ID属性; - 检查变量是否undefined
; - 并重新分配它删除属性的那些元素的ID。
注意:这个答案经过大量编辑,有些内容可能仍然不适用。
不确定这是否是你要找的。
if(typeof test1 == "undefined" && document.getElementById("test1") == null) {
//There is no element with an id="test1" and a variable test1
}
在某些浏览器中除了全局上下文之外的上下文中,除了使用try..catch
之外,不可能可靠地确定是否已定义变量(通过声明或以其他方式初始化)。
因此,这不是一个好的策略。
在全局环境中,在非IE浏览器中,您可以执行以下操作:
var global = this;
if (!global.hasOwnProperty('foo')) {
// there is no global foo
}
但是IE并没有在全局对象上实现hasOwnProperty 。 请注意,DOM元素名称和ID不会覆盖已声明的全局变量的值。
但无论如何,所有这些都是无用的,因为你可能有:
var foo = document.getElementById('foo');
现在怎么办?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.