document.createElement()

document.createElement()是在对象中创建一个对象,要与appendChild() 或 insertBefore()方法联合使用。其中,appendChild() 方法在节点的子节点列表末添加新的子节点。insertBefore() 方法在节点的子节点列表任意位置插入新的节点。

 

       下面,举例说明document.createElement()的用法。<div id="board"></div>

 

例1:

        <script type="text/javascript">

            var board = document.getElementById("board");

            var e = document.createElement("input");

             e.type = "button";

            e.value = "这是测试加载的小例子";

            var object = board.appendChild(e);

        </script>

效果:在标签board中加载一个按钮,属性值为“这是测试加载的小例子”。

       

例2:

        <script type="text/javascript">

            var board = document.getElementById("board");

            var e2 = document.createElement("select");

            e2.options[0] = new Option("加载项1", "");

            e2.options[1] = new Option("加载项2", "");

            e2.size = "2";

            var object = board.appendChild(e2);

        </script>

效果:在标签board中加载一个下拉列表框,属性值为“加载项1”和“加载项2”。

        

例3:

        <script type="text/javascript">

            var board = document.getElementById("board");           

            var e3 = document.createElement("input");

             e4.setAttribute("type", "text");

            e4.setAttribute("name", "q");

             e4.setAttribute("value", "使用setAttribute");

            e4.setAttribute("onclick", "javascript:alert('This is a test!');");           

            var object = board.appendChild(e3);

        </script>

效果:在标签board中加载一个文本框,属性值为“使用setAttribute”。 当点击这个文本框时,会弹出对话框“This is a test!”。

 

         根据上面例子,可以看出,可以通过加载对象的属性来设置,参数是相同的。使用e.type="text" 和 e.setAttribute("type","text")效果是一致的。

       

         下面,我们用实例来讲述一下appendChild() 方法和insertBefore() 方法的不同。

         比如我们要在下面这个div中插入一个子节点P时:<div id="test"><p id="x1">Node</p><p>Node</p></div>

我们可以这样写:

<script type="text/javascript">

var oTest = document.getElementById("test");

var newNode = document.createElement("p");

newNode.innerHTML = "This is a test";

//测试从这里开始

//appendChild方法:

oTest.appendChild(newNode);

//insertBefore方法:

oTest.insertBefore(newNode,null);

</script>

      通过以上的代码,可以测试到一个新的节点被创建到了节点div下,且该节点是div最后一个节点。很明显,通过这个例子,可以知道appendChildhild和insertBefore都可以进行插入节点的操作。

   在上面的例子中有这样一句代码:oTest.insertBefore(newNode,null) ,这里insertBefore有2个参数可以设置,第一个是和appendChild相同的,第二却是它特有的。它不仅可以为null,还可以为:

<script type="text/javascript">

var oTest = document.getElementById("test");

var refChild = document.getElementById("x1");

var newNode = document.createElement("p");

newNode.innerHTML = "This is a test";

oTest.insertBefore(newNode,refChild);

</script>

效果:这个例子将在x1节点前面插入一个新的节点

 

又或:

<script type="text/javascript">

var oTest = document.getElementById("test");

var refChild = document.getElementById("x1");

var newNode = document.createElement("p");

newNode.innerHTML = "This is a test";

oTest.insertBefore(newNode,refChild.nextSibling);

</script>

效果:这个例子将在x1节点的下一个节点前面插入一个新的节点

 

还可为:

<script type="text/javascript">

var oTest = document.getElementById("test");

var newNode = document.createElement("p");

newNode.innerHTML = "This is a test";

oTest.insertBefore(newNode,oTest.childNodes[0]);  

</script>

  这个例子将在第一子节点前面插入一个新的节点,也可以通过改变childNodes[0,1,...]来在其它位置插入新的节点

由于可见insertBefore()方法的特性是在已有的子节点前面插入新的节点,但例一中使用insertBefore()方法也可以在子节点列表末插入新节点的。两种情况结合起来,发现insertBefore()方法插入节点,是可以在子节点列表的任意位置。

  从这几个例子中得出:

  appendChild() 方法在节点的子节点列表末添加新的子节点。

  insertBefore() 方法在节点的子节点列表任意位置插入新的节点。

今天处理了一个日期选择器的ie和ff的兼容问题,本来这种情况就很难找错误,找了好久才把错误定位到js中创建元素的方法document.createElement(),这个方法在ie下支持这样创建元素

document.getElementsByName , document.getElementsByTagName ,document.createElement  - 齐奥 - Study Deskvar inputObj     = document.createElement

document.getElementsByName , document.getElementsByTagName ,document.createElement  - 齐奥 - Study Desk     ("<input type='text' size='8' style='border:0px;border-bottom:2px solid #c0c0c0;' " readonly >");

 

但是这样的情况在ff下是不兼容的。

还有就是非凡注重input元素的创建:与 input 有关的元素有很多,比如:checkbox、radio、submit、reset...,因此创建 input 是个很非凡的用法。

创建不同的 input 正确的做法是:

document.getElementsByName , document.getElementsByTagName ,document.createElement  - 齐奥 - Study Desk<div id="board"></div>

document.getElementsByName , document.getElementsByTagName ,document.createElement  - 齐奥 - Study Desk

document.getElementsByName , document.getElementsByTagName ,document.createElement  - 齐奥 - Study Desk<script type="text/javascript">

document.getElementsByName , document.getElementsByTagName ,document.createElement  - 齐奥 - Study Desk<!--

document.getElementsByName , document.getElementsByTagName ,document.createElement  - 齐奥 - Study Deskvar board = document.getElementById("board");

document.getElementsByName , document.getElementsByTagName ,document.createElement  - 齐奥 - Study Deskvar e = document.createElement("input");

document.getElementsByName , document.getElementsByTagName ,document.createElement  - 齐奥 - Study Deske.type = "radio"; //紧接着上一行写

document.getElementsByName , document.getElementsByTagName ,document.createElement  - 齐奥 - Study Deskvar obj = board.appendChild(e);

document.getElementsByName , document.getElementsByTagName ,document.createElement  - 齐奥 - Study Deskobj.checked = true;

document.getElementsByName , document.getElementsByTagName ,document.createElement  - 齐奥 - Study Desk//如下写法也是正确的:

document.getElementsByName , document.getElementsByTagName ,document.createElement  - 齐奥 - Study Desk//e.checked = true;

document.getElementsByName , document.getElementsByTagName ,document.createElement  - 齐奥 - Study Desk-->

document.getElementsByName , document.getElementsByTagName ,document.createElement  - 齐奥 - Study Desk</script>

document.getElementsByName , document.getElementsByTagName ,document.createElement  - 齐奥 - Study Desk

针对 input,在 Netscape、Opera 和 Firefox 中 e.type 既可以在 appendChild 之前,也可以在其之后。但在 IE 中 type 属性必须在前,其它属性必须在后。

IE 创建元素,还有一个特点,就是可以连同属性一同创建,比如:var e = document.createElement("<input type='radio' name='r' value='1' />"); 这在其它浏览器中是不行的,所以我们也不支持。

总结:

  • 针对非 input 元素,各浏览器中,既可以把对元素属性的改变写在显示元素(insertBefore 或 appendChild)之前,也可以在其后。
  • 针对 input 元素,为了兼容 IE,type 属性写在显示元素(insertBefore 或 appendChild)之前,其它属性写在其后。

 

推荐:

  • 除了 input 元素的 type 属性写在显示元素(insertBefore 或 appendChild)之前外,其它属性都写在显示元素之后。
  •  

    改变属性时,对写在显示元素(insertBefore 或 appendChild)之前的用 createElement 的返回值,对写在显示元素之后的用 insertBefore 或 appendChild 的返回值。

    document.getElementsByName 和 document.getElementsByTagName

    当页面上的控件同名且多个的时候,从程序的严密角度出发,需要判定长度,而且有长度和没长度是两种引用方法.

    oEle= document.all.aaa ;//这里有一个aaa的对象,但我们不知道它现在长度是多少,所以没办法对它操作.因此,我们要先做判定长度的过程.如下:

    if(oEle.length){}else{};

    在两种情况下,花括号里面的内容写法也是不一样的:

    if(oEle.length){

    for(var i = 0 ;i<oEle.length;i++){

    oEle[i].value..

    }

    }

    else{

    oEle.value..

    };

    但是这样写是不是太复杂了点?而且当花括号里面的代码比较多的时候,我们要写两遍代码,晕了先~

    还好有

    document.getElementsByName()

    这个方法.它对一个和多个的处理是一样的,我们可以用:

    oEle = document.getElementsByName('aaa')

    来引用

    当oEle只有1个的时候,那么就是oEle[0],有多个的时候,用下标法oEle[i]循环获得,是不是很简单?

    值得一提的是它对Name和ID的同样有效的. (它只能应用到document对象)

    <div id=radiodiv language=javascript >

    <INPUT name=radio1 value=1 type="radio">

    <INPUT name=radio1 value=0 type="radio" CHECKED>

    </div>

    document.getElementsByName("radio1").item(0).value 结果是 1

    但是.相对应的,还有另一个方法,可以应用的对象会更广一点:

    getElementsByTagName

    <div id=radiodiv language=javascript >

    <INPUT name=radio1 value=1 type="radio" id=myRadio1>

    <INPUT name=radio1 value=0 type="radio" id=myRadio2 CHECKED >

    </div>

    radiodiv.getElementsByTagName("input").item(0).value 结果是 1

    ,比如我知道了一个<DIV ID='aaa'><input name=input1 value=1 type=radio ><input name=input1 value=2 type=radio>......</DIV>我要取DIV里面的所有input,这样写就可以了:

    aaa.getElementsByTagName('INPUT')

    这样就有效的可以和别的DIV(比如说有个叫bbb的DIV,里面的也是一样的input)相区别.

    同getElementsByTagName相对应,

    还有一个document.body.all.tags()

    能用这个方法的对象比getElementsByTagName要小得多.但比getElementsByName要多.

    到这里我们还要提一下getElementById

    它也是只有document对象才能使用,而且返回的是数组的第一个元素,呵呵,它的方法名都写明了是getElement而不是getElements

    <div id=radiodiv language=javascript >

    <INPUT name=radio1 value=1 type="radio" id=myRadio1 >

    <INPUT name=radio1 value=0 type="radio" id=myRadio2 value="myVal2" CHECKED >

    </div>

     

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值