动态创建标记
代码真的是一个考验细致的东西,因为一个字母或者半个括号搞错了就会造成整个的代码的错误,而导致根本不显示已经加载了这个脚本。
这一章的代码由于中间出了一些问题,所以在找问题出在哪里时修改了不少已经写出来的部分,结果导致最后可以运行的代码跟书上不完全一样。
7.2
这部分所要实现的功能是利用脚本在HTML页面空白的一个div块里创建出一段文字。
HTML部分
<!DOCTYPE html>
<html lang = zh-cmn-Hans>
<head>
<meta charset = utf-8>
<title>
实验
</title>
<script type = 'text/javascript' src = 'demo.js'>
</script>
</head>
<body>
<div id = 'testdiv'>
</div>
</body>
</html>
7.2.3
单输出“Hello world”
JS部分
window.onload = function(){
var para = document.createElement('p');
var testdiv = document.getElementById('testdiv');
testdiv.appendChild(para);
var txt = document.createTextNode('Hello World');
para.appendChild(txt);
}
7.2.4
输出一段稍复杂的文字
JS部分
window.onload = function(){
var testdiv = document.getElementById('testdiv');
var para = document.createElement('p');
var txt1 = document.createTextNode('This is ');
var emphasis = document.createElement('em');
var txt2 = document.createTextNode('my');
var txt3 = document.createTextNode(' content.');
emphasis.appendChild(txt2);
para.appendChild(txt1);
para.appendChild(emphasis);
para.appendChild(txt3);
testdiv.appendChild(para);
} //动态创建一个<p>段落并输入文字
7.3
重回图片库,改进placeholder部分和description部分
HTML部分
<!DOCTYPE html>
<html lang = zh-cmn-Hans >
<head>
<meta charset = utf-8 />
<title>
JS图片库改进版
</title>
<link rel = 'stylesheet' href = 'styles/layout.css' media = 'screen' />
</head>
<body>
<h1>快照</h1>
<ul id = 'imagegallery'>
<li>
<a href = 'images/1.png' title = '第一张图片'>
<img src = 'images/1.png' alt = '第一张图片' />
</a>
</li>
<li>
<a href = 'images/2.jpg' title = '第二张图片'>
<img src = 'images/2.jpg' alt = '第二张图片' />
</a>
</li>
<li>
<a href = 'images/3.jpg' title = '第三张图片'>
<img src = 'images/3.jpg' alt = '第三张图片' />
</a>
</li>
<li>
<a href = 'images/4.png' title = '第四张图片'>
<img src = 'images/4.png' alt = '第四张图片' />
</a>
</li>
</ul>
<script type = 'text/javascript' src = '7-showPic.js'>
</script>
</body>
</html>
JS部分
unction showPic(whichpic) {
if (!document.getElementById('placeholder')) return false; //验证结束
var source = whichpic.getAttribute('href'); //得到此对象的href的值
var placeholder = document.getElementById('placeholder'); //找到placeholder
placeholder.setAttribute('src', source ); //修改placeholder的src值为之前找到的对象的href值
if (document.getElementById('description')){ //检查是否存在ID为description的元素
var text = whichpic.getAttribute('title'); //得到所点击对象的title的值
var description = document.getElementById('description'); //找到ID为description的那部分元素
description.firstChild.nodeValue = text; //description那部分的第一个元素的值修改为text的值
}
return true; //返回true,为prepareGallery函数做准备
}
function prepareGallery(){
if (!document.getElementsByTagName) return false;
if (!document.getElementById) return false;
if (!document.getElementById('imagegallery')) return false; //验证结束,下面开始添加每一个<li>里的<onclick>属性。
var gallery = document.getElementById('imagegallery'); //得到ID是imagegallery的所有元素
var links = gallery.getElementsByTagName('a'); //将imagegallery里的所有<a>元素提取出来
for (var i = 0; i < links.length; i++){
links[i].onclick = function(){
return !showPic(this); //巧妙的利用shiwPic返回的值
}
}
}
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'); //创建<img>标签,存储为placeholder
placeholder.setAttribute('id' , 'placeholder'); //在<img>里添加id属性
placeholder.setAttribute('src' , 'images/5.jpg'); //在<img>里添加src属性
placeholder.setAttribute('alt' , '图片展示位置'); //在<img>里添加alt属性
var description = document.createElement('p'); //创建<p>标签,存储为description
description.setAttribute('id' , 'description'); //在<p>里添加id属性
var desctext = document.createTextNode('选择一张图片'); //创建文本对象,预存储在desctext里
description.appendChild(desctext); //将desctext添加为description的一个子元素
var gallery = document.getElementById('imagegallery'); //找到ID为imagegallery的那部分元素,存储为gallery
insertAfter(placeholder , gallery); //将placeholder放在gallery里元素的后面
insertAfter(description , placeholder); //再将description放在placeholder的后面
}
function insertAfter(newElemment , targetElement){ //编写insertAfter函数
var parent = targetElement.parentNode;
if (parent.lastChild == targetElement){
parent.appendChild(newElemment);
}else{
parent.insertBefore(newElemment , targetElement.nextSibling);
}
}
function addLoadEvent(func){ //编写addLoadEvent函数
var oldonload = window.onload;
if (typeof window.onload != 'function'){
window.onload = func
}else{
window.onload = function(){
oldonload();
func();
}
}
}
addLoadEvent(preparePlaceholder);
addLoadEvent(prepareGallery);
麻烦的地方在于千万不能写成任何一个函数名或者符号或是单词,否则会导致整体的错误。
7.4
Ajax的函数没有成功运行,网上说Ajax的运行需要服务器环境(好像是这个意思),但是也不能排除是我的函数有出了问题。并且在最后书上也并没有写出最后版本的代码,尤其是几个小块的代码编写完成后有一些操作没有看懂。最后下载下来的官方代码压缩包里也没有找到这一小节的代码。
HTML部分
<!DOCTYPE html>
<html lang = zh-cmn-Hans >
<head>
<meta charset = utf-8 />
<title>
Ajax练习
</title>
</head>
<body>
<div id = 'new'></div>
<script scr = 'scripts/addLoadEvent.js'></script>
<script scr = 'scripts/getHTTPObject.js'></script>
<script scr = 'scripts/getNewContent.js'></script>
</body>
</html>
需在HTML文件所在的同一个文件夹里创建example.txt文件
This was loaded asynchronously!
addLoadEvent.js部分发JS代码为空
getHTTPObject.js部分JS代码为
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();
}
getNewContent部分JS代码为
function getNewContent(){
var request = getHTTPObject();
if (request){
request.open('GET', 'example.txt'; true);
request.onreadystatechange = function(){
if (request.readyState == 4){
alert('回复已被接受');
var para = document.createElement('p');
var txt = document.createTextNode(request.responseText);
para.appendChild(txt);
document.getElementById('new').appendChild(para);
}
};
request.send(null);
}else{
alert('sorry,your browser doesn\'t support MXLHttpResquest');
}
alert('函数加载完成');
}
addLoadEvent(getNewContent);