javascript dom编程艺术学习笔记之动态建立标记


[TOC]javascript


1.传统方法

1.1document.write

document对象的write方法能够方便便捷地把字符串插入文档 最大的缺点是违背了“行为与表现分离”的原则 容易致使验证错误 避免使用document.write方法css

1.2 innerHTML属性方法

如今包含到HTML5规范中,innerHTML毫无细节而言 DOM像手术刀,innerHTML像大锤 须要把一大段HTML内容插入网页,innerHTML属性更加使用。支持读取和写入 innerHTML属性比document.write更加值得推荐,它是HTML的专有属性,没法用于其余任何标记语言html

2. DOM方法

动态方法建立标记:你不是在建立标记,而是在改变节点树java

2.1 creatElemlent方法

语法以下node

document.creatElement(nodeName)

建立的元素已经存在,只是否是任何DOM节点树的组成部分,游荡在javascript世界的孤儿,称之为文档碎片浏览器

2.2 appendChild方法

让建立的元素成为父节点的子节点 语法以下服务器

parent.appendChild(child)

app

var para = document.creatElement("p");
var testdiv = getElementById("testdiv");
testdiv.appendChild(para);

等同于以下代码异步

document.getElementById("testdiv").appendChild(document.creatElement("p"));
2.3 creatTextNode方法

语法以下函数

document.creatTextNode(text);

window.onload = function(){
	var para = document.creatElement("p");
	var txt = document.creatTextNode("Hello world");
	para.appendChild(txt);
	var testdiv = getElementById("testdiv");
	testdiv.appendChild(para);
}
2.4更复杂的组合

3. 动态建立HTML内容

有一个图片和一段文字仅仅是为了showPic脚本服务的。既然这些元素存在是为了DOM服务的,用DOM的方法建立是最合适的选择

  • 建立img元素节点
  • 设置节点的id属性
  • 设置节点的src属性
  • 设置节点的alt属性
  • 建立p元素节点
  • 设置p的id属性
  • 建立文本节点
  • 把文本节点加到p上
  • 把p元素和img加入到文档
var placeholder = document.creatElement("img");
placeholder.setAttribute(id", "placeholder");
placeholder.setAttribute("src", "image/placeholder.gif");
placeholder.setAttribute("alt", "my image gallery");
var description = document.creatElement("p");
description.setAttribute("id", "description")
var desctext = document.creatTextNode("Choose an image");
description.appendChild(desctext);

插入文档,很凑巧图片清单恰好是文档最后一个元素

document.getElementByTagName("body")[0].appendChild(placeholder);
document.getElementByTagName("body")[0].appendChild(description);
3.1 在已有元素前插入一个元素

insertBefore()方法

  • 新元素:你想插入的元素(newElement)
  • 目标元素:要插哪一个元素以前(targetElement)
  • 父元素:目标元素的父元素(parentElement)

调用语法

parentElement.insertBefore(newElement, targetElement);

在使用中咱们没必要知道他的父元素是睡,由于targetElement的parentNode属性值就是

var gallery = document.getElementById("imagegallery");
gallery.parentNode.insertBefore(placeholder, gallery);

3.2 在已有元素后插入一个元素 insertAfter()方法 DOM自己并无提供insertAfter方法,咱们能够用已知DOM方法和属性编写方法

function insertAfter(newElement, targetElement){
	var parent = targetElement.parentNoder;
	if (parent.lastChilde == targetName){
		parent.appendChilde(newElement);
	}else {
		parent.insertBefore(newElement,targetname.nextSibling);
	}
}

最终javascript和html

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 = "";
  }
  var description = document.getElementById("description");
  if (description.firstChild.nodeType == 3) {
    description.firstChild.nodeValue = text;
  }
  return false;
}

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 addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}

function preparePlaceholder() {
  if (!document.createElement) return false;
  if (!document.createTextNode) 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");
  gallery.parentNode.insertBefore(placeholder,gallery);
  gallery.parentNode.insertBefore(description,gallery);
}

addLoadEvent(preparePlaceholder);
addLoadEvent(prepareGallery);

html清单

<!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  <title>Image Gallery</title>
	<script type="text/javascript" src="scripts/showPic.js"></script>
	<link rel="stylesheet" href="styles/layout.css" type="text/css" media="screen" />
</head>
<body>
  <h1>Snapshots</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 coffee" >
        <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>
</body>
</html>

4. Ajax

Ajax指异步加载页面技术 使用Ajax只更新页面一小部份内容,其余内容不用加载

4.1XMLHttpRequest对象

Ajax的核心技术就是XMLHttpRequest对象,充当着中间人的角色 微软最先在IE5中以ActiveX对象的形式实现一个名叫XMLHTTP的对象,IE建立新的对象要使用如下代码

var request = new ActiveXObject("Msxml2.XMLHTTP.3.0");

其余浏览器基于XMLHttpRequest来建立对象

var request = new XMLHttpRequest();

getHTTPObject函数

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;
		}
		retuen new XMLHttpRequest();
}

XMLHttpRequest对象有不少中方法。最有用的是open方法,指定服务器上要访问的文件。指定请求类型有GET,POST或SEND。第三个参数用于指定请求是否以异步方式发送和处理。 getNewContent函数

function getNewContent(){
	var request = getHTTPObject(){
	if (request){
		request.open("get", "exeample.txt", true);
		request.onreadystatechage = function(){
			if(request.readyState == 4)
			{
			var para = document.creatElement("p");
			var txt = document.creatTextNode("request.responseText");
			para.appendChild(txt);
			document.getElementById('new').appendChild(para)
			}
		    };
		    request.send(null);
		}else {
		alert('Sorry, your browser doesn\'t support XMLHttpRequest');
	}
}
addLoadEvent(getNewConent);

onreadystatechage是一个事件处理函数。它会在服务区XMLHttpRequest对象送回响应时被触发执行。在这个函数中根据服务器的响应作相应的处理。 也能够引用一个函数 浏览器会在不一样阶段更新readyState属性值

  • 0表示未初始化
  • 1表示正在加载
  • 2表示加载完毕
  • 3表示正在交互
  • 4表示完成 异步请求在发送XMLHttpRequest请求后,仍会继续执行 AJax的一些挑战
  • 与浏览器使用惯例冲突
  • 每次操做都应获得明确的结果,在响应时要给用户明确的提示
4.2Hijax

指渐进加强地使用Ajax 12章详细介绍如何使用Hijax技术

相关文章
相关标签/搜索