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

时间:2013-05-09 04:19:25

标签: javascript

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

通常情况下,我只会查看是否typeof varname == 'undefined',这似乎工作正常。 问题是页面上有一个元素id="varname"现在,当我检查typeof varname == 'undefined'时,我得到false,因为{{1}是一些HTML元素。

varname不是“正在使用”,但它也不是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> 是否已执行?

3 个答案:

答案 0 :(得分:6)

实现所需内容的唯一可能方法是通过邪恶的eval(),因为无法通过名称作为字符串访问本地变量。 (使用window["variableNameAsString"]可以实现全局。)

下面介绍的解决方案片段具有以下效果:

  

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

<强> DEMO jsFiddle here.

来源:

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

在小提琴中,你会发现很多单元测试证明并验证了这种行为。

试验:

  • 小提琴中包括几项测试;
  • 此片段在IE7,IE8和IE9以及Chrome和Firefox的最新版本中进行了测试。

说明:

该函数必须通过eval()使用,因为它需要访问本地声明的变量。

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

除此之外,功能基本上是: - 删除具有ID === varName的每个元素的ID属性; - 检查变量是否为undefined; - 并重新分配它删除属性的那些元素的ID。

注意:这个答案经过大量编辑,有些内容可能仍然无法应用。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

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

var global = this;

if (!global.hasOwnProperty('foo')) {
  // there is no global foo
}

但是IE没有在全局对象上实现 hasOwnProperty 。请注意,DOM元素名称和ID不会覆盖声明的全局变量的值。

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

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

现在怎么办?