JavaScript动态创建DOM(七)

网友投稿 1075 2022-05-29

动态创建DOM

document.write只能在页面加载过程中才能动态创建。

可以调用document的createElement方法来创建具有指定标签的DOM对象,然后通过调用某个元素的appendChild();方法将新创建元素添加到相应的元素下。//父元素对象.removeChild(子元素对象);删除元素。

asdfasdf

aasdf

注:通过js动态创建的元素,直接  右键→查看源码是看不到的,需要通过“开发人员工具”才能看到。动态创建的控件,如果没有添加到文档中,则不能使用get...byid获取

innerText  innerHTML  value

value 获取表单元素的值

几乎所有DOM元素都有innerText、innerHTML属性(注意大小写),分别是元素标签内内容的文本表示形式和HTML源代码,这两个属性是可读可写的。//FF不支持innerText,在FF下用textContent属性。也可以用innerHTML设置普通文本。

示例: innerText与innerHTML区别。

北京欢迎你

客.net培训


用innerHTML也可以替代createElement,属于简单、粗放型、后果自负的创建。示例:

function createlink() {

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

divMain.innerHTML = "如鹏网";

}

案例:点击按钮动态增加网站列表,分两列,第一列为网站的名字,第二列为带网站超链接的网站名。增加三行常见网站。浏览器兼容性问题,见备注。动态产生的元素,查看源代码是看不到的。通过DebugBar→Dom→文档→HTML可以看到。

练习:动态生成n个文本框

北京欢迎你

fdhiusahfdoiuhwiohfoi

练习:无刷新评论。

北京欢迎你

猫猫:沙发耶!

昵称:


浏览器兼容性问题

和IE8不一样,用insertRow、insertCell来代替或者为表格添加tbody,然后向tbody中添加tr。FF不支持innerText。

所以动态加载网站列表的程序修改为:

var tr = tableLinks.insertRow(-1);//FF必须加-1这个参数,表追加。如果不是负数,则表示在某个索引之前插入。

var td1 = tr.insertCell(-1);

td1.innerText = key;

var td2 = tr.insertCell(-1);

td2.innerHTML = "" + value + "";

或者:(不建议)

,然后tableLinks. tBodies[0].appendChild(tr);

例:动态创建表格

0123456789

innerHTML还是操作Dom节点

操作页面的元素的时候是用innerHTML的方式还是createElement()、appendChild()与removeChild()的方式?

1.对于大量进行节点操作时,使用innerHTML的方式性能要好于频繁的Dom操作。

先将页面的HTML代码写好,然后调用一次innerHTML,而不要反复调用innerHTML.

2.对于使用innerHTML=‘’的方式来删除节点,在某些情况下会存在内存问题。比如:div下面有很多其他元素,每个元素都绑定有事件处理程序。此时,innerHTML只是把当前元素从节点树上移除了,但是那些事件处理程序依然占用内存。

代码是否需要放置到onload中

如果js代码需要操作页面上的元素,则将该代码放到onload里面。因为当页面加载完毕之后页面上才会有相关的元素

如果js代码中没有操作页面元素的语句,则可以将该代码直接写在

Js操作页面样式,其他

易错:修改元素的样式不是设置class属性,而是className属性。。(class是javaScript的一个保留字,属性不能用关键字、保留字所以就变成className了)案例:网页开关灯的效果。

修改元素的样式不能this.style="background-color:Red"。

易错:单独修改样式的属性使用“style.属性名”。注意在css中属性名在JavaScript中操作的时候属性名可能不一样,主要集中在那些属性名中含有-的属性,因为JavaScript中-是不能做属性、类名的。所以CSS中背景颜色是background-color,而JavaScript则是style. backgroundColor;元素样式名是class,在JavaScript中是className属性;font-size→style.fontSize;margin-top→style.marginTop //驼峰命名法。

单独修改控件的样式。技巧,没有文档的情况下的值属性名,随便给一个元素设定id,然后在js中就能id.style.出来能用的属性。

操作float样式的时候,IE与其他浏览器不太一样。IE:obj.style.styleFloat=‘right’;其他浏览器:obj.style.cssFloat=‘right’;//通用代码见备注1.

========================备注1==========================

var vv = document.getElementById('dv1');

if (typeof (vv.style.styleFloat) == 'string') {

vv.style.styleFloat = 'right';

} else {

vv.style.cssFloat = 'right';

}

案例1:创建三个输入文本框,当光标离开文本框的时候如果文本框为空,则将文本框背景色设置为红色,如果不为空则为白色。提示:焦点进入控件的事件是onfocus,焦点离开控件的事件是onblur。

0123456789

案例2:个td的时候,将这个td及之前的td背景变为红色,之后评分控件V1,用一个单行5列的Table做评分控件,监听td的click事件,点击一的td背景变为白色。鼠标在评分控件上的时候显示超链接形式的鼠标图标。。

评分控件好看版

练习1:超链接的单选效果。页还原为白色。参考:点击变“呜呜”。页面上若干个超链接,点击一个超链接的时候被点击的超链接变为红色背景,其他超链接背景没有变。window.event.returnValue=false;。难点“this”

选美女

练习2:点击按钮,表格隔行变色:偶数行为黄色背景,奇数行为默认颜色。通过table的getElementsByTagName取得所有的tr,依次遍历,如果是偶数就…………。

选美女

joijioijoijoijoij
huihoiuhihiuh
joijioijoijoijoij
huihoiuhihiuh
joijioijoijoijoij
huihoiuhihiuh

练习3:放若干文本框,获得焦点的文本框黄色背景,其他控件背景颜色是白色

思路1:监听所有input的onfocus事件→将背景设置为黄色,监听所有input的onblur事件→将背景设置为白色。思路2:只监听onfocus和练习1一样。

练习4:点击表格行,被点击的行高亮显示(背景是黄色),其他行白色背景。监听每个tr的onclick事件,将点击的背景设置为黄色,其他的设置为白色背景。//对于table、div、span这类型元素没有onfocus(获取焦点的事件(无法触发这些事件。))

练习5:图片浏览器。动态创建控件

设置div透明度

示例

透明层测试

控制层的显示

修改style.display,例子:切换层的显示

function togglediv() {

var div1 = document.getElementById('div1');

if (div1.style.display == '') {

div1.style.display = 'none';//不显示

}

else {

div1.style.display = '';//显示

}

}//与元素对象.enabled=true或readonly=true等不一样,这里是样式,不是元素的直接属性,不能用true或false。

案例:注册页面,点击“高级”CheckBox,则显示高级选项,否则隐藏。//动态创建层,移除。

案例:鼠标放到超链接上的时候显示一个图片或文字(放到div中。)

评分控件好看版

百度



谷歌



cnbeta



详细内容

动态设置元素的位置、大小

通过dom读取元素的top、left、width、height等取到的值不是数字,而是“10px”这样的字符串;为这些属性设值的时候IE可以是80、90这样的数字,FF、Chrome必须是“80px”、“90%”等这样的字符串形式,为了兼容统一用字符串形式。left/top需要设置position

易错:不要写成div1.style.width=80px,而是div1.style.width=‘80px’;例:

详细内容

如果要修改元素的大小(宽度加1),则首先要取出元素的宽度,然后用parseInt将宽度转换为数字(parseInt可以将“20px”这样数字开头的包含其他内容的字符串解析为20,parseInt(‘22px’,10),也就是解析尽可能多的部分);然后加上一个值,再加上px赋值回去。

案例:层的动态改变大小。setInterval();


AABB
CCDD

IE中body的事件范围

IE中如果在body上添加onclick、onmousemove等事件响应,那么如果页面没有满,则 “body 中最后一个元素以下(横向不限制)” 的部分是无法响应事件的,必须使用代码在document上监听那些事件,比如document.onmousemove = movePic

document.body.onmousedown=function(){}

document.onmousedown=function(){}

注意加文档定义与不加文档定义的也不一样。

如果为整个文档注册事件可以使用:document.onxxxx事件。

层的操作

元素的position 样式值:static(无定位,显示在默认位置)、absolute(绝对定位)、fixed(相对于窗口的固定定位,位置不会随着浏览器的滚动而变化,IE6不支持)、relative(相对元素默认位置的定位)。如果要通过代码修改元素的坐标则一般使用absolute,然后修改元素的top(上边缘距离)、左边缘距离)两个样式值。left、top都是指的层的左上角的坐标left(

案例:跟着鼠标飞的图片。提示:鼠标移动的事件是onmousemove(一边移动事件一边触发,而不是移动开始或者移动完成才触发),通过window.event的clientX、clientY属性获得鼠标的位置。

案例:鼠标放到一个超链接的时候,在鼠标的位置显示一个黄色背景,带图片的悬浮提示,鼠标离开就消失。提示:鼠标进入控件的事件是onmouseover,离开的事件是onmouseout。

baidu

案例:点击按钮层动态变大。提示:英文字母连续单词不会在中间自动换行的陷阱overflow、word-break: break-all;(查手册。)

哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈爱好哈哈哈哈哈哈哈哈哈哈哈哈哈

问题

易错:不要写成div1.style.width=80px,而是div1.style.width='80px'

修改元素的样式不能this.style="background-color:Red",哪怕可以的话也是把以前所有样式都冲掉了。单独修改控件的样式this.style. background='red',只修改要修改的样式。技巧,没有文档的情况下的值属性名,随便给一个元素设定id,然后在js中就能id.style.出来能用的属性。

createElement的两种用法,注意innerText的问题

var input = document.createElement(“”)快速创建元素,并且赋值,但是注意设置的inner部分不会被设置var link = document.createElement(“百度”)(“百度”二字写不进去)

label.setAttribute(“for”, “username”); //设定一些Dom元素属性名特殊的属性,label.for = “username”会有问题。label.setAttribute(“xuehao”,“33333”)//getAttribute(“name”)

案例练习

练习1:点击【登录】按钮,弹出一个显示用户名、密码等的层。将用户名、密码等写到一个层中,层默认是隐藏的,点击【登录】超链接以后将层显示出来,如果点击层中的关闭按钮,则隐藏层。绝对定位,显示到中间位置。document.body.clientWidth(获取页面的width)//高度,注意body的默认范围。(去掉





练习2:一幅图片。点击小图,弹出一个层在点击的位置显示小图对应的大图,并且显示姓名、、身高等信息,点击层中的关闭按钮关闭层。进阶:元素的额外属性。动画效果的显示出来。两种:静态;动态载入数据。

作业:评分控件V2。用一个单行5列的Table,td中默认都是https://www.huoban.com/news/zb_users/upload/2022/05/20220529095118_85206.jpg这个图片。监听td的mouseover事件,鼠标在一个td的时候将这个td及之前的td的内容换成starFill.jpg这个图片。鼠标在评分控件上的时候显示超链接形式的鼠标图标。获取td中的img见备注3。

案例:注册页面,点击“高级”CheckBox,则显示高级选项,否则隐藏

练习:界面上有几个球队名字的列表,将鼠标放到球队名字上就变为红色背景,其他球队背景颜色为白色,点击一个球队的时候就将点击的球队变为fontSize=30字体(fontSize=‘’回到默认)。Ul→li

  • 西施
  • 贵妃
  • 貂蝉
  • 昭君

练习:显示数字时钟,时间显示到一个div中。思路:setInterval()\innerHTMl

练习:有一个搜索文本框,焦点不在文本框中的时候,如果文本框没有值,则文本框中显示灰色文本(Gray)的“输入搜索关键词”,否则显示用户输入的值;焦点在文本框中时如果之前显示“输入搜索关键词”则清空文本框的值,并且将文本修改为黑色。onfocus的时候如果文本框中的值为“输入搜索关键词”,则清空文本框,并且恢复文本框的颜色为Black;onblur的时候如果文本框中没有值,则将文本框的值设置为“输入搜索关键词”并且文本框中显示灰色文本(Gray)style.color='Gray'。(五分钟)

form对象

document.getElementById(‘btn1’).click()。搜索引擎的,智能提示,点击后相当于点击了“搜索”按钮。

常用:click(),focus(),blur();//相当于通过程序来触发元素的单击、获得焦点以及失去焦点的事件。

form对象是表单的Dom对象。

方法:submit()提交表单,但是不会触发onsubmit事件。

实现autopost,也就是焦点离开控件以后页面立即提交,而不是只有提交submit按钮以后才提交,当光标离开的时候触发onblur事件,在onblur中调用form的submit方法。代码见备注。

在点击submit后form的onsubmit事件被触发,在onsubmit中可以进行数据校验,如果数据有问题,返回false即可取消提交

例:

不同浏览器的差异

面试题:说说开发项目的时候不同浏览器的不同点,你是怎么解决的?appendChild,insertCell,px

不同浏览器中对DOM支持的方法不一样

获取网页中那个元素触发了事件:在IE里使用srcElement ;在FireFox里使用target

使用Dom获取和更改网页标签元素内文本:在IE里使用innerText ;在FireFox里使用textContent

动态为网页或元素绑定事件:在IE中绑定事件的方法是attachEvent ;在FireFox中绑定事件的方法是addEventListener (类似于多播委托。使用该方法是还有一些其他的注意事项)

更多

FF与IE对javascript和CSS的区别

不同浏览器中对CSS的支持不一样,所以出现在IE中显示正常的网页,在FF下全部乱掉了。哀悼网页使用的CSS只有IE支持,FF都不支持。filter:gray;

JQuery之类的框架进行了封装,将不同浏览器的差异帮开发人员处理了,开发人员只要调用JQuery的方法,JQuery会帮助在不同浏览器中进行翻译。用JQuery就可以解决不同浏览器上Dom的不同。对于CSS的不同是美工的事,IETester、FF、Chrome。

JS中的正则表达式

JavaScript中创建正则表达式类的方法:

1.var regex = new RegExp("\\d{5}") 或者 2.var regex = / \d{5} /

/表达式/是JavaScript中专门为简化正则表达式编写而提供的语法,写在//中的正则表达式就不用管转义符了。

RegExp对象的方法:

(1)test(str)判断字符串str是否匹配正则表达式,相当于IsMatch

var regex = /.+@.+/;

alert(regex.test("a@b.com"));

alert(regex.test("ab.com"));

(2)exec(str)进行搜索匹配,返回值为匹配结果(*),相当于c#中match()和matches()

如果 exec() 找到了匹配的文本,则返回一个结果数组(完全匹配的字符串以及提取组的结果。)。否则,返回 null。 要提取多个需要反复调用exec()类似于matches()方法。//注意全局模式/…../g

在非全局模式下,调用一次exec()相当于match();在全局模式下连续多次调用相当于matches()

注:

RegExp 对象

RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。

直接量语法

/pattern/attributes 创建 RegExp 对象的语法:

new RegExp(pattern, attributes); 参数

参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。

参数 attributes 是一个可选的字符串,包含属性 “g”、“i” 和 “m”,分别用于指定全局匹配、忽略大小写的匹配和多行匹配。ECMAScript 标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。

返回值

一个新的 RegExp 对象,具有指定的模式和标志。如果参数 pattern 是正则表达式而不是字符串,那么 RegExp() 构造函数将用与指定的 RegExp 相同的模式和标志创建一个新的 RegExp 对象。

如果不用 new 运算符,而将 RegExp() 作为函数调用,那么它的行为与用 new 运算符调用时一样,只是当 pattern 是正则表达式时,它只返回 pattern,而不再创建一个新的 RegExp 对象。

exec() 方法的功能非常强大,它是一个通用的方法,而且使用起来也比 test() 方法以及支持正则表达式的 String 对象的方法更为复杂。

如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。我们可以看得出,在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用方法 String.match() 返回的数组是相同的。

但是,当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。

string的正则表达式方法

String对象中提供了一些与正则表达式相关的方法,相当于对于RegExp类的包装,简化调用:

match(regexp),非全局模式下相当于调用exec(),全局模式下相当于调用c#的matches(),返回数组中是所有的匹配结果(不包含提取组的信息)。

var s = "aaa@163.com";

var regex = /(.+)@(.+)/;

var match = s.match(regex);

alert(RegExp.$1 + ",服务器:" + RegExp.$2);

字符串.replace(/(正)则/g,”要替换的字符串$1”);//替换手机号码,只显示后4位。手机尾号为:*******1234

例:

var str = "15028008001";

alert(str.replace(/\d{7}/, "*******"));

练习:光标离开Email地址框的时候用正则表达式校验是否是合法的Email地址,如果不是的话Email地址框变红,并且注册按钮禁用,否则Email地址框颜色为白色,启用注册按钮。

练习:模拟Trim()方法

var str = '           aaaaaaaaaaa         ';

alert('---' + exTrim(str) + '-----');

function exTrim(s) {

return s.replace(/(^\s+)|(\s+$)/g, '');

}

=================高效===========================

String.prototype.trim = function () {

return this.replace(/^\s+/,'').replace(/\s+$/,'');

};

//不要写一个复杂的正则表达式,尤其是带或(|)的。尽量写简单的容易匹配的到的正则表达式,这样才高效。

练习:评估密码强度。

弱密码:只由数字、字母或其他符号中的一种组成。

中度密码:由数字、字母或其他字符中的两种组成。

强密码:由数字、字母或其他字符3种以上组成。

密码少于6位安全级别降1级

密码:

HTML、JS的压缩

HTML、JavaScript的压缩和混淆。去掉空格、缩短变量名,让js、html尺寸更小,提高下载速度。

HTML、JS压缩、混淆有动态和静态两种方案。HTML压缩器,比如HTML Compress,JavaScript压缩工具:Google Closure Compiler、YUI Compressor 、 JsPacker等。

很多js库都提供了.min.js、compress.js的压缩版本。gzip

1.安装jdk

2.配置环境变量(path)

3.开始压缩。

Js中的一些习惯与性能问题

1.声明变量要赋初值var n=10。

2.尽量避免直接声明全局变量,比如要声明全局变量name,但是它有可能与window.name冲突,所以全局变量一般都会声明在一个全局对象中:var itcast={name:’zxh’,num:10};使用这些全局变量的时候通过itcast.name或者itcast.num,就可以减少与系统的重名了。

3.当编写大量Js代码的时候难免会遇到命名冲突的问题,这时可以通过模拟命名空间的方式来避免命名冲突。例如:

var itcast={};

var itcast.net={};

var itcast.net.net0405={name:’zxh’,sayHi=function(){}};

4.尽量避免使用全局变量。(搜索全局变量时,会一层一层的搜索每个作用域范围,耗时,低效)

5.使用减值循环或者优化循环条件,不要在循环条件中写i

var arr = [3, 6, 9];

for (var i = 0, length = arr.length; i < length; i++)

{

alert(arr[i]);

}

6.避免使用eval(“alert(10);”);或setInterval(“myFunc();”,1000);这种双重解析的代码。低效!

7.使用原生的方法,比如内置的join()、reverse(),使用这些本来浏览器就有的方法不要自己写myJoin()之类的,性能低。原生方法都是用c或者c++写的,性能高。

8.尽可能使用switch来代替多个if-else

9.尽量减少语句数量:

用var n1=10,m=‘hello’,n2=true;而不是var n1=10;var m=‘hello’;var n2=true;

var arr=[1,2,’a’,true];

var p1={name:’zxh’,age:18};//创建对象

10.使用文档碎片,避免多次更新页面。

var fragment=document.createDocumentFragment();

案例1:回车实现Tab跳转。响应文本框的onKeyDown事件,window.event.keyCode获得用户点击的keyCode。(*)keyCode和ASCII不是完全一致,主键盘的1和小键盘的1的ASCII一样,但是keyCode不一样。详见备注。回车的keyCode为13,Tab的keyCode为9。if(window.event.keyCode == 13){window.event.keyCode = 9;}

只有少数的键才能被替换,大部分是不行的,有权限问题。

键盘码与ASCII码不一样。

注:ascii码说明:

8:退格键

46:delete

37-40: 方向键

48-57:小键盘区的数字

96-105:主键盘区的数字

110、190:小键盘区和主键盘区的小数点

189、109:小键盘区和主键盘区的负号




按下回车键,触发click事件

案例:实现省市选择界面。请选择省的处理,从后向前删。//document.getElementById(‘selCity’).innerHTML = ‘’;可删除select中的所有option.(或者通过while+firstChild方式删除,见备注1.)


练习:歌曲列表 (CheckBox+Label)全选、全不选、反选,只针对一个层中,div.getElementsByTagName("input"),再判断type='checkbox'的项,checked="checked"。if(cb.checked==“checked”){//用调试,期望的和实际的。在js中true和false,不要用checked=“checked”或disabled=“disabled”。Js与html代码不同。

练习:权限选择页面,选择、撤回、全部选择、全部撤回。代码参考“实现省市选择界面”,因为可能多选,判断选择项和单选的会有不同。不用写四个方法,两个方法就够了。(moveAll(arg1,arg2)、moveSelected(arg1,arg2))使用insertBefore(new,sel2.firstChilde)解决顺序问题。

案例代码阅读,模拟对话框。见备注(*)先创建一个满浏览器的层,设定透明度,有遮挡的效果,然后再创建一个层(ZIndex>遮挡层的ZIndex)显示对话框内容。

点击测试

HTML JavaScript

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:走近数据中心大二层网络
下一篇:几个小实践带你两天快速上手MindSpore(下)
相关文章