繁体   English   中英

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

[英]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

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;
    }
+ ')';

用法:

要测试是否定义了名为variableName

eval(isDefinedEval + '("' + 'variableName' + '")') === true

要检查它是否未定义:

eval(isDefinedEval + '("' + 'variableName' + '")') === false

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

测试:

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

说明:

该函数必须通过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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM