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

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

此外,您能否检查极端情况:var test1 = document.getElementById('test1') 是否已执行?

最佳答案

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

下面给出的解决方案片段具有以下效果:

Returns true if varName was declared and initialized (even if with null) and is readable from the current scope. Otherwise returns 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

在 fiddle 中,您会发现许多单元测试演示和验证行为。

测试:

  • fiddle 中包含几个测试;
  • 此代码段已在 IE7、IE8 和 IE9 以及最新的 Chrome 和 Firefox 中进行了测试。

说明:

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

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

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

注意:这个答案经过大量编辑,一些评论可能不再适用。

关于javascript - 当 html 元素具有相同的 id 名称时,如何检查未声明的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16454283/

相关文章:

javascript - Angular 4 : cannot subscribe observable value from CanActivate AccessGuard

javascript - Angular Material MatChipList - 如何在动态 FormArray 上使用它?

javascript - 使用 jQuery 更改切换按钮的颜色

javascript - 更改D3 geoCircle的大小和 Angular

javascript - 如何连接 PostgreSQL 和 hapi.js

javascript - 页面未返回结果

javascript - AngularJS Ng-repeat html 分隔符/分隔符

javascript - 模块构建失败 : ReferenceError: Unknown plugin "import" specified in "base" at 0

javascript - jquery 数据表 - $.fn.dataTable.ext.errMode 不是函数

javascript - IE6 : Background-Image Load Event