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

ube*_*001 7 javascript

如何检查变量名称是否"正在使用"?含义:如何检查变量名是否已在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>
Run Code Online (Sandbox Code Playgroud)

另外,你能检查角落情况:var test1 = document.getElementById('test1')已经执行了吗?

acd*_*ior 6

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

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

返回trueif varName声明和初始化(即使有null)并且可从当前范围读取.否则返回false.

DEMO jsFiddle在这里.

资源:

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;
    }
+ ')';
Run Code Online (Sandbox Code Playgroud)

用法:

要测试是否variableName定义了带名称的变量:

eval(isDefinedEval + '("' + 'variableName' + '")') === true
Run Code Online (Sandbox Code Playgroud)

要检查它是否未定义:

eval(isDefinedEval + '("' + 'variableName' + '")') === false
Run Code Online (Sandbox Code Playgroud)

在小提琴中,你会发现许多单元测试证明和验证行为.

测试:

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

说明:

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

要访问此类变量,必须在同一范围内声明函数.这就是eval():它在本地范围内声明函数,然后使用varNameas参数调用它.

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

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