js进阶
上篇博客提到js是纯oop思想的语言 也就是在使用js编程的时候注重的是:什么时候 什么东西 做什么。
之前提到Js一经加载会马上执行,如果我们要控制的对象在js代码的下面那么网页被打开时js会先被执行然后加载下面的html代码,当js被执行的时候,下面的html代码还没加载到,js控制的对象还没有存在于当前的页面这个时候js就会报错,提示找不到对象,根据这个原理呢,我们编写js代码的时候,要尽量把js代码写在html下面以确保所有的html代码全部被加载,而像一些自定义函数之类的js定义,则应该要写在html页面的最上面,比如<head>里面,以确保下面的js代码运行时可以找到这个自定义函数,之前说到了document对象,它是整个html文档对象,也是所有html对象的根源,因为所有的html代码都是写在页面内,不会写在页面的外面,我们想控制一个对象,就要得到代表这个对象的量,document最容易这个词就表示了这个量,但是,我们在实际效果中我们要控制的往往不是document本身,而是它里面的html元素,比如<div><input>之类的,为了方便的我们找到文档里的html元素,document给我们提供了两个常用的方法。
getElementById,getElementByTagName,这两个名字是区分大小写的,getElementByTagName可以让我们通过html标签名来找到这个html元素,getElementById可以通过我们定义的id来找到html元素,每个html元素都是一个对象,既然是对象就有自己的属性和方法,我们先说下document.getElementByTagName方法,这个可以通过标签名字找到,但一个html页面中往往不止一个叫这个名字的,所以这个方法会返回一个数组,数组中的每一个量就对应每一个用这个标签名的东西,下面实践一下,
<html> <body> <div>第一个</div> <div>第二个</div> <script type="text/javascript"> var divs = document.getElementsByTagName(‘div‘); alert(divs); </script> </body> </html>
返回值还是一个对象,那怎么证明是一个数组呢,统计下它有多少个索引就可以了,由于在js中每一个常规的量都是用对象的方法来表达,如果真是一个数组对象的话它就会知道自己哟多少个索引,也就是属性length alert(divs.length);结果弹出div的总数,这个就是数组的总数,php中我们知道数组由多个量组成的,由于getElementsByTagName方法会返回使用这个标签的所有对象,它只能用数组的形式给我们装回来,那要怎么读取其中一个量呢,和php是一样的用[] divs[0]就是取回第一个量 也就是页面中第一个使用这个标签的对象,之前提到凡是自身有属性,又可以再标记中写东西的html标签都是DOM对象,<标签 属性=属性值>内容</标签>凡是符合的都是DOM对象,那上面的标记的属性是否可以直接读取呢,对象.属性,用这种方法我们可以试一试,
<html> <body> <div align="center">第一个</div> <div>第二个</div> <script type="text/javascript"> var divs = document.getElementsByTagName(‘div‘); alert(divs[0].align); </script> </body> </html>
很显然是可以读取的 那么是否可以赋值呢?
alert(divs[0].align="right");可以看到产生的相应的变化,对于js和html来说这个很直观,如果要读取对象的内容,这意味着内容应该是一个属性,而不是方法,因为内容是名词 不是做什么(方法),DOM有两个属性表示内容,一个是innerHTML另一个是innerText,, innerHTML是指内容里的一切包含html代码在内,innerText只有文字,因为我们的html元素里面还可能嵌套额外的html标签,我们试一试,
<html> <body> <div align="center"><h1>第一个</h1></div> <div>第二个</div> <script type="text/javascript"> var divs = document.getElementsByTagName(‘div‘); alert(divs[0].innerHTML); </script> </body> </html>
下面说说DOM对象的getElementById 网页做大之后div可能很多,要一个一个去算是很累人的,getElementById,提供了这个便利,只要在html某个标签中指定一个id属性,就可以通过getElementById方法找到,
<html> <body> <div align="center"><h1>第一个</h1></div> <div id="two">第二个</div> <script type="text/javascript"> var divs = document.getElementById("two"); alert(divs.innerHTML); </script> </body> </html>
通过id找到对象然后打印对象的内容,相对getElementsByTagName是一种精确地查找,
如果说我们要找一个表单对象呢,比如<input type="text" name="username" id="username" />
在制作用户注册的时候 往往有多个表单元素要填写,如果填写错了一个提交了才发现就要全部重写了,最好的办法呢,是用户提交前知道那地方错了,这个时间的把握非常重要,也就是说这个js不是一开始就运行的,那什么时候运行呢,我们在填写一个表单的时候填写完之后,当表单按钮被点击的时候,点击和提交之间,例子如下:
<form> <input type="text" name="username" id="username" /> <input type="submit" id="b" value="提交" /> </form>
表单如上,上面说到点击的时候说明是点击事件onclick 我们首先找到它
var but = document.getElementById(‘b‘);
but.onclick=click;
然后给它的oncilck事件绑定一个方法,要检查的是username填写的名字,先找到它,
var inp = document.getElementById("username");这是一个input对象 填写东西是什么呢,这不是一个DOM对象,它没有innerText,input对象都有value属性 默认是空的,
<form> <input type="text" name="username" id="username" /> <input type="submit" id="b" value="提交" /> </form> <script type="text/javascript"> function onclick(){ var inp = document.getElementById("username"); var con = inp.value; alert(con); } var but = document.getElementById("b"); but.onclick=click(); </script>
找到会被点击的东西 然后给它的点击事件绑定click方法,click方法的任务是找到表单 然后读取它的值,最后弹出这个值
全部代码如下,
<html> <body> <div align="center"><h1>第一个</h1></div> <div id="two">第二个</div> <form> <input type="text" name="username" id="username" /> <input type="submit" id="b" value="提交" /> </form> <script type="text/javascript"> function click(){ var inp = document.getElementById("username"); var con = inp.value; if(con==‘‘) alert("用户名不能为空"); } var but = document.getElementById("b"); but.onclick=click; </script> </body> </html>
在此注意:but.onclick=click而不是but.onclick=click(),我换一种写法就会看懂了,在面向对象中由于有事件这一概念,而事件,要执行一个方法,或者说一个过程,更准确的表达代码如下
but.onclick= function(){
var inp = document.getElementById("username");
var con = inp.value;
if(con==‘‘)
alert("用户名不能为空");
}
把一个过程交给一个事件,或者如下写
var click= function(){
var inp = document.getElementById("username");
var con = inp.value;
if(con==‘‘)
alert("用户名不能为空");
}
这样写就清晰多了。
下面继续表单的问题,就是表单提交以后即使没有填写还是会被提交,因为submit的确被点击了,我们在此可以改成button,
<html> <body> <div align="center"><h1>第一个</h1></div> <div id="two">第二个</div> <form id=”form”> <input type="text" name="username" id="username" /> <input type="button" id="b" value="提交" /> </form> <script type="text/javascript"> function click(){ var inp = document.getElementById("username"); var con = inp.value; if(con==‘‘){ alert("用户名不能为空"); return false; } document.getElementById("form").submit(); } var but = document.getElementById("b"); but.onclick=click; </script> </body> </html>
当检查到用户名为空的时候,弹出一个提示框,然后用 return 返回,以中断自定义函数的执行。不然提示完了,下面的代码还是会被执行的。
return 在 PHP 里说过的,是返回值,在自定义函数中出现的时候,会中断自定义函数的执行,并返回 值。在这里,其实返回什么不重要,只是为了中断自定义函数而已。如果不想弹出提示框,同学们可以自行发挥想像力。比如,指定哪个对象,或者 div 显示什么。div 是 DOM 对象,innerHTML 属性,即然可以用于读出内容,当然也可以用于写入内容了。
下面说说子对象,
document.getElementById() 这个的意思是,在文档里找到这个ID。如果我不想在一个文档里找呢?我想在指定范围里找呢?
比如,一个 DIV 里面还有N个 DIV。或者,一个 <ul> 里的所有 li。这就涉及一个子对象的问题,对象里面还有对象。虽然可以给 ul 里的每个 li 都指定 ID ,但是太麻烦了。我们可以先找到这个 ul 再找里面的 li。
<ul id="list"> <li>第一个</li> <li>第二个</li> </ul>
要找到这个 ul 很容易,只要用 getElementById 就可以。
var list = document.getElementById("list");
之前说过,符合这个格式的,都是 DOM 对象。而 getElementById 和 getElementsByTagName 方法,都是 DOM 对象的方法。也就是说,只要是 DOM 对象,就可以用这个方法,而不是局限于 document。document 是整个文档对象,也只是一个对象。
var list = document.getElementById("list");
var lis = list.getElementsByTagName("li");
这样,我们就可以得到所有的 li 了,而且,只是这个 ul 里的。为了方便起见,我们可以连起来写。
var lis = document.getElementById("list").getElementsByTagName("li");
在文档里找到 list ,然后在里面找到所有 li。li 就是 ul 的子对象。
所有的 HTML 标签,都是 document 的子对象。如果把它们用一个量来表示,可以写成长长的一串。
document.body.ul.li……
之后,就看最后这个对象是什么对象了,都有什么方法和属性可供我们操作了。
最常用的子对象,呵呵,应该要算是 style 对象。CSS 样式对象。
style 在 标签里,看起来像是一个属性。
<div style="color:red;">
但是,JS 还是把它当成一个对象来理解,因为它里面还有更多的属性和值。虽然没有什么方法。所以,style 其实应该算是一个子对象。而且,通过 CSS 对象,我们可以实现的效果更多。凡是 CSS 可以定义的属性,都是 CSS 对象的属性。对应的值,就是属性值。
<div id="f" style="color:red;">红字</div>
alert(document.getElementById("f").style.color);
(文档中找到 f 对象)这是一个对象了。对象的.style 的 颜色。相对的,也可以给它赋值。
<body> <script> function color(c) { document.getElementById("f").style.color = c; } </script> <div id="f" style="color:red;">文字</div> <input type="button" value="红色" onclick="color(‘red‘);" /> <input type="button" value="绿色" onclick="color(‘green‘);" /> <input type="button" value="蓝色" onclick="color(‘blue‘);" /> </body>
当不同按钮点击的时候,我可以通过参数,传递进不同的值,然后赋值给 style 的 color,文字的颜色也会跟着改变。
当然了,如果我们指定是 CSS 的隐藏属性的话,呵呵。那它就会,显示,隐藏。以此类推,就看我们改变的是对象的哪一个 CSS 属性了。什么时候,改变了对象的,样式的,啥……
配合不同的事件,比如窗口大小变化,滚动条位置变化。
当滚动时,读取滚动条位置,计算出对应 DIV 绝对定位的 Top 值。可以做到,让一个 DIV 一直跟着滚动条走。最常见的就是飘浮在网页左右两边的广告条,就是用这个原理制作出来的。
说到底,JS 的熟悉程度,完全取决于你对 JS 的对象的了解程度。然后跟据不同对象的属性、方法,进行相应的计算、控制,就可以做出各种千变万化的“动态”网页效果了。比如,当鼠标悬停在某个对象上面的时候,另一个 DIV 的宽度就产生变化,或者高度。这个效果,就常见于各种 下拉菜单的制作,或者干脆隐藏/显示。