按位置访问文档元素时检测数组

时间:2015-01-15 12:02:47

标签: javascript arrays forms dom

As the browser reads an HTML document and forms a parse tree, JavaScript objects are 
instantiated for all elements that are scriptable. Initially, the number of markup 
elements that were scriptable in browsers was limited, but with a modern browser it 
is possible to access any arbitrary HTML element. 

但是,目前,作为脚本语言的新手,我专注于 ,可以通过 传统的JavaScript对象模型访问< / em> (也称为 DOM Level 0 ),尤其是 < em>其相关元素 ,以保持简单。

检测阵列
        虽然 数组 对象没有什么不同,但我们可能会对它们进行处理,对它们进行检测可能很重要。不幸的是,typeof不会有太大帮助。

    var arr = [];
    alert(typeof arr);            // "object"

    alert(arr instanceof Array);  // returns true

    alert(Array.isArray(arr));    // returns true

使用traditional JavaScript object model,我们可以使用

访问<form>代码
window.document.forms

这是一个看起来像基本意义上的数组的集合 考虑一种非常基本的形式

    <form action="form1action.php" method="get">
        <input type="text" name="field1">

    </form>
    <br><br>

    <form action="form2action.php" method="get">
        <input type="text" name="field2">
        <br>
        <input type="text" name="field3">

    </form>

    <script type="text/javascript">

        console.log(typeof window.document.forms[1].elements[1]);            // object
        console.log(typeof window.document.forms[1].elements);               // object
        console.log(window.document.forms[1].elements instanceof Array);     // false
        console.log(window.document.forms instanceof Array);  // false

    </script>

我发现自己真的与意想不到的行为混淆了(这只适合我)

console.log(window.document.forms[1].elements instanceof Array);  // false
console.log(typeof window.document.forms instanceof Array);       // false

因为我的印象是JavaScript引擎会将 某些内容[] 视为 instanceof 数组 ,在上述情况下,重点是elements and forms

1 个答案:

答案 0 :(得分:3)

并非所有索引属性([0], [1]等)都是一个数组 - 它可以是任何类型的对象集合,这不是一回事。它甚至可能只是一个具有0属性的对象,而不是一个集合。

在这种情况下,document.forms是一个HTMLCollection - 一个专门的HTML元素集合 - window.document.forms[1].elements是一个HTMLFormControlsCollection,它继承自HTMLCollection

// all log true
console.log(window.document.forms instanceof HTMLCollection);
console.log(window.document.forms[1].elements instanceof HTMLFormControlsCollection);
console.log(window.document.forms[1].elements instanceof HTMLCollection);

// NOTE: typeof doesn't give the exact type of an object.
// This just logs "object", rather than "HTMLCollection", because it is an object, as opposed to e.g. a number
console.log(typeof window.document.forms);

var myObject = {0: 'foo', 1: 'bar'};
// log "foo bar"
console.log(myObject[0], myObject[1]);
<form></form>
<form></form>

Mozilla关于MDN的文档通常可用于查看对象的实际类型,例如document.formsHTMLFormElement.elements