JavaScript DOM编程艺术(第2版)第七章 动态创建标记 第九章CSS-DOM

版权声明:本文为博主原创文章,转载时请标明出处 https://blog.csdn.net/weixin_41056807/article/details/84025807

第七章 动态创建标记

一.

1.document.write最大缺点是违背“行为应该与表现分离”的原则。还有,MIME类型application/xhtml+xml与document.write不兼容,浏览器在呈现这种XHTML文档时不会执行document.write方法。
2.document.write方法像<font标签去设定字体和颜色
3.innerHTML属性:用来读写给某给定的元素里的HTML内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        window.onload = function () {
            var testdiv = document.getElementById("testdiv");
            testdiv.innerHTML = "<p> I inserted <em>this</em> content.</p>";
        }
    </script>
</head>
<body>
<div id="testdiv"></div>
</body>
</html>

在这里插入图片描述
但是用这个技术无法区分是插入的HTML还是替换,一旦使用innerHTML,他的全部内容会被替换。但是innerHTML实现js和HTML的分离。innerHTML也是HTML的专有属性。任何时候标准DOM都可以替代innerHTML

二.DOM方法

1.DOM是双向车道,可以获取文档的内容还可以更新文档的内容。在浏览器看来,DOM节点树才是文档。如果想添加一些标记到文档,就必须插入元素节点。
2.createElement方法——创建节点
方法本身不能影响页面的表现

 <script>
        window.onload = function () {
            var pa = document.createElement("p");
            var info = "nodeName: ";
            info+=pa.nodeName;
            info+=" nodeType: ";
            info+=pa.nodeType;
            alert(info);
        }
    </script>

在这里插入图片描述
此时的pa变量不是任何DOM树的组成部分——文档碎片。还不能显示在浏览器窗口画面。但是他和任何节点一样都有自己的DOM属性。
3.appendChild方法
想创建的p元素称为testdiv元素的子节点

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        window.onload = function () {
            var pa = document.createElement("p");
            var testdiv = document.getElementById("testdiv");
            testdiv.appendChild(pa);
        }
    </script>
</head>
<body>
<div id="testdiv"></div>
</body>
</html>

在这里插入图片描述
4.createTextNode方法——创建文本
内容hello的文本节点成为p的一个子节点

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        window.onload = function () {
            var pa = document.createElement("p");
            var testdiv = document.getElementById("testdiv");
            testdiv.appendChild(pa);
            var txt = document.createTextNode("Hello!!");
            pa.appendChild(txt);
        }
    </script>
</head>
<body>
<div id="testdiv"></div>
</body>
</html>

在这里插入图片描述
上面还可以这么写

 <script>
        window.onload = function () {
            var pa = document.createElement("p");
            var txt = document.createTextNode("Hello!!");
            pa.appendChild(txt);
            var testdiv = document.getElementById("testdiv");
            testdiv.appendChild(pa);
        }
    </script>

三.重回图片库

展示动态创建HTML内容的使用案例

js中几个函数

  • addLoadEvent函数(通用型):
    把现有的window.onload事件处理函数的值存入变量oldonload。
    若在这个函数上还没绑定任何函数,则把新函数添加给他
    若在这个函数上已经绑定一些函数,则把新函数追加到现有指令的末尾

  • insertAfter函数(通用型):
    是辅助preparePlaceholder函数使用

  • preparePlaceholder函数:
    负责创建一个img和一个p元素,这个函数把新创建的元素插入到节点树里图片库清单的后面。

  • prepareGallery函数
    负责处理事件。这个函数将遍历图片库清单里的每个链接。

  • showPic
    当用户点击链接中的某个时,会调用showPic

动态的实现 就是在HTML文档中不再标记p 和img 占位符了
源代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style type="text/css">
        body{
            font-family: Arial, Helvetica, sans-serif;
            color: #333;
            margin: 1em 10%;
            background-color: #ccc;
        }
        h1{
            color: #333;
            background-color: transparent;
        }
        a{
            color: #c60;
            background-color: transparent;
            font-weight: bold;
            text-decoration: none;
        }
        ul{
            padding: 0;
        }
        li{
            float: left;
            padding: 1em;
            list-style: none;
        }
        img{
            width: 450px;
            display: block;
            clear: both;
        }
        #imagegallery{
            list-style: none;
        }
        #imagegallery li{
            /*用css将列表项纵向变横向*/
            display: inline;
        }
        #imagegallery li a img{
            border: 0;
        }
    </style>
</head>
<body>
<h1>Snapshots</h1>
<ul id="imagegallery">
    <li>
        <a href="../img/flower1.jpg" title="A Fireworks Display" >
            <img src="../img/flower1.jpg" alt="Fireworks" style="width: 80px">
        </a>
    </li>
    <li>
        <a href="../img/flower2.jpg" title="A cup of coffee">
            <img src="../img/flower2.jpg" alt="Coffee" style="width: 80px">
        </a>
    </li>
    <li>
        <a href="../img/flower4.jpeg" title="A red rose">
            <img src="../img/flower4.jpeg" alt="Rose" style="width: 80px">
        </a>
    </li>
    <li>
        <a href="../img/flower5.jpg" title="The Famous clock">
            <img src="../img/flower5.jpg" alt="Clock" style="width: 80px">
        </a>
    </li>
</ul>
<!--<img src="../img/timeqq.png" alt="my image gallery" id="placeholder">-->
<!--<p id="description">Choose an imag.</p>-->


<script>
    function addLoadEvent(func) {
        var oldonload = window.onload;
        if (typeof window.onload !='function'){
            window.onload = func;
        } else {
            window.onload = function () {
                oldonload();
                func();
            }
        }
    }

    function insertAfter(newElement,targetElement) {
        var parent = targetElement.parentNode;
        if (parent.lastChild==targetElement){
            parent.appendChild(newElement);
        } else {
            parent.insertBefore(newElement,targetElement.nextSibling);
        }
    }

    function preparePlaceholder() {
        if (!document.createElement) return false;
        if (!document.createTextNode) return false;
        if (!document.getElementById) return false;
        if (!document.getElementById("imagegallery")) return false;

        var placeholder = document.createElement("img");
        placeholder.setAttribute("id","placeholder");
        placeholder.setAttribute("src","../img/timeqq.png");
        placeholder.setAttribute("alt","my image gallery");
        var description = document.createElement("p");
        description.setAttribute("id","description");
        var desctext = document.createTextNode("Choose an image");
        description.appendChild(desctext);
        var gallery = document.getElementById("imagegallery");
        insertAfter(placeholder,gallery);//图片placeholder插到gallery后面
        insertAfter(description,placeholder);//文字description插到placeholder后面
    }

    function prepareGallery() {
        if (!document.getElementsByTagName) return false;
        if (!document.getElementById) return false;
        if (!document.getElementById("imagegallery")) return false;
        var gallery = document.getElementById("imagegallery");
        var links = gallery.getElementsByTagName("a");
        for (var i=0;i<links.length;i++){
            links[i].onclick = function () {
                return showPic(this);
            }
            links[i].onkeypress=links[i].onclick;
        }
    }


    function showPic(whichpic) {
        if (!document.getElementById("placeholder")) return true;
        var source = whichpic.getAttribute("href");
        var placeholder = document.getElementById("placeholder");
        placeholder.setAttribute("src", source);
        if (!document.getElementById("description")) return false;
        if (whichpic.getAttribute("title")) {
            var text = whichpic.getAttribute("title");
        } else {
                 var text = "";
             }
        //用一个变量存放description的文本p
        var description = document.getElementById("description");
        if (description.firstChild.nodeType == 3) {//nodeType属性检查返回一个大写字母的值
            //把链接title传给text变量
            description.firstChild.nodeValue = text;
        }
        return false;
    }

    addLoadEvent(prepareGallery);
    addLoadEvent(preparePlaceholder);
</script>
</body>
</html>

在这里插入图片描述
点击链接
在这里插入图片描述
在这里插入图片描述

四.Ajax

1.ajax主要优势:对页面的请求以异步方式发送到服务器。而服务器不会用整个页面来响应请求,他会在后台处理请求,同时用户还能继续浏览页面并与页面交互
好处:增强站点的可用性,用户不用刷新页面就能得到响应(减少重复加载页面的次数)
2.XMLHTTPRequest对象
其中重要方法:open()用来指定服务器上将要访问的文件,指定请求类型:GET,POST,SEND,这个方法的第三个参数用于指定请求是否以异步方式发送和处理
3.onreadystatechange是一个事件处理函数,会在服务器给XMLHTTPRequest对象送回响应时候被触发执行。
request.onreadystatechange = function(){}
onreadystatechange不要在函数名后面加括号。因为加括号表示立即执行函数而我们在此只想把函数本身的引用
4.readyState属性的值有5个可能得值:
0——未初始化
1——正在加载
2——加载完毕
3——正在交互
4——完成
当readyState=4就可以访问服务器发送回来的数据
访问服务器发送回来的数据要通过2个属性完成。一个responseText属性:保存文本字符串形式的数据。一个responseXML属性保存Content-Type头部中指定为:text/xml的数据。
5.异步请求
就是脚本在发送XMLHTTPRequest请求之后,仍然继续执行,不会等待响应返回。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    function getHTTPObject() {
        if (typeof XMLHttpRequest == "undefined")
            XMLHttpRequest=function () {
                try {return new ActiveXObject("Msxml2.XMLHTTP.6.0");}
                    catch (e) {

                    }
                try {return new ActiveXObject("Msxml2.XMLHTTP.3.0");}
                catch (e) {

                }
                try {return new ActiveXObject("Msxml2.XMLHTTP");}
                catch (e) {

                }
                return false;
            }
            return new XMLHttpRequest();
    }

    function getNewContent() {
        var request = getHTTPObject();
        if (request){
            request.open("GET","7.1innerHTML.html",true);
            request.onreadystatechange = function () {
                if (request.readyState==4){
                    var pa = document.createTextNode(request.responseText);
                    pa.appendChild(txt);
                    document.getElementById('new').appendChild(pa);
                }
            };
            request.send(null);
        } else {
            alert("sorry,your browser doesn't support XMLHttpRequest");
        }
    }

    function addLoadEvent(func) {
        var oldonload = window.onload;
        if (typeof window.onload !='function'){
            window.onload = func;
        } else {
            window.onload = function () {
                oldonload();
                func();
            }
        }
    }
    addLoadEvent(getNewContent);
</script>
</body>
</html>

第九章CSS-DOM

一.三位一体的网页

1.网页的结构层:HTML这样的标记语言负责创建
表示层:由css负责完成
行为层:JavaScript负责内容响应事件
2.使用HTML搭建文档的结构,css设置文档的呈现效果,DOM脚本实现文档的行为。三者存在潜在的重叠区域。

二.style属性

1.parentNode,nextSibling,previousSibling,childNodes,firstChild,lastChild这样的属性得到文档中各节点之间关系信息
2.获取样式element.style.color
style对象的属性的值必须放在引号里,单引号或双引号都可以

para.style.color='black';

什么时候用DOM脚本设置样式

1.用DOM找出文档中所有h1,然后找到他后面的元素给他添加样式
没有DOM操作的显示
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>CSS-DOM</h1>
<p>this first paragraph leads you in.</p>
<p>now you get the nitty-gritty of the story</p>
<p>the most important informatin is delivered first</p>
<h1>Extra!Extra!</h1>
<p>Further developments are unfolding</p>
<p>You can read all about it here!</p>
<script>
    function getNextElement(node) {
        if (node.nodeType == 1){
            return node;
        }
        if (node.nextSibling){
            return getNextElement(node.nextSibling);
        }
        return null;
    }

    function styleHeaderSiblings() {
        if (!document.getElementsByTagName) return false;
        var headers = document.getElementsByTagName("h1");
        var elem;
        for (var i=0;i<headers.length;i++){
            elem = getNextElement(headers[i].nextSibling);
            elem.style.fontWeight = "bold";
            elem.style.fontSize = "1.2em";
        }
    }

    function addLoadEvent(func) {
        var oldonload = window.onload;
        if (typeof window.onload !='function'){
            window.onload = func;
        } else {
            window.onload = function () {
                oldonload();
                func();
            }
        }
    }
    addLoadEvent(styleHeaderSiblings)
</script>
</body>
</html>

在这里插入图片描述

2.根据某种条件设置某种样式
表格型数据,把表格型数据转换为HTML内容的理想标签就是table

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body{
            font-family: Helvetica,Arial,sans-serif;
            background-color: #fff;
            color: #000;
        }
        table{
            margin: auto;
            border: 1px solid #699;
        }
        caption{
            margin: auto;
            padding: 0.2em;
            font-size: 1.2em;
            font-weight: bold;
        }
        th{
            font-weight: normal;
            font-style: italic;
            text-align: left;
            border: 1px solid #699;
            background-color: #9cc;
            color: #000;
        }
        th,td{
            width: 10em;
            padding: 0.5em;
        }
    </style>
</head>
<body>
<table>
    <caption>Itinerary</caption>
    <thead>
    <tr>
        <th>When</th>
        <th>Where</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>June 9th</td>
        <td>Portland,<abbr title="Oregon">OR</abbr></td>
    </tr>
    <tr>
        <td>June 10th</td>
        <td>Seattle,<abbr title="Washington">WA</abbr></td>
    </tr>
    <tr>
        <td>June 12th</td>
        <td>Sacramento,<abbr title="California">CA</abbr></td>
    </tr>
    <tr>
        <td>June 9th</td>
        <td>Portland,<abbr title="Oregon">OR</abbr></td>
    </tr>
    <tr>
        <td>June 10th</td>
        <td>Seattle,<abbr title="Washington">WA</abbr></td>
    </tr>
    <tr>
        <td>June 12th</td>
        <td>Sacramento,<abbr title="California">CA</abbr></td>
    </tr>
    </tbody>
</table>
</body>
</html>

在这里插入图片描述

  • JavaScript适合处理重复性任务。用while或for循环遍历一个很长列表。
    可以编写一个函数来为表格添加斑马线效果,只要隔行设置样式

  • 把文档的所有table元素找出来

  • 对每个table元素,创建odd(奇)变量并把他初始化为false

  • 遍历这个表格里所有数据行

  • 若变量odd的值是true,设置样式并把odd变量修改为false

  • 若odd值为false,不设置样式,但是odd修改为true

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body{
            font-family: Helvetica,Arial,sans-serif;
            background-color: #fff;
            color: #000;
        }
        table{
            margin: auto;
            border: 1px solid #699;
        }
        caption{
            margin: auto;
            padding: 0.2em;
            font-size: 1.2em;
            font-weight: bold;
        }
        th{
            font-weight: normal;
            font-style: italic;
            text-align: left;
            border: 1px solid #699;
            background-color: #9cc;
            color: #000;
        }
        th,td{
            width: 10em;
            padding: 0.5em;
        }
    </style>
</head>
<body>
<table>
    <caption>Itinerary</caption>
    <thead>
    <tr>
        <th>When</th>
        <th>Where</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>June 9th</td>
        <td>Portland,<abbr title="Oregon">OR</abbr></td>
    </tr>
    <tr>
        <td>June 10th</td>
        <td>Seattle,<abbr title="Washington">WA</abbr></td>
    </tr>
    <tr>
        <td>June 12th</td>
        <td>Sacramento,<abbr title="California">CA</abbr></td>
    </tr>
    <tr>
        <td>June 9th</td>
        <td>Portland,<abbr title="Oregon">OR</abbr></td>
    </tr>
    <tr>
        <td>June 10th</td>
        <td>Seattle,<abbr title="Washington">WA</abbr></td>
    </tr>
    <tr>
        <td>June 12th</td>
        <td>Sacramento,<abbr title="California">CA</abbr></td>
    </tr>
    </tbody>
</table>
<script>
    function stripeTables() {
        if (!document.getElementsByTagName) return false;
        var tables = document.getElementsByTagName("table");
        var odd,rows;
        for (var i=0;i<tables.length;i++){
            odd = false;
            rows = tables[i].getElementsByTagName("tr");
            for (var j=0;j<rows.length;j++){
                if (odd == true){
                    rows[j].style.backgroundColor = "#eee";
                    odd=false;
                } else{
                    odd=true;
                }
            }
        }
    }

    function addLoadEvent(func) {
        var oldonload = window.onload;
        if (typeof window.onload !='function'){
            window.onload = func;
        } else {
            window.onload = function () {
                oldonload();
                func();
            }
        }
    }
    addLoadEvent(stripeTables);
</script>
</body>
</html>

在这里插入图片描述

增加鼠标悬停效果

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body{
            font-family: Helvetica,Arial,sans-serif;
            background-color: #fff;
            color: #000;
        }
        table{
            margin: auto;
            border: 1px solid #699;
        }
        caption{
            margin: auto;
            padding: 0.2em;
            font-size: 1.2em;
            font-weight: bold;
        }
        th{
            font-weight: normal;
            font-style: italic;
            text-align: left;
            border: 1px solid #699;
            background-color: #9cc;
            color: #000;
        }
        th,td{
            width: 10em;
            padding: 0.5em;
        }
    </style>
</head>
<body>
<table>
    <caption>Itinerary</caption>
    <thead>
    <tr>
        <th>When</th>
        <th>Where</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>June 9th</td>
        <td>Portland,<abbr title="Oregon">OR</abbr></td>
    </tr>
    <tr>
        <td>June 10th</td>
        <td>Seattle,<abbr title="Washington">WA</abbr></td>
    </tr>
    <tr>
        <td>June 12th</td>
        <td>Sacramento,<abbr title="California">CA</abbr></td>
    </tr>
    <tr>
        <td>June 9th</td>
        <td>Portland,<abbr title="Oregon">OR</abbr></td>
    </tr>
    <tr>
        <td>June 10th</td>
        <td>Seattle,<abbr title="Washington">WA</abbr></td>
    </tr>
    <tr>
        <td>June 12th</td>
        <td>Sacramento,<abbr title="California">CA</abbr></td>
    </tr>
    </tbody>
</table>
<script>
    // 斑马线效果
    function stripeTables() {
        if (!document.getElementsByTagName) return false;
        var tables = document.getElementsByTagName("table");
        var odd,rows;
        for (var i=0;i<tables.length;i++){
            odd = false;
            rows = tables[i].getElementsByTagName("tr");
            for (var j=0;j<rows.length;j++){
                if (odd == true){
                    rows[j].style.backgroundColor = "#eee";
                    odd=false;
                } else{
                    odd=true;
                }
            }
        }
    }

    //鼠标悬停效果
    function highlightRows() {
        if (!document.getElementsByTagName) return false;
        var rows = document.getElementsByTagName("tr");
        for (var i=0;i<rows.length;i++){
            rows[i].onmouseover = function () {
                this.style.fontWeight = "bold";
            }
            rows[i].onmouseout = function () {
                this.style.fontWeight = "normal";
            }
        }
    }

    function addLoadEvent(func) {
        var oldonload = window.onload;
        if (typeof window.onload !='function'){
            window.onload = func;
        } else {
            window.onload = function () {
                oldonload();
                func();
            }
        }
    }


    addLoadEvent(stripeTables);
    addLoadEvent(highlightRows);
</script>
</body>
</html>

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41056807/article/details/84025807