Alter the structure of web pages with JavaScript

Most of the DOM methods you‘ve seen so far are useful for identifying elements.

Both getElementById and getElementByTagName allow you to quickly and easily

target specific element nodes in a document.

These elements can then be manipulated using methods and properties like

setAttribute or nodeValue. Thats how the image gallery works.

As you can see, This is the way that the majority of JavaScript work. The structure of the web

page is created with markup. JavaScript is then used to change some of the details without

altering the underlying structure.

But it is also possible to use JavaScript to change the structure and contents of a web page.

There are some DOM methods that can alter the structure of a web page by creating new elements

and modifying existing ones.


A briefly review a couple techniques that developers have used in the past :

document.write && innerHTML

document.write :

The major drawback to using document.write is that it goes against the principle of unobtrusive JavaScript

innerHTML

The innerHTML property can be quite useful when you want a quick and easy way to insert a chunk of HTML into a

document. Unfortunately, innerHTML doesnt return any references to the content you insert .


DOM methods 

According to the DOM, a document is a tree of nodes. If you want to add to this tree, you need to insert new nodes.

If you want to add markup to a document, you need to insert element nodes.

createElement :

document.createElement( nodeName )

eg : var para = document.createElement( "p" );

appendChild :

The simplest way to insert a newly created node into the node tree of a document is to make it a child of an existing

node in the document .

parent.appendChild( child ) ;

eg :  var para = document.createElement("p");

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

testdiv.appendChild( para ) ;

createTextNode :

The node you have created is an empty paragraph element.

If you want to put some text into that paragraph, you need to create a text node

document.createTextNode( text );

eg :      var para = document.createElement("p");

var txt = document.createTextNode("Hello world");

para.appendChild( txt );

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

testdiv.appendChild( para );

Inserting a new element before an existing one :

There is a DOM method called insertBefore. you can use it to insert a new element before an existing element.

Here‘s the syntax :

parentElement.insertBefore ( newElement, targetElement )

eg :          var gellery = document.getElementById("imageallery") ;

gallery.parentNode.insertBefore(placeholder, gallery) ;

Inserting a new element after an existing one :

eg :

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

The next node after the target element is the nextSibling property of the target element.

You can use this script code in the furture as the expandtion.

Then follows the finished image gallery :

/***      index.html       ***/

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Image Gallery</title>
    <link rel="stylesheet" href="styles/layout.css" media="screen">
</head>
<body>

    <h1>Snapshiots</h1>
    <ul id="imagegallery">
        <li>
            <a href="images/fireworks.jpg" title="A fireworks display">
                <img src="images/thumbnail_fireworks.jpg" alt="Fireworks">
            </a>
        </li>
        <li>
            <a href="images/coffee.jpg" title="A cup of black coffe">
                <img src="images/thumbnail_coffee.jpg" alt="Coffee">
            </a>
        </li>
        <li>
            <a href="images/rose.jpg" title="A red, red rose">
                <img src="images/thumbnail_rose.jpg" alt="Rose">
            </a>
        </li>
        <li>
            <a href="images/bigben.jpg" title="The famous clock">
                <img src="images/thumbnail_bigben.jpg" alt="Big Ben">
            </a>
        </li>
    </ul>

    <script type="text/javascript" src="scripts/showPic.js"></script>
</body>
</html>

/***      showPic.js      ***/

/**
 * Created by Administrator on 9/9/2015.
 */

/*
 you can use this function to count how many children nodes the body element contains
 */
function countBodyChildren() {
    var body_element = document.getElementsByTagName("body")[0];
    alert(body_element.nodeType);
    alert( body_element.childNodes.length );
}

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", "images/placeholder.gif");
    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);
    insertAfter(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) ? false : true;
        }
    }
}

function showPic(whicPic) {
    if( !document.getElementsByTagName ) return false;
    if( !document.getElementById("placeholder") ) return false;

    var source = whicPic.getAttribute("href");
    var placeholder = document.getElementById("placeholder");
    placeholder.setAttribute("src", source);

    if(document.getElementById("description")) {
        var text = whicPic.getAttribute("title") ? whicPic.getAttribute("title") : 3;
        var description = document.getElementById("description");
        description.firstChild.nodeValue = text;
    }
    return true;
}

addLoadEvent( preparePlaceholder );
addLoadEvent( prepareGallery );

/***      layout.css      ***/

body{
    font-family: "Helvetica", "Arial", serif;
    color: #333;
    background-color: #ccc;
    margin: 1em 10%;
}

h1{
    color: #333;
    /*background-color: #777;*/
}

a{
    color: #c60;
    background-color: transparent;
    font-weight: bold;
    text-decoration: none;
}

ul{
    padding: 0;
}

li{
    float: left;
    padding: 1em;
    list-style: none;
}

img {
    display: block;
    clear: both;
}

时间: 2024-10-31 19:33:35

Alter the structure of web pages with JavaScript的相关文章

15款加速 Web 开发的 JavaScript 框架

JavaScript 可以通过多种方式来创建交互式的网站和 Web 应用程序.利用 JavaScript,可以让你移动 HTML 元素,创建各种各样的自定义动画,给你的访问者更好的终端用户体验. 对于开发人员你来说,有无数的 JavaScript 框架可选择,往往是很难选择最适合您需要的.所以在这篇文章中,我收集了15个有用的和流行的 JavaScript 框架,旨在简化前端应用程序开发. 您可能感兴趣的相关文章 期待已久的2013年度最佳 jQuery 插件揭晓 小伙伴们都惊呆了!8个超炫的

转:Generating PDFs from Web Pages on the Fly with jsPDF

The Portable Document Format has been one the major innovations in the fields of desktop publishing and office automations. It’s widely used in web publishing too, but unfortunately very often in wrong ways – like using it to replace contents that sh

Customizing Site-Wide Behavior for ASP.NET Web Pages (Razor) Sites

By Tom FitzMacken|February 17, 2014 This article explains how to make site-side settings for pages in an ASP.NET Web Pages (Razor) website. What you'll learn: How to run code that lets you set values (global values or helper settings) for all pages i

ASP.NET Web Pages (Razor) FAQ

By Tom FitzMacken|February 7, 2014 Print This article lists some frequently asked questions about ASP.NET Web Pages (Razor) and WebMatrix. Software versions used in the tutorial What's the difference between ASP.NET Web Pages, ASP.NET Web Forms, and

Web Pages razor 学习

1. Web Pages razor Web Pages 是三种 ASP.NET 编程模型中的一种,用于创建 ASP.NET 网站和 web 应用程序. 其他两种编程模型是 Web Forms 和 MVC (Model, View, Controller). Web Pages 是最简单的 ASP.NET 网页开发编程模型.它提供了一种简单的方法将 HTML.CSS.JavaScript 以及服务器代码结合起来: 易于学习.阅读和使用 围绕单一网页进行构建 类似 PHP 和 ASP 服务器脚本使

ASP.NET Web Pages (Razor) API Quick Reference

By Tom FitzMacken|February 10, 2014 Print This page contains a list with brief examples of the most commonly used objects, properties, and methods for programming ASP.NET Web Pages with Razor syntax. Descriptions marked with "(v2)" were introduc

[somewhat outdated] How Chromium Displays Web Pages: Bottom-to-top overview of how WebKit is embedded in Chromium

For Developers? > ?Design Documents? > ? How Chromium Displays Web Pages This document describes how web pages are displayed in Chromium from the bottom up. Be sure you have read the multi-process architecture design document. You will especially wa

IIS7下部署asp.net mvc及asp.net web pages的问题

在IIS7下部署asp.net mvc和asp.net web pages一不小心就会遇到文件找不到的错误,如下图所示: 发生这种问题的根本原因在于IIS7考虑了很多兼容性的东西,解决该问题的方法也很简单就是在配置文件中加入如下的配置项:   <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> </system.webServer>   同类型的问题有不少呢:

Web Pages - Efficient Paging Without The WebGrid

Web Pages - Efficient Paging Without The WebGrid If you want to display your data over a number of pages using WebMatrix Beta1, you have two options. One is to use the built-in paging support that comes with the WebGrid helper. But that means that yo