Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当html元素具有相同的id名称时,如何检查未声明的变量?_Javascript - Fatal编程技术网

Javascript 当html元素具有相同的id名称时,如何检查未声明的变量?

Javascript 当html元素具有相同的id名称时,如何检查未声明的变量?,javascript,Javascript,如何检查变量名是否“正在使用”?含义:如何检查变量名是否已在var varname='something'语句中使用 通常,我只需检查typeof varname==“undefined”,这似乎工作正常问题是当页面上有一个元素具有id=“varname”时,现在,当我检查typeof varname==“undefined”时,不管怎样,我都会得到false,因为varname是一些HTML元素 varname不是“正在使用”,但也不是未定义的 <body id="test1">&

如何检查变量名是否“正在使用”?含义:如何检查变量名是否已在
var varname='something'
语句中使用

通常,我只需检查
typeof varname==“undefined”
,这似乎工作正常问题是当页面上有一个元素具有
id=“varname”
时,现在,当我检查
typeof varname==“undefined”
时,不管怎样,我都会得到
false
,因为
varname
是一些HTML元素

varname
不是“正在使用”,但也不是
未定义的

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

//如果id为test1,如何检查test1是否未声明?
console.log(typeof test1=='undefined');//元素使其为真
console.log(typeof test2=='undefined');//输出如预期一样真实

此外,您是否可以检查角落案例:
var test1=document.getElementById('test1')
已执行?

不确定这是否是您要查找的

if(typeof test1 == "undefined" && document.getElementById("test1") == null) {
//There is no element with an id="test1" and a variable test1
}

实现所需功能的唯一可能方法是使用evil
eval()
,因为无法通过名称作为字符串访问局部变量。(可以使用
窗口[“variableNameAsString”]
进行全局搜索)

下面提供的解决方案片段具有以下效果:

如果
varName
已声明和初始化(即使使用
null
),并且可从当前范围读取,则返回
true
。否则返回false

资料来源: 要检查是否未定义它,请执行以下操作:

eval(isDefinedEval + '("' + 'variableName' + '")') === false
在fiddle中,您会发现许多单元测试演示和验证了该行为

测验:
  • 小提琴中包括了一些测试
  • 这段代码在IE7、IE8和IE9以及最新的Chrome和Firefox中进行了测试
说明: 该函数必须通过
eval()
使用,因为它需要访问本地声明的变量

要访问这些变量,必须在同一范围内声明函数。这就是
eval()
所做的:它在本地范围内声明函数,然后以
varName
作为参数调用它

除此之外,该功能基本上: -删除ID为varName的每个元素的ID属性; -检查变量是否
未定义
; -并重新分配删除属性的元素的ID


注意:此答案经过大量编辑,有些内容可能仍然不适用。

在某些浏览器的全局上下文之外的上下文中,不可能可靠地确定变量是否已定义(通过声明或以其他方式初始化)或是否已使用
try..catch

因此,这样做不是一个好的策略

在全局环境中,在非IE浏览器中,您可以执行以下操作:

var global = this;

if (!global.hasOwnProperty('foo')) {
  // there is no global foo
}
但是IE没有在全局对象上实现hasOwnProperty。请注意,DOM元素名称和ID不会覆盖声明的全局变量的值

但无论如何,所有这些都是无用的,因为你可能有:

var foo = document.getElementById('foo');

现在怎么办?

如果
typeof test1==“undefined”
您不知道变量是否已定义(声明或以其他方式初始化),您只能说,如果变量已定义,则它要么未被赋值,要么已被赋值。不错的尝试。:-)@Ian在任何编辑之前,对这个答案的第一个版本应用的注释。@RobG那么他们的意思不是要有
if(typeof test1!=“undefined”&&document.getElementById(“test1”)=“null”){
表示
test1
被定义为某种东西,但它不是元素的
id
。你也必须检查名称属性。IE不知道名称属性和id属性之间的区别,但其他浏览器知道,同时模仿IE的“使名称和id成为全局”功能。有一天所有浏览器都会放弃对这个垃圾的支持。有一天…:-/@Ian是的,但是
typeof test1==“undefined”
不会告诉你有“变量test1”。虽然我的评论是针对之前版本的答案,但仍然不正确。可能重复:酷!这似乎有效。有什么原因
eval吗(“varname”)
引发异常,而不是
varname
?只是好奇。oops。第一个“false”应该是“true”,因为
test1
是声明的,因此在执行任何代码之前就存在。它只是在前几个测试之后才被赋值。请注意,
eval('test1')
只是返回字符串。”test1“。邪恶的另一个好用法
eval
,但有时这是必要的。@uber5001我将尝试解释:
eval()
计算表达式。因此
eval(“varname”)
如果从未定义
varname
,将抛出异常。
eval(varname)如果
varname
的值为`
“myVar”
并且定义了一个变量
myVar
,则
不会引发异常。如果可以进一步解释,请告诉我。@uber5001我更新了答案。检查它是否适用于您。(同时检查小提琴上的测试,希望它们符合您的使用模式。)
var global = this;

if (!global.hasOwnProperty('foo')) {
  // there is no global foo
}
var foo = document.getElementById('foo');