牛骨文教育服务平台(让学习变的简单)
博文笔记

常见DOM操作(JS)

创建时间:2017-03-01 投稿人: 浏览次数:1040

DOM

获取节点设置样式

// 获取<p id="p-id">...</p>
var p = document.getElementById("p-id");
// 设置CSS:
p.style.color = "#ff0000";
p.style.fontSize = "20px";
p.style.paddingTop = "2em"

动态创建一个节点

var
    list = document.getElementById("list"),
    haskell = document.createElement("p");
haskell.id = "haskell";
haskell.innerText = "Haskell";
list.appendChild(haskell);

这样我们就动态添加了一个新的节点:

<!-- HTML结构 -->
<div id="list">
    <p id="java">Java</p>
    <p id="python">Python</p>
    <p id="scheme">Scheme</p>
    <p id="haskell">Haskell</p>
</div>

创建一个样式标签,将页面变为红色

var d = document.createElement("style");
d.setAttribute("type", "text/css");
d.innerHTML = "p { color: red }";
document.getElementsByTagName("head")[0].appendChild(d);

将子节点插到指定节点之前

<!-- HTML结构 -->
<div id="list">
    <p id="java">Java</p>
    <p id="python">Python</p>
    <p id="scheme">Scheme</p>
</div>

可以这么写:

var
    list = document.getElementById("list"),
    ref = document.getElementById("python"),
    haskell = document.createElement("p");
haskell.id = "haskell";
haskell.innerText = "Haskell";
list.insertBefore(haskell, ref);

新的HTML结构如下:

<!-- HTML结构 -->
<div id="list">
    <p id="java">Java</p>
    <p id="haskell">Haskell</p>
    <p id="python">Python</p>
    <p id="scheme">Scheme</p>
</div>

按字符串顺序重新排序DOM节点

<!-- HTML结构 -->
<ol id="test-list">
    <li class="lang">Scheme</li>
    <li class="lang">JavaScript</li>
    <li class="lang">Python</li>
    <li class="lang">Ruby</li>
    <li class="lang">Haskell</li>
</ol>
// sort list:
var testList=document.getElementById("test-list");
var lis=document.getElementsByClassName("lang");

for(let i=0;i<lis.length;i++){
    for(let j=i+1;j<lis.length;j++){
        if(lis[i].innerText >lis[j].innerText){
            testList.insertBefore(lis[j],lis[i])
        }
    }
}

遍历ul中的节点

<!-- HTML结构 -->
<ul id="test-list">
    <li>JavaScript</li>
    <li>Swift</li>
    <li>HTML</li>
    <li>ANSI C</li>
    <li>CSS</li>
    <li>DirectX</li>
</ul>
var list = document.getElementById("test-list");
for(var i=0;i<list.children.length;i++){
    var child=list.children[i].innerHTML;
    alert(child);
}

删除ul中的特定节点

<!-- HTML结构 -->
<ul id="test-list">
    <li>JavaScript</li>
    <li>Swift</li>
    <li>HTML</li>
    <li>ANSI C</li>
    <li>CSS</li>
    <li>DirectX</li>
</ul>
"use strict";
// TODO
//var p=docuemnt.getElementById("test-list");
//var valid=new Set(["JavaScript","HTML","CSS"]);
var list = document.getElementById("test-list");
var valid = new Set(["JavaScript", "HTML", "CSS"]);
for(var i=0;i<list.children.length;i++){
    var child = list.children[i];
    if(!valid.has(child.innerText)){
        list.removeChild(child);
        i--;//子节点总数已变化
    }
}
var list = document.getElementById("test-list");
for(var i=0;i<list.children.length;i++){
    var child=list.children[i].innerHTML;
    alert(child);
}

表单

获取文本框中的值

// <input type="text" id="email">
var input = document.getElementById("email");
input.value; // "用户输入的值"

提交表单

方式一是通过元素的submit()方法提交一个表单,例如,响应一个<button>的click事件,在JavaScript代码中提交表单:

<!-- HTML -->
<form id="test-form">
<input type="text" name="test">
<button type="button" onclick="doSubmitForm()">Submit</button>
</form>

<script>
function doSubmitForm() {
var form = document.getElementById("test-form");
// 可以在此修改form的input...
// 提交form:
form.submit();
}
</script>

第二种方式是响应本身的onsubmit事件,在提交form时作修改:

<!-- HTML -->
<form id="test-form" onsubmit="return checkForm()">
    <input type="text" name="test">
    <button type="submit">Submit</button>
</form>

<script>
function checkForm() {
    var form = document.getElementById("test-form");
    // 可以在此修改form的input...
    // 继续下一步:
    return true;
}
</script>

注意要return true来告诉浏览器继续提交,如果return false,浏览器将不会继续提交form,这种情况通常对应用户输入有误,提示用户错误信息后终止提交form。

使用MD5来传输口令

<!-- HTML -->
<form id="login-form" method="post" onsubmit="return checkForm()">
    <input type="text" id="username" name="username">
    <input type="password" id="password" name="password">
    <button type="submit">Submit</button>
</form>

<script>
function checkForm() {
    var pwd = document.getElementById("password");
    // 把用户输入的明文变为MD5:
    pwd.value = toMD5(pwd.value);
    // 继续下一步:
    return true;
}
</script>

这个做法看上去没啥问题,但用户输入了口令提交时,口令框的显示会突然从几个变成32个(因为MD5有32个字符)。

要想不改变用户的输入,可以利用<input type="hidden">实现:

<!-- HTML -->
<form id="login-form" method="post" onsubmit="return checkForm()">
    <input type="text" id="username" name="username">
    <input type="password" id="input-password">
    <input type="hidden" id="md5-password" name="password">
    <button type="submit">Submit</button>
</form>

<script>
function checkForm() {
    var input_pwd = document.getElementById("input-password");
    var md5_pwd = document.getElementById("md5-password");
    // 把用户输入的明文变为MD5:
    md5_pwd.value = toMD5(input_pwd.value);
    // 继续下一步:
    return true;
}
</script>

注意到id为md5-password的<input>标记了name=”password”,而用户输入的id为input-password<input>没有name属性。没有name属性的<input>的数据不会被提交。

利用JavaScript检查用户注册信息是否正确,在以下情况不满足时报错并阻止提交表单:
- 用户名必须是3-10位英文字母或数字;
- 口令必须是6-20位;
- 两次输入口令必须一致。

<!-- HTML结构 -->
<form id="test-register" action="#" target="_blank" onsubmit="return checkRegisterForm()">
    <p id="test-error" style="color:red"></p>
    <p>
        用户名: <input type="text" id="username" name="username">
    </p>
    <p>
        口令: <input type="password" id="password" name="password">
    </p>
    <p>
        重复口令: <input type="password" id="password-2">
    </p>
    <p>
        <button type="submit">提交</button> <button type="reset">重置</button>
    </p>
</form>
    "use strict"
    var checkRegisterForm=function(){
        // TODO:获取用户名、口令、重复口令标签中的值
        var username=document.getElementById("username").value;
        var password=document.getElementById("password").value;
        var password2=document.getElementById("password-2").value;
        //判断用户名是否符合规则
        var regUsername=/^[w]{3,10}$/;
        var flag1=regUsername.test(username);
        //判断口令是否符合规则
        var regPassword=/^.{6,20}$/;
        var flag2=regPassword.test(password);
        //判断两次口令输入是否相同
        var flag3=password===password2?true:false;
        if(flag1&&flag2&&flag3){
            return true;
        }else{
            return false;
    }

}

操作文件

在HTML表单中,可以上传文件的唯一控件就是<input type="file">。

注意:当一个表单包含<input type="file">时,表单的enctype必须指定为multipart/form-data,method必须指定为post,浏览器才能正确编码并以multipart/form-data格式发送表单的数据。

var f = document.getElementById("test-file-upload");
var filename = f.value; // "C:fakepath	est.png"
if (!filename || !(filename.endsWith(".jpg") || filename.endsWith(".png") || filename.endsWith(".gif"))) {
    alert("Can only upload image file.");
    return false;
}

上传图片

<form method="post" action="http://localhost/test" enctype="multipart/form-data">
    <p>图片预览:</p>
    <p></p><div id="test-image-preview"
                style="border: 1px solid #ccc; width: 100%; height: 200px; background-size: contain;
                 background-repeat: no-repeat;
                 background-position: center center;"></div>
    <p></p>
    <p>
        <input type="file" id="test-image-file" name="test">
    </p>
    <p id="test-file-info"></p>
</form>

<script>
    var
        fileInput=document.getElementById("test-image-file");
        info=document.getElementById("test-file-info");
        preview=document.getElementById("test-image-preview");

    //监听chang事件
    fileInput.addEventListener("change",function(){
        //清除背景图片
        preview.style.backgroundImage="";
        //检查文件是否选择
        if(!fileInput.value){
            info.innerHTML="没有选择文件";
            return;
        }
        //获取file引用
        var file=fileInput.files[0];
        //获取File信息
        info.innerHTML="文件"+file.name+"<br>"+
                        "大小"+file.size+"<br>"+
                        "修改"+file.lastModifiedDate+"<br>";
        if(file.type!="image/jpeg"&&file.type!="image/png"&&file.type!="image/gif"){
            alert("不是有效的图片文件");
            return;
        }
        //读取文件
        var reader=new FileReader();
        reader.onload=function(e){
            var
                    data=e.target.result;
            preview.style.backgroundImage="url("+data+")";
        }
        //以dataUrl的形式读取文件
        reader.readAsDataURL(file);

    })

</script>
阅读更多
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。