javascript基础

一、

<!– [endif]–>样式规则基本格式

<!– [if !supportLists]–>1)



<!– [endif]–>头样式

<script type=”text/javascript” src=”123.js”>
</script>

<!– [if !supportLists]–>二、

<!– [endif]–>基本概念

钩子:理解为元素的
ID CLASS
用于脚本对某元素的操作

结构:
getElementByID(‘’) getElementByTagName(‘’)

<!– [if !supportLists]–>三、

<!– [endif]–>基本语法

<!– [if !supportLists]–>1)



<!– [endif]–>基础知识:区分大小写、语句分号(
if
语句不加分好
单行
if
语句可不加{})

<!– [if !supportLists]–>2)



<!– [endif]–>变量:
弱类型
变量可以付任何类型
数字
字符等

<!– [if !supportLists]–>3)



<!– [endif]–>运算符

<!– [if !supportLists]–>4)



<!– [endif]–>表达式

<!– [if !supportLists]–>5)



<!– [endif]–>语句

<!– [if !supportLists]–>6)



<!– [endif]–>函数
functions addInput
(){}

<!– [if !supportLists]–>7)



<!– [endif]–>对象:
html
中的元素都被表示为一个对象

.
”表示引用对象的属性或方法



或者:对象
[‘
属性(或方法)
’]

<!– [if !supportLists]–>8)



<!– [endif]–>This
:在
script
中指代此函数中的元素(或称对象)

this.name

<!– [if !supportLists]–>四、

<!– [endif]–>Bom

<!– [if !supportLists]–>1.



<!– [endif]–>Window
对象:包含了窗口的全局变量、方法和对象
新的窗口有新的
window

窗口属性:
name

HTML
链接的
target
属性作引导还可以引导弹出窗口

<!– [if !supportLists]–>2.



<!– [endif]–>跨浏览器通信

打开弹出窗口:
window.open
(‘
url
’‘
name
’‘宽度,高度’)没有跨窗口通信

指向其他窗口:进行跨窗口通信的
window.open

重新建立联系:主窗口载入新页面

<!– [if !supportLists]–>3.



<!– [endif]–>导航

Lacation
:包含了页面的当前位置

URL
对象
URL
的属性
href
(地址属性)



hash

(锚点)如
a
标签

history
:显示过的页面
属性
back
()
forward
()如同浏览器的前进后退

<!– [if !supportLists]–>4.



<!– [endif]–>窗口几何学

Screen
对象:

窗口尺寸:见
p177

弹出对话框:
alert


文本信息


confirm


文本信息


prompt
(‘文本信息’)

setTimeout(‘
函数

,‘时间’
)
:设定函数自动运行时间

clearTimeout

()取消

<!– [if !supportLists]–>5.



<!– [endif]–>document
对象

写入方法:
document.write
(‘
<h1>Hello world!</h1>
’)

Open
()与
close
():打开关闭网页

<!– [if !supportLists]–>6.



<!– [endif]–>cookie

设置
cookie

document.cookie=’testcookie=yes;

expires=Tue,23
Jan 2007 13:12:12 utc


path=/;domain=quirksmode.org’;
(


/
值对
) (
有效时间
)(
路径
)(
页面所处域
)

<!– [if !supportLists]–>五、

<!– [endif]–>事件

<!– [if !supportLists]–>1.



<!– [endif]–>事件

鼠标事件:
click(
单击
)dblclick
(双击)
mousedown
(按下鼠标)
mousemove
(鼠标移动)
mouseout
(鼠标移开)
mouseover
(鼠标移至)
mouseup
(松开鼠标)

键盘事件:
keyup
释放按键
keypress

keydown
按住

接口事件:


blur


focus
:失去或得到焦点


change

:表单和下拉菜单


load


unload
页面完全加载
和释放时


reset


submit
重置发送表单事件


resize

改变窗口大小


scroll

滚动模块内容时

<!– [if !supportLists]–>2.



<!– [endif]–>注册时间处理器:选中元素运行哪个函数

行内事件处理程序(违反结构与行为分离)

传统模式:
x.
方法
=
函数(缺点:设置多个方法,最后的会覆盖前一个)

W3c
模型:
x.addEventListener
(‘方法’,函数,
false

;


x.removeEventListener(‘

方法

,函数,
false)

微软:
x.attachEvent
(‘方法’,函数);


x.detachEvent

(‘方法’函数);

移除事件:
w3c
对象
.removeEventListener(‘
方法
’,
函数
,false)


微软
对象
.detachEvent(‘
方法
’,
函数
)

w3c
与微软兼容:条件语句

if
(对象
.addEventListener



对象
.addEventListener( ………)

Else if(
对象
.attachEvent)



对象
.attachEvent(……..)

<!– [if !supportLists]–>3.



<!– [endif]–>事件对象被执行顺序

冒泡:元素被触发的顺序是从选中元素往外
事件注册里的
false

捕获:元素被书法的顺序是从
document
直到事件目标。。。。
true

注:冒泡
change submit
不会在
document
window

上出发

取消时间传播:
if(
对象
.stopPropagation)

对象
.stopPropagation();
//w3c

对象
.cancelBubble=true;
//

微软

<!– [if !supportLists]–>4.



<!– [endif]–>事件对象和它的属性

1.Event
对象:时间对象
document
如何被传入函数


function

函数
( e){

var
变量
=e||window.event

注:
W3C
用参数
e
微软用
window.event

2.
事件对象属性:

this
的引用:
this
总指向你在其上定义
的事件处理元素



一般用注册同样事件处理程序到许多元素时

target

srcElement
属性指向产生事件的元素(如鼠标划过的元素



当依赖于冒泡事件使得事件往上传播的时候

<!– [if !supportLists]–>六、

<!– [endif]–>DOM

<!– [if !supportLists]–>1.



<!– [endif]–>节点

节点类型:
document
文档节点、文字是文本节点、元素节点

长途寻找元素:
getElementById() getElementByTagName()
返回节点列表对象


getElementByTagName()[]

节点别表中某个节点
0
表示
1
节点。。。。。。

短途寻找元素:
parentNode
父节点
firstChild
子一节点
lastChild
子末节点


PreviousSibling

兄弟上节点
nextSibling
兄弟下节点

<!– [if !supportLists]–>2.



<!– [endif]–>节点信息

nodeName:
节点的名称,即元素名称。当作属性名来用即
变量
.nodeName

nodeValue
:包含文本节点的内容。而对文档节点和元素节点不可用。

nodeType
:节点类型

文档节点
元素几点
文本节点。

<!– [if !supportLists]–>3.



<!– [endif]–>修改文档树

节点
.appendChild(
被添加节点
)
添加某个节点到改元素的子末节点
若被添加节点已在文档中,则从当前位置移除并移动到新位置。此方法可以作为变量的引用如

var
变量
=
节点
.appendChild(0)

节点
.insertBefore(
被添加节点
)
添加节点到某个节点的前面。其他如上

节点
.removeChild(
被添加节点
)
移除一个节点和他的子节点。

节点
.replaceChild(
被交换节点,被交换节点
)

<!– [if !supportLists]–>4.



<!– [endif]–>创建和克隆元素

Var
变量
=document.createElement(‘p’)
创建
p
标签

Var
变量
=document.createTextNode(‘this is
a create element’)

创建文本节点

创建的这些节点将有上节所讲内容插入到文档中

Var
变量
=
节点
.cloneNode(true

false)
克隆节点
true
表示也克隆所有子节点

<!– [if !supportLists]–>5.



<!– [endif]–>创建的表格应该放在
<tbody></tbody>

这样才能显示出来

innerHTML
属性显示元素中的内容如
p.innerHTML

<!– [if !supportLists]–>6.



<!– [endif]–>属性的读写

元素
.getAttribute(‘
属性名
’)
返回属性值

元素
.setAttribute(‘
属性名

,‘参数’
)

<!– [if !supportLists]–>七、

<!– [endif]–>核心

关联数组
变量
[]
其中放入的是字符串所引用的属性在
[‘’]
中的则是直接引用的属性前提是
[‘’]
必须是属性名而不能是引用改属性的字符串

<!– [if !supportLists]–>八、

<!– [endif]–>CSS
修改

<!– [if !supportLists]–>1.



<!– [endif]–>style
属性:元素的样式属性

元素
.style.margin

样式表中的

表示:如
font-size

script
中为
fontSize

单位:设置某个样式属性必须加上单位

xx.style.width=width+’px’;

<!– [if !supportLists]–>2.



<!– [endif]–>获取样式:元素
.currentStyle.
样式属性(如
color

<!– [if !supportLists]–>3.



<!– [endif]–>更改
class

id

<!– [if !supportLists]–>1)



<!– [endif]–>通过更改
class

id
更改为预先建立的样式的从而改变样式表。


格式如:
document.getElementById(‘text’).className=’class’

<!– [if !supportLists]–>2)



<!– [endif]–>增加
class

增加
class
是在原有
class
样式上在加上新加
class
的样式

格式如:
xx.className+=

newclassname’
空格必加

<!– [if !supportLists]–>3)



<!– [endif]–>移除
class

xx.className=xx.className.replace(/
newclassname/,’’);

吧以前的
newclassname
替换为空字符从而移除
class

<!– [if !supportLists]–>4.



<!– [endif]–>向页面中写入
css
和更改整个样式表(暂不了解)

<!– [if !supportLists]–>九、

<!– [endif]–>数据类型:串
(string)

数组(
array

<!– [if gte vml 1]><v:line id=”_x0000_s1026″
style=’position:absolute;left:0;text-align:left;z-index:1′ from=”117pt,7.8pt”
to=”2in,7.8pt”/><![endif]–><!– [if !vml]–>
<!– [endif]–><!– [if gte vml 1]><v:line id=”_x0000_s1027″
style=’position:absolute;left:0;text-align:left;flip:y;z-index:2′ from=”117pt,7.8pt”
to=”2in,23.4pt”/><![endif]–><!– [if !vml]–>
<!– [endif]–>
BOM:Browser

object

model


DOM:Document

 

joomla1.5——JDocument类用法

文档类,提供一个容易的接口解析和显示文件 

       

Method        Description

__construct        构造函数

addScript        增加一个连接到页

addScriptDeclaration        增加脚本到页

addStyleDeclaration        增加一个stylesheet声明到页

addStyleSheet        增加一连接的stylesheet到页

getBase        返回本文的基本URI

getBuffer        得到本文缓冲的内容

getCharset        返回本文charset 内码

getDescription        返回页的标题

getDirection        返回文件语言

getGenerator        返回文档创建者

getHeadData        得到本文头数据

getInstance        返回在全局 JDocument对象

getLanguage        得到语言.

getLink        得到文档的URL

getMetaData        得到meta标签

getTitle        得到文档标题

getType        得到文档类型

loadRenderer        随机装载

render        输出文档

setBase        设置文档的e基本URI

setBuffer        设置本文缓冲的内容

setCharset        设置本文charset

setDescription        设置本文的描述

setDirection         设置全局文件声明。 缺省左到右(ltr)。 

setGenerator        设置文本创建者

setHeadData        设置文本头信息

setLanguage        设置语言.

setLineEnd         设置线结尾样式对Windows、Mac、Unix或者自定义串。 

setLink        设置文档链接

setMetaData        设置metai标签

setMimeEncoding        设置被送到浏览器的本文MIME内码

setModifiedData        定本文修改过的日期

setTab        设置串被用于内嵌HTML

setTitle        设置文档标题

setType        设置文档类型.

方法应用:

addScript()

        意义:增加一个连接到页

        语法:void addScript (string $url, [string $type = “text/javascript”])

                string $url: URL to the linked script

                string $type: Type of script. Defaults to ‘text/javascript’

        实际应用:

        $temp =& Jfactory::getDocument();

        $temp->addscript(JURI::base().’includes/js/overlib_mini.js’);

        结果:在head部分插入一段js

addScriptDeclaration()

        意义:增加脚本到页头

        语法:void addScriptDeclaration (string $content, [string $type = ‘text/javascript’])

                string $content: Script

                string $type: Scripting mime (defaults to ‘text/javascript’)

        实际应用:

        $temp =& Jfactory::getDocument();

        $script = “alert( ‘A script has been added to the page!’ );”;

        $temp->addScriptDeclaration($scirpt);

getBase()

        意义:返回本文的基本URI

        语法:string getBase ()

        实际应用:

        $temp =& Jfactory::getDocument();

        echo $temp->getBase();

getBuffer()

        意义:得到本文缓冲的内容

        语法: getBuffer ()

        实际应用:

        $temp =& Jfactory::getDocument();

        echo $temp->getBuffer();

getInstance()

        意义:返回在全局JDocument对象

        语法:object The &getInstance ([type $type = ‘html’], [ $attributes = array()])

                type $type: The document type to instantiate

                $attributes

        实际应用:

        $temp =& Jfactory::getDocument();

        $temp->getInstance(‘html’); //生成jdocumenthtml对象.

        $temp->getInstance(‘error’);//生成 jdocumenterror对象.

        $temp->getInstance(‘feed’);//生成 jdocumentfeed对象.

       

setBuffer()

        意义:设置本文缓冲的内容

        语法:void setBuffer (string $content)

                string $content: The content to be set in the buffer

        实际应用:

        $temp =& Jfactory::getDocument();

        echo $temp->setBuffer();

setDirection()

        意义: 设置全局文件声明。 缺省左到右(ltr)。 

        语法:void setDirection ([ $dir = “ltr”], string $lang)

                string $lang

                $dir

        实际应用:

        $temp =& Jfactory::getDocument();

        echo $temp->setDirection();

setGenerator()

        意义: 设置文本创建者

        语法:void setGenerator (string $generator)

                string $generator

        实际应用:

        $temp =& Jfactory::getDocument();

        echo $temp->setGenerator();

setHeadData()

        意义: 设置文本头信息

        语法:void setHeadData (array $data)

                array $data: The document head data in array form

        实际应用:

        $temp =& Jfactory::getDocument();

        echo $temp->setHeadData();

setLanguage()

        意义: 设置语言

        语法:void setLanguage ([string $lang = “en-gb”])

                string $lang

        实际应用:

        $temp =& Jfactory::getDocument();

        echo $temp->setLanguage();

setLineEnd()

        意义: 设置线结尾样式对Windows、Mac、Unix或者自定义串。

        语法:void setLineEnd (string $style)

                string $style: “win”, “mac”, “unix” or custom string.

        实际应用:

        $temp =& Jfactory::getDocument();

        echo $temp->setLineEnd();

setLink()

        意义: 设置文档链接

        语法:void setLink (string $url)

                string $url: A url

        实际应用:

        $temp =& Jfactory::getDocument();

        $link=”www.joomla.org”;

        $temp->setLink($link);

setMetaData()

        意义: 设置meta标签

        语法:void setMetaData (string $name, string $content, [bool $http_equiv = false])

                string $name: Value of name or http-equiv tag

                string $content: Value of the content tag

                bool $http_equiv: META type “http-equiv” defaults to null

        实际应用:

        $temp =& Jfactory::getDocument();

        $temp->setMetaData(‘Publisher’, ‘joomla! Documentation Team!’);

        result:

        <meta name=”Publisher” content=”Joomla! Documentation Team” />

setMimeEncoding()

        意义: 设置被送到浏览器的本文MIME内码

        语法:void setMimeEncoding ([string $type = ‘text/html’])

                string $type.

        实际应用:

        $temp =& Jfactory::getDocument();

        $temp->setMimrEncoding(‘application/xml’));

setModifiedDate()

        意义: 定本文修改过的日期

        语法:void setModifiedDate (string $date)

                string $date

        实际应用:

        $temp =& Jfactory::getDocument();

        $temp->setModifiedDate($date));

跨域资源共享的10种方式

在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义。同 源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法。那么什么叫相同域,什么叫不同的域呢?

同源策略

在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义。同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法。那么什么叫相同域,什么叫不同的域呢?当两个域具有相同的协议(如http), 相同的端口(如80),相同的host(如www.example.org),那么我们就可以认为它们是相同的域。比如http://www.example.org/index.html和http://www.example.org/sub/index.html是同域,而http://www.example.org, https://www.example.org, http://www.example.org:8080, http://sub.example.org中的任何两个都将构成跨域。同源策略还应该对一些特殊情况做处理,比如限制file协议下脚本的访问权限。本地的HTML文件在浏览器中是通过file协议打开的,如果脚本能通过file协议访问到硬盘上其它任意文件,就会出现安全隐患,目前IE8还有这样的隐患。

受到同源策略的影响,跨域资源共享就会受到制约。但是随着人们的实践和浏览器的进步,目前在跨域请求的技巧上,有很多宝贵经验的沉淀和积累。这里我把跨域资源共享分成两种,一种是单向的数据请求,还有一种是双向的消息通信。接下来我将罗列出常见的一些跨域方式,以下跨域实例的源代码可以从这里获得

单向跨域

JSONP

JSONP (JSON with Padding)是一个简单高效的跨域方式,HTML中的script标签可以加载并执行其他域的JavaScript,于是我们可以通过script标记来动态加载其他域的资源。例如我要从域A的页面pageA加载域B的数据,那么在域B的页面pageB中我以JavaScript的形式声明pageA需要的数据,然后在pageA中用script标签把pageB加载进来,那么pageB中的脚本就会得以执行。JSONP在此基础上加入了回调函数,pageB加载完之后会执行pageA中定义的函数,所需要的数据会以参数的形式传递给该函数。JSONP易于实现,但是也会存在一些安全隐患,如果第三方的脚本随意地执行,那么它就可以篡改页面内容,截获敏感数据。但是在受信任的双方传递数据,JSONP是非常合适的选择。

flash URLLoader

flash有自己的一套安全策略,服务器可以通过crossdomain.xml文件来声明能被哪些域的SWF文件访问,SWF也可以通过API来确定自身能被哪些域的SWF加载。当跨域访问资源时,例如从域www.a.com请求域www.b.com上的数据,我们可以借助flash来发送HTTP请求。首先,修改域www.b.com上的crossdomain.xml(一般存放在根目录,如果没有需要手动创建) ,把www.a.com加入到白名单。其次,通过Flash URLLoader发送HTTP请求,最后,通过Flash API把响应结果传递给JavaScript。Flash URLLoader是一种很普遍的跨域解决方案,不过需要支持iOS的话,这个方案就无能为力了。

Access Control

Access Control是比较超越的跨域方式,目前只在很少的浏览器中得以支持,这些浏览器可以发送一个跨域的HTTP请求(Firefox, Google Chrome等通过XMLHTTPRequest实现,IE8下通过XDomainRequest实现),请求的响应必须包含一个Access-Control-Allow-Origin的HTTP响应头,该响应头声明了请求域的可访问权限。例如www.a.com对www.b.com下的asset.php发送了一个跨域的HTTP请求,那么asset.php必须加入如下的响应头:

header("Access-Control-Allow-Origin: http://www.a.com");

window.name

window对象的name属性是一个很特别的属性,当该window的location变化,然后重新加载,它的name属性可以依然保持不变。那么我们可以在页面A中用iframe加载其他域的页面B,而页面B中用JavaScript把需要传递的数据赋值给window.name,iframe加载完成之后,页面A修改iframe的地址,将其变成同域的一个地址,然后就可以读出window.name的值了。这个方式非常适合单向的数据请求,而且协议简单、安全。不会像JSONP那样不做限制地执行外部脚本。

server proxy

在数据提供方没有提供对JSONP协议或者window.name协议的支持,也没有对其它域开放访问权限时,我们可以通过server proxy的方式来抓取数据。例如当www.a.com域下的页面需要请求www.b.com下的资源文件asset.txt时,直接发送一个指向www.b.com/asset.txt的Ajax请求肯定是会被浏览器阻止。这时,我们在www.a.com下配一个代理,然后把Ajax请求绑定到这个代理路径下,例如www.a.com/proxy/, 然后这个代理发送HTTP请求访问www.b.com下的asset.txt,跨域的HTTP请求是在服务器端进行的,客户端并没有产生跨域的Ajax请求。这个跨域方式不需要和目标资源签订协议,带有侵略性,另外需要注意的是实践中应该对这个代理实施一定程度的保护,比如限制他人使用或者使用频率。

双向跨域

document.domain

通过修改document的domain属性,我们可以在域和子域或者不同的子域之间通信。同域策略认为域和子域隶属于不同的域,比如www.a.com和sub.a.com是不同的域,这时,我们无法在www.a.com下的页面中调用sub.a.com中定义的JavaScript方法。但是当我们把它们document的domain属性都修改为a.com,浏览器就会认为它们处于同一个域下,那么我们就可以互相调用对方的method来通信了。

FIM – Fragment Identitier Messaging

不同的域之间,JavaScript只能做很有限的访问和操作,其实我们利用这些有限的访问权限就可以达到跨域通信的目的了。FIM (Fragment Identitier Messaging)就是在这个大前提下被发明的。父窗口可以对iframe进行URL读写,iframe也可以读写父窗口的URL,URL有一部分被称为frag,就是#号及其后面的字符,它一般用于浏览器锚点定位,Server端并不关心这部分,应该说HTTP请求过程中不会携带frag,所以这部分的修改不会产生HTTP请求,但是会产生浏览器历史记录。FIM的原理就是改变URL的frag部分来进行双向通信。每个window通过改变其他window的location来发送消息,并通过监听自己的URL的变化来接收消息。这个方式的通信会造成一些不必要的浏览器历史记录,而且有些浏览器不支持onhashchange事件,需要轮询来获知URL的改变,最后,URL在浏览器下有长度限制,这个制约了每次传送的数据量。

Flash LocalConnection

页面上的双向通信也可以通过Flash来解决,Flash API中有LocalConnection这个类,该类允许两个SWF之间通过进程通信,这时SWF可以播放在独立的Flash Player或者AIR中,也可以嵌在HTML页面或者是PDF中。遵循这个通信原则,我们可以在不同域的HTML页面各自嵌套一个SWF来达到相互传递数据的目的了。SWF通过LocalConnection交换数据是很快的,但是每次的数据量有40kb的大小限制。用这种方式来跨域通信过于复杂,而且需要了2个SWF文件,实用性不强。

window.postMessage

window.postMessage是HTML5定义的一个很新的方法,这个方法可以很方便地跨window通信。由于它是一个很新的方法,所以在很旧和比较旧的浏览器中都无法使用。

Cross Frame

Cross Frame是FIM的一个变种,它借助了一个空白的iframe,不会产生多余的浏览器历史记录,也不需要轮询URL的改变,在可用性和性能上都做了很大的改观。它的基本原理大致是这样的,假设在域www.a.com上有页面A.html和一个空白代理页面proxyA.html, 另一个域www.b.com上有个页面B.html和一个空白代理页面proxyB.html,A.html需要向B.html中发送消息时,页面会创建一个隐藏的iframe, iframe的src指向proxyB.html并把message作为URL frag,由于B.html和proxyB.html是同域,所以在iframe加载完成之后,B.html可以获得iframe的URL,然后解析出message,并移除该iframe。当B.html需要向A.html发送消息时,原理一样。Cross Frame是很好的双向通信方式,而且安全高效,但是它在Opera中无法使用,不过在Opera下面我们可以使用更简单的window.postMessage来代替。

firebug调试

Javascript的调试利器:Firebug使用详解
Posted 星期日, 12/09/2007 – 02:09 by ppkosd

Javascript 的调试,是开发Web应用尤其是AJAX应用很重要的一环,目前对Javascript进行调试的工具很多,我比较喜欢使用的是Firebug。 Firebug是Joe Hewitt开发的一套与Firefox集成在一起的功能强大的web开发工具,可以实时编辑、调试和监测任何页面的CSS、HTML和 JavaScript。
本文主要是为初学者介绍一下Firebug的基本功能与如何使用Firebug。由于本人水平与能力有限,在文章中的可能会有很多错误与遗漏,希望大家能谅解和指正!

<!–[if !supportLists]–>1、 <!–[endif]–>安装
Firebug是与Firefox集成的,所以我们首先要安装的事 Firefox浏览器。安装好浏览器后,打开浏览器,选择菜单栏上的“工具”菜单,选择“附加软件”,在弹出窗口中点击右下角的“获取扩展”链接。在打开的页面的search输入框中输入“firebug”。等搜索结果出来后点击Firbug链接(图1-1红色圈住部分)进入Firebug的下载安装页面。

<!–[if !vml]–><!–[endif]–>
图1-1

在页面中点击Install Now(图1-2)按钮。

<!–[if !vml]–><!–[endif]–>
图1-2

在弹出窗口(图1-3)中等待3秒后单击“立即安装”按钮。

<!–[if !vml]–><!–[endif]–>
图1-3

等待安装完成后会单击窗口(图1-4)中的“重启 Firefox”按钮重新启动Firefox。

<!–[if !vml]–><!–[endif]–>
图1-4

当Firefox重启完后我们可以在状态栏最右边发现一个灰色圆形图标(<!–[if !vml]–><!–[endif]–>),这就表示Firebug已经安装好了。灰色图标表示Firebug未开启对当前网站的编辑、调试和监测功能。而绿色(<!–[if !vml]–><!–[endif]–>)则表示Firebug已开启对当前网站进行编辑、调试和监测的功能。而红色图标(<!–[if !vml]–><!–[endif]–>)表示已开启对当前网站进行编辑、调试和监测的功能,而且检查到当前页面有错误,当前图标表示有5个错误。

<!–[if !supportLists]–>2、 <!–[endif]–>开启或关闭Firebug
单击Firebug的图标或者按F12键你会发现页面窗口被分成了两部分,上半部分是浏览的页面,下半部分则是Firebug的控制窗口(图2-1)。如果你不喜欢这样,可以按CTRL+F12或在前面操作后单击右上角的上箭头按钮,弹出一个新窗口作为Firebug的控制窗口。

<!–[if !vml]–><!–[endif]–>
图2-1

从图2-1中我们可以看到,因为我们开启Firebug的编辑、调试和监测功能,所以目前只有两个可以选择的链接:“Enable Firebug”与“Enable Firebug for this web site”。如果你想对所有的网站进行编辑、调试和检测,你可以点击“Enable Firebug”开启Firebug,则以后无论浏览任何网站,Firebug都处于活动状态,随时可以进行编辑、调试和检测。不过一般的习惯我们只是对自己开发的网站进行编辑、调试和检测,所以我们只单击“Enable Firebug for this web site”开启Firebug就行了。
开启Firebug窗口(图2-2)后,我们可以看到窗口主要有两个区域,一个是功能区,一个是信息区。选择功能区第二行的不同标签,信息区的显示会有不同,Options的选项也会不同,搜索框的搜索方式也会不同。

<!–[if !vml]–><!–[endif]–>
图2-2

要关闭Firebug控制窗口单击功能区最右边的关闭图标或按F12键就行了。如果要关闭Firebug的编辑、调试和监测功能,则需要单击功能区最左边的臭虫图标,打开主菜单,选择“Disable Firebug”或“Disable Firebug for xxxxx”。

<!–[if !supportLists]–>3、 <!–[endif]–>Firebug主菜单

单击功能区最左边的臭虫图标可打开主菜单(图3-1),其主要功能描述请看表1。

<!–[if !vml]–><!–[endif]–>
图3-1

菜单选项

说明
Disable Firebug
关闭/开启Firebug对所有网页的编辑、调试和检测功能
Disable Firebug for xxxxx

关闭/开启Firebug对xxxxx网站的编辑、调试和检测功能
Allowed Sites

设置允许编辑、调试和检测的网站
Text Size:Increase text size

增大信息区域显示文本的字号
Text Size:Decrease text size

减少信息区域显示文本的字号
Text Size:Normal text size

信息区域以正常字体显示
Options:Always Open in New Window

设置Firebug控制窗口永远在新窗口打开
Show Preview tooltips

设置是否显示预览提示。
Shade Box Model

当前查看状态为HTML,鼠标在HTML element标签上移动时,页面会相应在当前标签显示位置显示一个边框表示该标签范围。这个选项的作用是设置是否用不同颜色背景表示标签范围。
Firebug Website..

打开Firebug主页。
Documentation..

打开Firebug文档页。
Discussion Group

打开Firebug讨论组。
Contribute

打开捐助Firebug 页面。
表1

<!–[if !supportLists]–>4、 <!–[endif]–>控制台(Console)
单击功能区第二栏的“Console”标签可切换到控制台(图4-1)。控制台的作用是显示各种错误信息(可在Options里定义),显示脚本代码中内嵌的控制台调试信息,通过命令行对脚本进行调试,通过单击Profile对脚本进行性能测试。 控制台分两个区域,一个是信息区,一个是命令行,通过Options菜单的“Larger Command Line”可改变命令行位置。

<!–[if !vml]–><!–[endif]–>
图4-1

    Options菜单的选项请看表2。

菜单选项

说明
Show JavaScript Errors 显示脚本错误。
Show JavaScript Warnings

显示脚本警告。
Show CSS Errors

显示CSS错误。
Show XML Errors

显示XML错误。
Show XMLHttpRequests

显示XMLHttpRequests。
Larger Command Line

将命令行显示从控制窗口底部移动右边,扩大输入区域。
表2

单击“Clear”按钮可清除控制台的控制信息。

<!–[if !supportLists]–>5、 <!–[endif]–>页面源代码查看功能
单击功能区第二栏的“HTML”标签可切换到源代码查看功能(图5-1)。虽然Firefox也提供了查看页面源代码的功能,但它显示的只是页面文件本身的源代码,通过脚本输出的HTML源码是看不到。而Firebug则是所见即所得,是最终的源代码。

<!–[if !vml]–><!–[endif]–>
图5-1

我们来看一个例子,文件源代码如下:

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01//EN” “http://www.w3.org/TR/html4/strict.dtd”>
<html>
<head>
<title>简单的例子</title>
       <meta http-equiv=”content-type” content=”text/html; charset=utf-8″>
       <style>
              #div1{background:red;width:100px;height:100px;}
              #div2{background:blue;width:100px;height:100px;margin:10px;padding:10px;border:5px solid black;color:white;}
              #div3{background:yellow;width:50px;height:50px;margin-left:25px;}
       </style>
</head>
<body scroll=”no”>
<div id=”div1″>方块一</div>
<div id=”div2″>方块二</div>
<script>
    document.getElementById(‘div1′).innerHTML+='<div id=”div3″>方块三</div>’;
</script>
</body>
</html>
 
在例子中我们通过JavaScript在“div1”中加入了“div3”,在Firefox中查看源代码你是看不到“div1”中包含有代码“<div id=”div3″>方块三</div>”的,但是Firebug中我们是可以看见的(图5-2选中部分)。

<!–[if !vml]–><!–[endif]–>
图5-2

从图5-1中我们可以看到,信息区被分成了两个部分,左边是显示源代码,右边是一个功能区,可以从这里查看到HTML Element中的CSS定义、布局情况和DOM结构。
从图5-2中我们可以看到,源代码按DOM结构分层次显示的,通过层次折叠功能,我们就可以很方便分析代码。在功能区的第一行还根据你的选择,清晰的按子、父、根列出了当前源代码的层次(图5-2红色部分),单击各部分,则会即刻转到该部分的源代码。

<!–[if !vml]–><!–[endif]–>
图5-3

在源代码上移动鼠标,页面就会出现一个半透明的方块,指示当前鼠标所指源代码的显示区域,当选择。在图5-4中,鼠标正指向“div1”,而在页面中“div1”的显示区域上被一个半透明的方块遮盖了。
<!–[if !vml]–><!–[endif]–>
图5-4
如果你把“Inspect”按钮按下,功能正好相反,在页面中移动鼠标,则当前显示区域的源代码会被加亮显示出来。在图5-5中,我们可以看到鼠标指针正指向“方块二”,而在源代码中可以看到,“方块二”的源代码“<div id=”div2″>方块二</div>”已被加亮显示(红色部分)。如果你单击某个显示区域,则该区域的源代码会被选中。

<!–[if !vml]–><!–[endif]–>
图5-5
是不是很方便?方便是方便,但是我的源代码很多,而且有些区域在页面中不方便鼠标指定,怎么办?没关系,我们还有一个厉害武器,搜索功能。譬如我们知道某个HTML Element的ID是“div2”,但在层层叠叠的源代码中不好找,在页面中鼠标也很难找到,那我们就在功能区的搜索框中输入“div2”,再看看源代码区域,“div2”被加亮显示出来了(图5-6红色部分)。在这个简单的例子可能看不出很好的效果,大家可以尝试一下把“div1”先折叠起来,然后在搜索框输入“div3”,你可以看到“div1”会自动展开,并将“div3”加亮显示,如果还觉得不够理想,可以找一个源代码比较多的例子测试一下。
<!–[if !vml]–><!–[endif]–>
图5-6

除了通过按下“Inspect”按钮,单击显示区域选择源代码,我们还可以通过单击源代码中的HTML标记(开始或结束标记都可以)来选择。我们尝试一下把鼠标移动到HTML标记,会发现鼠标指针变成了手的形状,这说明我们可以通过单击选择该源代码。选择源代码后,我们就可以通过右边的功能区查看、编辑和调试它的CSS定义和盒子模型(CSS盒子模型请参阅相关说明,这里就不再赘述了),还有一个很好的功能就是当外部编辑器修改了源代码(没有删除该源代码,只是修改),我们在浏览器重新加载页面后,选择的源代码不会改变,我们可以很方便的观察源代码的变化与效果。
有没有经常为调试某个页面效果在源代码编辑器和浏览器之间切换,一次又一次的刷新而感到懊恼?有了Firebug你就不用再懊恼了。你可以直接在源代码中进行编辑,然后查看效果。如果只是修改已经存在的属性,例如要修改“div2”的内部文本,则直接将鼠标移动到文本上面,等鼠标指针换成“I”,单击即可进行编辑了。其它已存在的属性和属性值也可以这样直接进行编辑。如果要为某 Element添加属性,请将鼠标移动到该Element上,等光标变为“I”的时候,单击鼠标右键,从菜单中选择“New Attribute..”,在显示的编辑框中输入你要添加的属性名称就可以了。
<!–[if !vml]–><!–[endif]–>
图5-7

<!–[if !vml]–><!–[endif]–>
图5-8
我们尝试一下为“div2”增加一个“onclick”属性,单击的结果是将 “div2”的显示文本修改为“单击”。把光标移动到“div2”上,然后单击鼠标右键,选择“New Attribute..”(图5-7),在编辑框中输入“onclick”,最后按一下回车键(图5-8),出现属性值输入框后,输入 “this.innerHTML=’单击’”,回车后我们可以继续添加下一个属性,这次测试不需要,所以按ESC结束我们的输入。我们来检验一下修改结果,单击页面“div2”的区域(图5-9),“div2”的显示文本已修改为“单击”了,而源代码也改变了。有没有发现,“div2”被加亮显示了?这又是Firebug的一个功能。只要我们通过页面中的操作修改了Element的属性,Firebug就会在源代码中通过加亮的方式指示当前操作修改那些属性值。譬如我们单击某个链接修改了一个iframe里的src,那么这个src的属性值就会被加亮显示。又譬如我们单击某个链接修改了一个image里的图像,那么它的src属性值也会被加亮显示。我们可以通过Options菜单里的“Highlight Changes”设置是否加亮显示改变。而“Expand Changes”则是设置被改变的源代码折叠起来看不见时展开让它可见。而“Scroll Changes into view”则是源代码很多,被改变的源代码不在可视区域时,将被改变的源代码滚动到可视区域。
<!–[if !vml]–><!–[endif]–>
图5-9

有时候我们不单是要增加一两个属性,而是要做更多的修改,这怎么办呢?很简单,选择你要更改Element,然后单击功能区第一行的“Edit”按钮或者直接将鼠标移动到要修改的Element上,单击鼠标右键,选择“Edit HTML..”,这时候,源代码区域将切换到编辑状态,你可以随意的修改你选择的源代码了。我们尝试修改一下“div2”,将被修改显示文本修改回“方块二”,我们选择“div2”,然后单击“Edit”按钮(图5-10),将显示文本修改回“方块二”,然后再次单击“Edit”按钮退出编辑状态,如果要放弃修改,可以按ESC键退出。因为是所见即所得的,所以我们在修改的时候,页面会同时刷新显示。
<!–[if !vml]–><!–[endif]–>
图5-10
如果要修改Element的CSS定义怎么办?很简单,选择该Element,然后在右边的窗口选择“Style”标签,这里显示的就是当前Element的CSS定义了。我们在这里可以对CSS定义进行添加、编辑、删除、禁止等操作。我们尝试一下把“div2”的背景色禁止了看看。将鼠标移动到“background”这行(图5-11),我们可以看到在这行的最右边会有一个灰色的禁止图标,只要单击这个禁止图标,就可以禁止了这个CSS属性了。我们单击这个图标看看效果,页面中的“div2”已经变成白色背景了,而禁止图标也变成红色,而文本会则变成灰色(图5-12),这说明已经禁止了“background”了。当然了,这个操作也可以通过鼠标右键的“Disable XXXXX”来实现(XXXXX表示当前选择的CSS属性)。我们再次单击禁止图标,恢复“background”属性。我们这次要把 “background”的颜色由蓝色(blue)修改为绿色(green)。我们把鼠标移动到“background”属性值“blue”上(图 5-13)。怎么会出现一个蓝色背景的方框?这是Firebug提供背景预览功能,让我们很直观的知道当前背景是什么。如果背景是图片的话,显示的将是背景图片的缩略图。继续我们的操作,单击属性值,在出现的编辑框中将“blue”修改为“green”。好了,背景已经修改为绿色了。现在的显示文本是左对齐的,我想让它居中对齐,这需要在CSS里加一个“text-align”的属性,值为“center”。请在CSS上单击鼠标右键,在菜单中选择 “New Property..”,在编辑框中输入“te”,Firebug已通过自动完成功能帮我们输入“text-align”了(图5-14),按Tab键或回车,在属性值中我们输入“c”,Firebug再次帮我们自动完成了“center”(图5-15),按Tab键或回车完成输入,如果不需要继续输入新属性,按ESC或单击鼠标取消输入。文本“方块二”现在已经居中显示了。如果忘记了某个属性值有那些选项怎么办?不要紧,在输入属性值的时候可以通过上、下箭头选择我们需要的属性值。
在“Style”标签里我们可以选择“Options”菜单里的“Show Computed Style”查看浏览器默认的风格定义。

<!–[if !vml]–><!–[endif]–>
图5-11

<!–[if !vml]–><!–[endif]–>
图5-12

<!–[if !vml]–><!–[endif]–>
图5-13

<!–[if !vml]–><!–[endif]–>

<!–[if !vml]–><!–[endif]–>
图5-14

图5-15
页面设计中,我们有时候最头疼的是什么?是盒子模型!为了调整一个Element的 margin、border、padding和相对位置,我们往往需要花很多工夫去修改源代码,然后刷新页面查看效果。有了Firebug,你就可以轻松应对了。我们将右边的区域切换到“Layout”标签(图5-16),你会看到一个盒子模型,里面从外到里通过不同的线和颜色划分出了offset、 margin、border、padding和内容五个区域,里面4个区域在每个边上都有1个数值,表示该方向上的调整值。我们先在左边选择 “div2”,然后把鼠标分别移动到“Layout”里的不同区域(图5-17),然后留意一下页面,页面在顶部多了一条水平标尺,在左边多一条垂直标尺,而4条实线指示出了当前鼠标指示的区域实际位置,通过与标尺的交点可以知道该区域离页面显示区域左上角的偏移量(单位是px),当然我们也可以通过 layout中的数字计算出这些偏移量。在图中,我们还可以看到,在内容区域的外面还有3个不同颜色的区域,它们从里到外用不同颜色表示了 padding、border、margin的位置和偏移量。只要将鼠标移动到不同区域,页面中的4条实线也会改变位置,指示出页面中相应的区域。我们还可以通过修改Layout中的数值,对显示效果进行调整。例如我们要将“div2”的内容显示区域扩大到200×200,将鼠标移动最左边的100上,光标变成“I”后,单击鼠标,然后在输入框中输入200,按回车可继续修改高度值,输入200,回车后完成修改。页面中的“div2”区域已经扩展到 200×200了,而源代码也增加了“style=”width: 200px; height: 200px;””(图5-18)。我们切换标签到“Style”,会发现多了“element.style {height:200px;width:200px;}”(图 5-19),而CSS定义里面的高度和宽度都划了横线,表示不起作用了,“element.style”表示直接定义在Element源代码上的CSS属性。有时候某些Element会有相同的属性,也有自己特殊的属性,而特殊的属性想写在Element的源代码上,就可以在Style里单击鼠标右键选择 “Edit Element Style..”进行添加。如果有兴趣的话,大家可以尝试修改“Layout”里的其它属性值,看看页面的变化,这里我就不再一一说明了。
    如果不想在页面中显示标尺和4条实线,可以不选择“Options”菜单里的“Show Rules and Guides”。

<!–[if !vml]–><!–[endif]–>
图5-16

<!–[if !vml]–><!–[endif]–>
图5-17

<!–[if !vml]–><!–[endif]–>
图5-18

<!–[if !vml]–><!–[endif]–>
图5-19

在源代码显示区域我们还可以通过鼠标右键复制源代码和显示内容,这里就不一一说明了。 DOM的说明请看查看DOM结构一节,两者是一样的。在源代码区域中如果觉得源代码显示太密,可以将“Options”菜单里的“Show White Space”选项打开,每个源代码块之间会用空白行隔离。如果要查看源代码的注释内容,请将“Options”菜单里的“Show Comments”选项打开。
这里要提醒大家一下,在HTML里调试出正确的源代码和CSS后,别忘记将源代码和CSS的修改结果复制到你的源代码文件中,不然你的调试结果在页面刷新后会付之东流。切记!切记!

<!–[if !supportLists]–>6、 <!–[endif]–>查看CSS定义
将功能区第二行的标签切换到“CSS”,在这里我们可以查看页面中所有的CSS定义,包括链接的CSS文件。通过功能区的文件选择按钮可以选择不同的含有CSS的文件(图6-1红色圈住部分)。

<!–[if !vml]–><!–[endif]–>
图6-1

CSS的定义的编辑这里就不再说明了,这个可以参考HTML的“Style”操作。
“Edit”按钮功能和HTML的“Edit”功能类似。

<!–[if !supportLists]–>7、 <!–[endif]–>脚本调试
将功能区第二行的标签切换到“Script”,在这里我们可以对页面中所有的脚本进行调试,包括链接的脚本。和CSS一样,可以通过文件选择按钮选择不同的脚本文件。
如果要在脚本中设置一个断点,可以单击行号旁边的空白区域,这时会出现一个红色的点表示在这里设置了断点(图7-1),当脚本运行到此会停止运行,等待你的操作。在右边的小窗口将标签切换到“Breakpoints”可以查看我们设置的所有断点(图7-2),单击左上角的checkbox可以让断点不起作用,如果要删除断点可以单击右上角的删除图标。通过“Options”菜单的 “Disable All Breakpoints”可暂时禁止所有断点,而“Remove All Breakpoints”可删除所有断点。在断点标记的红点上单击右键还可以设置断点条件,在符合条件的时候才会停止脚本的执行。
<!–[if !vml]–><!–[endif]–>
图7-1

<!–[if !vml]–><!–[endif]–>
图7-2

下面我们来尝试一下断点的功能。首先在测试页脚本里增加一个test的函数,函数的主要操作是运行一个1000次的循环,将循环的参数值显示在“div2”里:

    function test(){
            for(var i=0;i<1000;i++){
                   document.getElementById(‘div2’).innerHTML=i;
            }
        }
 
    在“div2”里增加一个“onclick”属性,单击后执行test:

<div id=”div2″ onclick=’test()’>方块二</div>
 
刷新页面,然后在“for(var i=0;i<1000;i++){”这行上设置一个断点,并设置条件为“i=100”(图7-3),然后单击“div2”开始执行函数test。

<!–[if !vml]–><!–[endif]–>
图7-3

当脚本停下来后,我们将鼠标移动到变量“i”上,这时会出现一个小方框,里面有一个数值,这就是变量“i“的当前值(图7-4)。在脚本调试的时候,你可以通过这个方法很方便的了解到当前变量的值。你还可以通过右边窗口的“Watch”标签查看到“i”的值(图7-5)。
<!–[if !vml]–><!–[endif]–>
图7-4

<!–[if !vml]–><!–[endif]–>
图7-5
在“Watch”标签窗口我们可以通过“Options”菜单选择查看用户自定义属性(Show User-defined Properties)、用户自定义函数(Show User-defined Functions)、DOM属性(Show DOM Properties)、DOM函数(Show DOM Functions)和DOM常数(Show DOM Constants)。我们还可以通过单击“New watch expression…”(图7-6淡黄色背景部分)加入自己想跟踪的内容。例如我们想跟踪一下“div2”的显示内容,就可以单击“New watch expression…”,加入“document.getElementById(‘div2’).innerHTML”,输入中可通过TAB键自动完成关键字的输入(图7-7)。如果不想跟踪了,可单击最右边的删除图标取消跟踪。
<!–[if !vml]–><!–[endif]–>
图7-6

<!–[if !vml]–><!–[endif]–>
图7-7

脚本在断点停止后,我们就可以利用搜索框旁的4个跟踪按钮进行代码跟踪了(图 7-7)。第一按钮是继续运行程序,不再执行跟踪,快捷键是F8。第二个按钮是单步执行方式,每次执行一条语句,该方式在遇到函数调用时不进入调用函数内部进行跟踪,快捷键是F10。第三个按钮也是单步执行方式,每次执行一条语句,但它遇到函数调用时会进入调用函数内部进行跟踪,快捷键是F11。当你进入调用函数内,想马上跳出来时,可以单击第四个按钮,该按钮没有快捷键。
搜索框的作用和HTML源代码查看是一样的,不过有一个不同,就是输入“#n”(n≥1),可以直接跳到脚本的第n行。
当执行脚本在“console”标签内显示一个错误,而错误的提示行左边出现一个暗红色的圆点时(图7-8),我们可以单击改红点在该行设置一个断点。

<!–[if !vml]–><!–[endif]–>
图7-8
我们可以通过“Script”标签的“Options”菜单的“Break on All Errors”选项设置每当脚本发生错误时就中断脚本,进入调试状态。
有时候一个函数随机出现错误,你不可能每次调用都去跟踪一次,而产生错误的原因很可能是传递的参数错误,这时你可以通过跟踪函数调用的功能去检查每次调用函数时的参数情况。操作在函数脚本内单击鼠标右键,在菜单中选择“Log Calls to xxxxx”(xxxxx为函数名),然后可在“console”标签中可查看函数调用情况。

<!–[if !supportLists]–>8、 <!–[endif]–>查看DOM结构
将功能区第二行的标签切换到“DOM”可俺层次查看整个页面的DOM结构。通过 “Options”菜单可自定义选择查看用户自定义属性(Show User-defined Properties)、用户自定义函数(Show User-defined Functions)、DOM属性(Show DOM Properties)、DOM函数(Show DOM Functions)或DOM常数(Show DOM Constants)等内容。
通过双击你可以修改DOM里面的属性值。

<!–[if !supportLists]–>9、 <!–[endif]–>查看网络状况
作为开发人员,是否会经常听到老板或客户抱怨页面下载太慢了?于是你就怀疑是否脚本太多了?忘记压缩图片了?服务器太慢了?网络太慢?确实是头疼的事情。有了Firebug,你就可以很容易的对这个问题进行分析和判断了。请将 Firebug的当前标签切换到“Net”(图9-1)。

<!–[if !vml]–><!–[endif]–>
图9-1

<!–[if !vml]–><!–[endif]–>
图9-2

从图中我们可以看到,页面中每一个下载文件都用一个灰色条表示它相对其它文件是从什么时候开始下载的,下载时间是多少。在底部我们看到页面发送了多少个请求,下载总量是多少,有多少是有缓存的,下载总共花费了多少时间等信息。
如果只想了解某一样文件的下载情况,你可以单击功能区第一栏的文件分类按钮过滤文件(图9-2红色圈住区域1)。
将鼠标在文件中移动,如果是图片,我们可以看到图片的缩略图(图9-2红色圈住区域3)。
如果显示为红色的文件名,则表示该文件在服务器中不存在,不能下载,这样你就要检查一下文件的路径是否正确或者是否上传了该文件(图9-2红色圈住区域2)。
我们可以展开某个文件,查看它的HTTP头信息和返回结果的信息。如果请求的是一个动态页面或XMLHttpRequest,则还可以查看提交的变量。通过查看提交的变量和返回信息,我们可以很方便的调试程序是否正确提交了需要的变量和返回了正确的数据。例如从图36中,我们可以看到向“topics-remote.php”发送了一个请求,提交的参数有“_dc”、 “callback”、“limit”和“start”四个,值分别为“1188637444000”、“stcCallback1001”、“25”与 “0”,从这里我们可以很方便的知道我们脚本操作提交的参数是否正确。切换到“Response”页可以看到返回的结果(图9-3),在这里你可以对返回结果进行检查。如果你感觉在这里查看结果很乱,你可以单击鼠标右键,在弹出菜单中选择“Copy Response body”复制结果到编辑器查看,你还可以选择“Open in New Tab”打开一个新标签浏览。

<!–[if !vml]–><!–[endif]–>
图9-3

通过右键菜单你可以复制文件地址(Copy Location)、HTTP请求头信息(Copy Request Headers)和HTTP响应头信息(Copy Response Headers)。
如果不想使用该功能,可以选择Options菜单的“Disable Network Monitoring”关闭该功能。

<!–[if !supportLists]–>10、              <!–[endif]–>命令行调试
在“Console”标签了有一个命令行工具,我们可以在这里运行一些脚本对页面进行调试。
我们在命令行中输入“document.getElementById(‘div2’).innerHTML”看看效果(图10-1),别忘了用TAB键实现快速输入关键字。在信息区显示了当前“div2”的显示内容。

<!–[if !vml]–><!–[endif]–>
图10-1

要输入“document.getElementById”是不是觉得很麻烦?这里有一个简单的办法,用“$”符号代替“document.getElementById”,我们再在命令行中输入“$(‘div2’).innerHTML”,然后看看结果,是一样(图10-2)。

<!–[if !vml]–><!–[endif]–>
图10-2

当你通过“Inspect”锁定了一些HTML Element时,你可以通过“$1”来访问最后一个Element,依次类推,我们可以通过“$n”(n>1)访问依次倒序访问锁定的Element。
我们来实践一下,刷新一下测试页面,然后按下“Inspect”按钮,鼠标单击“方块二”,然后在按下“Inspect”按钮,单击“方块一”。将firebug窗口切换回“Console”标签,然后输入“$1”,回车后再输入 “$2”,查看一下结果(图10-3),正是我们用锁定过的Element。

<!–[if !vml]–><!–[endif]–>
图10-3

在命令行还可以通过“$$(HTML 标记)”返回一个Element数组。我们在测试页输入“$$(‘div’)”看看(图10-4)。我们再输入“$$(‘div’)[0]”看看(图10-5)。是不是很便于我们对HTML进行调试。

<!–[if !vml]–><!–[endif]–>
图10-4
<!–[if !vml]–><!–[endif]–>
图10-5

命令行的所有特殊函数请看表3:

命令
说明
$(id)

通过id返回Element。
$$(selector)

通过CSS选择器返回Element数组。
$x(xpath)

通过xpath表达式返回Element数组。
dir(object)

列出对象的所有属性,和在DOM标签页查看该对象的是一样的。
dirxml(node)

列出节点的HTML或XML的源代码树,和在HTML标签页查看改节点一样。
cd(window)

默认情况下,命令行相关的是顶层window对象,使用该命令可切换到frame里的window独享。
clear()

清空信息显示区,和单击按钮Clear功能一样。
inspect(object[, tabName])

监视一个对象。tabName表示在那个标签页对该对象进行监视,可选值为“html”、“css”、“script”和“dom”。
keys(object)

返回由对象的属性名组成的数组。
values(object)

返回由对象的属性值组成的数组。
debug(fn)

在函数的第一行增加一个断点。
undebug(fn)

移除在函数第一行的断点。
monitor(fn)

跟踪函数fn的调用。
unmonitor(fn)

不跟踪函数fn的调用。
monitorEvents(object[, types])

跟踪对象的事件。Types的可选值为“composition”、 “contextmenu”、 “drag”、 “focus”,、“form”、“key”、 “load”、“mouse”、“mutation”、“paint”、“scroll”、“text”、“ui”和“xul”。
unmonitorEvents(object[, types])

不跟踪对象的事件。Types的可选值为“composition”、 “contextmenu”、 “drag”、 “focus”,、“form”、“key”、 “load”、“mouse”、“mutation”、“paint”、“scroll”、“text”、“ui”和“xul”。
profile([title])

开始对脚本进行性能测试,可选参数title将作为测试结果的标题。
profileEnd()

结束脚本性能测试。
表3

命令行有命令记忆功能,可通过上、下箭头键选择已经输入过的命令。

<!–[if !supportLists]–>11、              <!–[endif]–>在脚本文件中加入调试命令
有没有对脚本调试中经常需要alert感到厌烦?有了Firebug,你就可以放下alert了,因为Firebug有功能比alert更强大的console.log。
先让我们来认识一下console.log,在测试文件脚本区域我们输入一下代码:

console.log(‘Hello’);
 
   刷新一下页面,将firebug切换到“console”标签看看(图11-1),在信息区显示出了我们要输出的信息“Hello”。当然了,单凭这个就说console.log有点夸大,我们修改一下test函数,把 “document.getElementById(‘div2’).innerHTML=i;”修改为:

console.log(‘当前的参数是:%d’,i);
<!–[if !vml]–><!–[endif]–>
图11-1
 
   刷新页面后看看结果(图11-2)。是不是挺不错的?console.log可以象c语言的printf一样实现格式化输出。我们再在脚本区加入一个语句:

console.log(2,4,window,test,document);
 

<!–[if !vml]–><!–[endif]–>
图11-2
 
刷新页面后看看结果(图11-3)。console.log可以连续输出多个对象,而且如果对象是DOM、函数,还可以直接点击去到该对象。

<!–[if !vml]–><!–[endif]–>
图11-3
 
如果你觉得console.log输出的文本太单调,不能表示出不同的信息,那么你可以通过console.debug、 console.info、 console.warn和console.error来代替console.log,这些函数分别会用不同的背景颜色和文字颜色来显示信息。
我们来看看测试一下这些函数的输出,在脚本中加入:

     console.debug(‘This is console.debug!’);
     console.info(‘This is console.info!’);
     console.warn(‘This is console.warn!’);
     console.error(‘This is console.error!’);
 
   刷新页面看看结果(图11-4)。

<!–[if !vml]–><!–[endif]–>
图11-4
 
有时候,为了更清楚方便的查看输出信息,我们可能需要将一些调试信息进行分组输出,那么可以使用console.group来对信息进行分组,在组信息输出完成后用console.groupEnd结束分组。我们测试一下把刚才的4个输出作为一个分组输出,修改代码为:

     console.group(‘开始分组:’);
     console.debug(‘This is console.debug!’);
     console.info(‘This is console.info!’);
     console.warn(‘This is console.warn!’);
     console.error(‘This is console.error!’);
     console.groupEnd();
 
刷新页面看看结果(图11-5)。在console.group中,我们还可以加入一个组标题“开始分组:”。如果需要,我们还可以通过嵌套的方式,在组内再分组。

<!–[if !vml]–><!–[endif]–>
图11-5
 
有时候,我们需要写一个for循环列出一个对象的所有属性或者某个HTML Element下的所有节点,有了firebug后,我们不需要再写这个for循环了,我们只需要使用console.dir(object)或 console.dirxml(element)就可以了。
在测试页中加入代码测试一下:

     console.dir(document.getElementById(‘div1’));
     console.dirxml(document.getElementById(‘div1’));
 
    结果请看图11-6和图11-7。

<!–[if !vml]–><!–[endif]–>
图11-6
<!–[if !vml]–><!–[endif]–>
图11-7
 
是否想知道代码的运行速度?很简单,使用console.time和console.timeEnd就可以。
修改一下test函数的代码,测试一下运行1000次循环需要多少时间:

     function test(){
            console.time(‘test’);
            for(var i=0;i<1000;i++){
                   document.getElementById(‘div2’).innerHTML=i;
                   //console.log(‘当前的参数是:%d’,i);
            }
            console.timeEnd(‘test’);
        }
 
刷新页面,单击“方块二”,看看结果(图11-8)。在这里要注意的是console.time和console.timeEnd里的参数要一致才会有正确的输出,而该参数就是信息的标题。

<!–[if !vml]–><!–[endif]–>
图11-8
 
是否想知道某个函数是从哪里调用的?console..trace可帮助我们进行追踪。在test函数的结尾加入:

            console.trace();
 
刷新页面,单击“方块二”,看看结果(图11-9)。结果显示是在坐标(97,187)的鼠标单击事件执行了test函数,而调用的脚本是在simple.html文件里的第1行。因为是在HTML里面的事件调用了test 函数,所以显示的行号是第1行。如果是脚本,则会显示调用脚本的行号,通过单击可以直接去到调用行。

<!–[if !vml]–><!–[endif]–>
图11-9
 
如果想在脚本某个位置设置断点,可以在脚本中输入“debugger”作为一行。当脚本执行到这一行时会停止执行等待用户操作,这时候可以通过切换到“Script”标签对脚本进行调试。
    Firebug还有其它的一些调试函数,这里就不一一做介绍,有兴趣可以自己测试。表4是所有函数的列表:
函数
说明
console.log(object[, object, …])
向控制台输出一个信息。可以输入多个参数,输出将已空格分隔各参数输出。
第一参数可以包含格式化文本,例如:
console.log(‘这里有%d个%s’,count,apple);
字符串格式:
%s :字符串。
%d, %i:数字。
%f: 浮点数。
%o -超链接对象。
console.debug(object[, object, …])

向控制台输出一个信息,信息包含一个超链接链接到输出位置。
console.info(object[, object, …])

向控制台输出一个带信息图标和背景颜色的信息,信息包含一个超链接链接到输出位置。
console.warn(object[, object, …])

向控制台输出一个带警告图标和背景颜色的信息,信息包含一个超链接链接到输出位置。
console.error(object[, object, …])

向控制台输出一个带错误图标和背景颜色的信息,信息包含一个超链接链接到输出位置。
console.assert(expression[, object, …])

测试一个表示是否为true,如果为false,提交一个例外信息到控制台。
console.dir(object)

列出对象的所有属性。
console.dirxml(node)

列出HTML或XML Element的XML源树。
console.trace()

输出堆栈的调用入口。
console.group(object[, object, …])

将信息分组再输出到控制台。通过console.groupEnd()结束分组。
console.groupEnd()

结束分组输出。
console.time(name)

创建一个名称为name的计时器,计算代码的执行时间,调用console.timeEnd(name)停止计时器并输出执行时间。
console.timeEnd(name)

停止名称为name的计时器并输出执行时间。
console.profile([title])

开始对脚本进行性能测试,title为测试标题。
console.profileEnd()

结束性能测试。
console.count([title])

计算代码的执行次数。titile作为输出标题。
表4

<!–[if !supportLists]–>12、              <!–[endif]–>在IE中使用Firebug
Firebug是Firefox的一个扩展,但是我习惯在IE中调试我的页面怎么办?如果在页面脚本中加入console.log()将调试信息写到Friebug,在IE中肯定是提示错误的,怎么办?不用担心,Frirebug提供了 Frirbug Lite脚本,可以插入页面中模仿Firebug控制台。
我们可以从一下地址下载firebug lite:
http://www.getfirebug.com/releases/firebuglite1.0-b1.zip

然后在页面中加入:

<script language=”javascript” type=”text/javascript” src=”/路径/firebug.js”></script>
 
    如果你不想在IE中模仿Friebug控制台,只是不希望console.log()脚本出现错误信息,那么在页面中加入一下语句:

<script language=”javascript” type=”text/javascript” src=”/路径/firebugx.js”></script>
 
如果你不想安装Firebug Lite,只是想避免脚本错误,那么可以在脚本中加入以下语句:

if (!window.console || !console.firebug)
{
    var names = [“log”, “debug”, “info”, “warn”, “error”, “assert”, “dir”, “dirxml”,
    “group”, “groupEnd”, “time”, “timeEnd”, “count”, “trace”, “profile”, “profileEnd”];

    window.console = {};
    for (var i = 0; i < names.length; ++i)
        window.console[names[i]] = function() {}
}
 
我们将firebug.js加入到测试页面中,然后打开IE,加载页面。页面加载完成后,我们按下F12键就可以打开控制台了。每次页面刷新后,你都要按F12键打开控制台,是不是很烦?如果不想那么,就在html标签中加入“debug=’true’”,例如:

<html debug=”true”>
 
   在Friebug Lite中也有命令行,但是功能没那么强。

<!–[if !supportLists]–>13、 <!–[endif]–>快捷键和鼠标操作
全局操作
打开Firebug窗口

F12
关闭Firebug窗口

F12
在新窗口打开Firebug

Ctrl+F12
往前切换标签

Ctrl+`
将光标移到命令行

Ctrl+Shift+L
将光标移到搜索框

Ctrl+Shift+K
进入Inspect模式

Ctrl+Shift+C
进行JavaScript性能测试

Ctrl+Shift+P
重新执行最后一条命令行命令

Ctrl+Shift+E
HTML标签
编辑属性

单击属性名或值
编辑文本节点

单击文本
编辑Element

双击Element标记
移到路径里的下一个节点

Ctrl+.
移到路径里的上一个节点

Ctrl+,
HTML编辑
完成编辑

Return
取消编辑

Esc
移到下一个区域

Tab
移到上一个区域

Shift+Tab
HTML Inspect 模式
取消Inspect

Esc
Inspect 父节点

Ctrl+Up
Inspect 子节点

Ctrl+Down
Script标签
继续运行

F5
 

Ctrl+/
单步执行(Step Over)

F10
 

Ctrl+’
单步执行(Step Into)

F11
 

Ctrl+;
退出函数(Step Out)

Shift+F11
 

Ctrl+Shift+;
设置断点

单击行号
禁止断点

在行号上Shift+Click
编辑断点条件

在行号上Right-Click
运行到当前行

在行号上Middle-Click
 

在行号上Ctrl+Click
移到堆栈中的下一个函数

Ctrl+.
移到堆栈中的上一个函数

Ctrl+,
将焦点切换到Scripts菜单

Ctrl+Space
将焦点切换到Watch编辑

Ctrl+Shift+N
DOM 标签
编辑属性

双击在空白
移到路径中下一个对象

Ctrl+.
移到路径中上一个对象

Ctrl+,
DOM 和Watch编辑
结束编辑

Return
取消编辑

Esc
自动完成下一个属性

Tab
自动完成上一个属性

Shift+Tab
CSS标签
编辑属性

单击属性
插入新属性

双击空白处
移动焦点到Style Sheets菜单

Ctrl+Space
CSS编辑
完成编辑

Return
取消编辑

Esc
移到下一个区域

Tab
移到上一个区域

Shift+Tab
按步长1增加数值

Up
按步长1减少数值

Down
按步长10增加数值

Page Up
按步长10减少数值

Page Down
自动完成下一个关键字

Up
自动完成上一个关键字

Down
Layout标签
编辑值

单击值
Layout编辑
完成编辑

Return
取消编辑

Esc
移到下一个区域

Tab
移到上一个区域

Shift+Tab
按步长1增加数值

Up
按步长1减少数值

Down
按步长10增加数值

Page Up
按步长10减少数值

Page Down
自动完成下一个关键字

Up
自动完成上一个关键字

Down
命令行 (小)
自动完成上一个属性

Tab
自动完成下一个属性

Shift+Tab
执行

Return
Inspect结果

Shift+Return
打开结果鼠标右键菜单

Ctrl+Return
命令行 (大)
执行

Ctrl+Return

<!–[if !supportLists]–>13、              <!–[endif]–>总结
真是意想不到,Firebug居然有那么多好功能居然是我不知道。通过写本篇文章,才认真的了解和学习了一次Firebug,越学越感觉到它的威力。不过我学的也只是皮毛,还有更多的功能和技巧需要在平时的使用中慢慢积累,因此这篇文章只是一个简单的介绍,还有很多东西是没有涉及到的,而且因为我本身水平与能力有限,所以文中会有很多错误与遗漏,希望大家能多多谅解与指正!多谢!

例子最终源代码:
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01//EN” “http://www.w3.org/TR/html4/strict.dtd”>
<html debug=’true’>
<head>
  <title>简单的例子</title>
    <meta http-equiv=”content-type” content=”text/html; charset=utf-8″>
    <style>
        #div1{background:red;width:100px;height:100px;}
        #div2{background:blue;width:100px;height:100px;margin:10px;padding:10px;border:5px solid black;color:white;}
        #div3{background:yellow;width:50px;height:50px;margin-left:25px;}
    </style>
<script language=”javascript” type=”text/javascript” src=”firebug/firebug.js”></script>
</head>
<body scroll=”no”>
  <div id=”div1″>方块一</div>
  <div id=”div2″ onclick=’test()’>方块二</div>
  <script>
      document.getElementById(‘div1′).innerHTML+='<div id=”div3″>方块三</div>’;
/*      console.log(‘Hello’);
      console.log(2,4,window,test,document);
      console.group(‘开始分组:’);
      console.debug(‘This is console.debug!’);
      console.info(‘This is console.info!’);
      console.warn(‘This is console.warn!’);
      console.error(‘This is console.error!’);
      console.groupEnd();*/
//      console.dir(document.getElementById(‘div1’));
//      console.dirxml(document.getElementById(‘div1’));
     
      function test(){
          console.time(‘test’);
          for(var i=0;i<1000;i++){
              document.getElementById(‘div2’).innerHTML=i;
              //console.log(‘当前的参数是:%d’,i);
          }
          console.timeEnd(‘test’);
          console.trace();
      } 
     

Javascript的调试利器:Firebug使用详解

<!– start node.tpl.php –>

 Javascript 的调试,是开发Web应用尤其是AJAX应用很重要的一环,目前对Javascript进行调试的工具很多,我比较喜欢使用的是Firebug。 Firebug是Joe Hewitt开发的一套与Firefox集成在一起的功能强大的web开发工具,可以实时编辑、调试和监测任何页面的CSS、HTML和 JavaScript。

本文主要是为初学者介绍一下Firebug的基本功能与如何使用Firebug。由于本人水平与能力有限,在文章中的可能会有很多错误与遗漏,希望大家能谅解和指正!
 
<!–[if !supportLists]–>1、 <!–[endif]–>安装
Firebug是与Firefox集成的,所以我们首先要安装的事 Firefox浏览器。安装好浏览器后,打开浏览器,选择菜单栏上的“工具”菜单,选择“附加软件”,在弹出窗口中点击右下角的“获取扩展”链接。在打开的页面的search输入框中输入“firebug”。等搜索结果出来后点击Firbug链接(图1-1红色圈住部分)进入Firebug的下载安装页面。
 
<!–[if !vml]–><!–[endif]–>
图1-1
 
在页面中点击Install Now(图1-2)按钮。
 
<!–[if !vml]–><!–[endif]–>
图1-2
 
在弹出窗口(图1-3)中等待3秒后单击“立即安装”按钮。
 
<!–[if !vml]–><!–[endif]–>
图1-3
 
等待安装完成后会单击窗口(图1-4)中的“重启 Firefox”按钮重新启动Firefox。
 
<!–[if !vml]–><!–[endif]–>
图1-4
 
当Firefox重启完后我们可以在状态栏最右边发现一个灰色圆形图标(<!–[if !vml]–><!–[endif]–>),这就表示Firebug已经安装好了。灰色图标表示Firebug未开启对当前网站的编辑、调试和监测功能。而绿色(<!–[if !vml]–><!–[endif]–>)则表示Firebug已开启对当前网站进行编辑、调试和监测的功能。而红色图标(<!–[if !vml]–><!–[endif]–>)表示已开启对当前网站进行编辑、调试和监测的功能,而且检查到当前页面有错误,当前图标表示有5个错误。
 
<!–[if !supportLists]–>2、 <!–[endif]–>开启或关闭Firebug
单击Firebug的图标或者按F12键你会发现页面窗口被分成了两部分,上半部分是浏览的页面,下半部分则是Firebug的控制窗口(图2-1)。如果你不喜欢这样,可以按CTRL+F12或在前面操作后单击右上角的上箭头按钮,弹出一个新窗口作为Firebug的控制窗口。
 
<!–[if !vml]–><!–[endif]–>
图2-1
 
从图2-1中我们可以看到,因为我们开启Firebug的编辑、调试和监测功能,所以目前只有两个可以选择的链接:“Enable Firebug”与“Enable Firebug for this web site”。如果你想对所有的网站进行编辑、调试和检测,你可以点击“Enable Firebug”开启Firebug,则以后无论浏览任何网站,Firebug都处于活动状态,随时可以进行编辑、调试和检测。不过一般的习惯我们只是对自己开发的网站进行编辑、调试和检测,所以我们只单击“Enable Firebug for this web site”开启Firebug就行了。
开启Firebug窗口(图2-2)后,我们可以看到窗口主要有两个区域,一个是功能区,一个是信息区。选择功能区第二行的不同标签,信息区的显示会有不同,Options的选项也会不同,搜索框的搜索方式也会不同。
 
<!–[if !vml]–><!–[endif]–>
图2-2
 
要关闭Firebug控制窗口单击功能区最右边的关闭图标或按F12键就行了。如果要关闭Firebug的编辑、调试和监测功能,则需要单击功能区最左边的臭虫图标,打开主菜单,选择“Disable Firebug”或“Disable Firebug for xxxxx”。
 
<!–[if !supportLists]–>3、 <!–[endif]–>Firebug主菜单
 
单击功能区最左边的臭虫图标可打开主菜单(图3-1),其主要功能描述请看表1。
 
<!–[if !vml]–><!–[endif]–>
图3-1
 
菜单选项
说明
Disable Firebug
关闭/开启Firebug对所有网页的编辑、调试和检测功能
Disable Firebug for xxxxx
关闭/开启Firebug对xxxxx网站的编辑、调试和检测功能
Allowed Sites
设置允许编辑、调试和检测的网站
Text Size:Increase text size
增大信息区域显示文本的字号
Text Size:Decrease text size
减少信息区域显示文本的字号
Text Size:Normal text size
信息区域以正常字体显示
Options:Always Open in New Window
设置Firebug控制窗口永远在新窗口打开
Show Preview tooltips
设置是否显示预览提示。
Shade Box Model
当前查看状态为HTML,鼠标在HTML element标签上移动时,页面会相应在当前标签显示位置显示一个边框表示该标签范围。这个选项的作用是设置是否用不同颜色背景表示标签范围。
Firebug Website..

javascript脚本化java

    JavaScript解释器包含一种功能,允许JavaScript代码来查询和设置java对象中字段值以及调用java对象中的方法。另外,JavaScript公平可以自己创建一个java对象。来看一段代码:

//创建java对象
var frame = new Packages.javax.swing.JFrame("Hello World");
var button = new Packages.javax.swing.JButton("Hello World");
var font = new Packages.java.awt.Font("SansSerif",Packages.java.awt.Font.BOLD,24);
//调用java对象中的方法  和java中一样吧? 😀 
frame.add(button);
button.setFont(font);
frame.setSize(200,200);
frame.setVisible(true);

JavaScript解释器通过Packages全局变量来访问所有的java包。例如:

Packages.javax.awt是访问javax.awt包,而Packages.java.lang.System是访问java.lang.System类。

另外,如果是java包,JavaScript解释器有一个专门访问java包的全局标记,可以不用Packages了,这个全局标记就是java,因此,上面的Packages.java.lang.System可以直接写成java.lang.System。除了java包,其它的包都要通过Packages全局标记来访问。

    JavaScript之所以如此方便的使用java对象,是因为JavaScript解释器采用了一种LivaConnect技术。要理解LiveConnect所使用的JavaScript数据类型。

一、JavaPackage类:

    JavaPackage是JavaScript的一种数据类型。java中的一个包存放着一组相关的java类,而一个JavaPackage类就表示了一个java包。JavaPackage的属性就是java包中所有的类,以及这个包中的所有子包。像java、javax包都是JavaPackage对象。:JavaPackage中的属性(即:类)是不可枚举的,所以无法用for/in循环查看包中的内容。

    所有的JavaPackage对象都包含在一个父JavaPackage中。例:

Packages.java是一个JavaPackage,它包含了Packages.java.awt这个JavaPackage.而Packages.java.awt又包含了一个Packages.java.awt.Button,这个是个具体类了,那它就不是一个JavaPackage了,而是JavaClass.(JavaClass是包中的类)。另外,Packages.java.awt下还有个包Packages.java.awt.image包。

从而看出,某个JavaPackage通常存在这种情况:



JavaPackage有两个缺点:

1、对于LiveConnect来说,没有办法提前分辨属性是类还是包,所以JavaScript先把属性当类来处理,如果找不到类,才按包来独步一时。这样导致了第二个缺点

2、如果写错了类名,JavaScript会把它当作一个包,而不是通知程序员类名不存在。

css中滚动条的使用

定义

overflow 属性设置当元素的内容溢出其区域时发生的事情。

继承性:No

说明

这个属性定义溢出元素内容区的内容会如何处理。如果值为 scroll,不论是否需要,用户代理都会提供一种滚动机制。因此,有可能即使元素框中可以放下所有内容也会出现滚动条。

JavaScript 语法

CSS 属性也可通过一段 JavaScript 被动态地改变。

脚本语法:

object.style.overflow=”hidden”在我们的 HTML DOM 教程中,您可以找到更多有关 overflow 属性 的细节。

在我们的 HTML DOM 教程中,您也可以找到完整的 Style 对象参考手册。

例子

p

  {

  overflow: scroll

  }

可能的值

值 描述

visible 默认。内容不会被修剪,会呈现在元素之外。

hidden 内容会被修剪,但是浏览器不会显示供查看内容的滚动条。

scroll 内容会被修剪,但是浏览器会显示滚动条以便查看其余的内容。

auto 如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容。

css统一设置input样式(区分input类型)

1.用css的expression判断表达式

    input

    {

        background-color:expression(this.type==”text” ‘#FFC’:”);

    }

优点:简单

缺点:expression判断表达式FireFox是不支持的。致命的是只能区分出一个(例如例子中就只能区分出text文本框),不要试图设置多个,下面的会将上面的覆盖掉

2.用css中的type选择器

    input[type=”text”]

    {

        background-color:#FFC;

    }

   

    input[type=”password”]

    {

        background-image:url(BG.gif);

    }

优点:简单,明了,可以分区出各个input控件形态。

缺点:type选择器,IE6之前的对web标准支持的不太好的浏览器不能支持

3.用javascript脚本实现

<script language=javascript>

switch(type)

{

    case ‘text’:

    style.backgroundColor=”red”;

    break;

    case ‘password’:

    style.backgroundImage=”url(BG.gif)”;

    break;

    case ‘submit’:

    style.backgroundColor=”blue”;

    style.color=”white”;

    break;

}

</script>

优点:可以分区出各个input控件形态。

缺点:在js没有起作用之前,各个input还是原始状态,然后突然“变帅”会让你的页面很奇怪。较致命的是FireFox不支持

4.用Skin设置

Skin文件参考代码:

<asp:TextBox runat=”server” style=”background-color:#FFC “></asp:TextBox>

<asp:Button runat=”server” style=”background-color:red”></asp:Button>

注意里面的样式是用style加上的,而不是用cssClass,道理很简单,如果用cssClass,前面的再用cssClass就会覆盖这个cssClass。导致失败。当然,skin不能单独使用,还要配合css样式表。

优点:可以分区出各个控件形态(注意:skin只能对服务器端控件使用,所以现在已经不是单纯的input标签了,虽然这些服务器端控件“打到”前台的时候仍然是input控件)。

缺点:只能对服务器端控件使用。

js添加删除行和双击变文本框

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>
<html xmlns=”http://www.w3.org/1999/xhtml” >
<head>
    <title>js添加删除行和双击变文本框—阿会楠练习作品</title>
    <style type=”text/css”>
    *{
        font-size:12px;
    }
    #myTable{
        background:#D5D5D5;
        color:#333333;
    }
    
    #myTable tr{
        background:#F7F7F7;
    }
    #myTable tr th{
        height:20px;
        padding:5px;
    }
    #myTable tr td{
        padding:5px;
    }
    </style>
    <script type=”text/javascript”>
    function $(obj){
        return document.getElementById(obj);
    }
    
    var num = 0;
    function row(id){
        //构造函数
        this.id = $(id);
    }
    row.prototype = {
        //插入行
        insert:function(){
            num = num + 1;
            var newTr = this.id.insertRow(-1);
            var td_1 = newTr.insertCell(0);
            var td_2 = newTr.insertCell(1);
            var td_3 = newTr.insertCell(2);
            td_1.innerHTML = num;
            td_2.innerHTML = “脚本之家 www.jb51.net“;
            td_3.innerHTML = “<input type=’button’ onclick=’delRow(this)’ value=’删除’ >”;
        },
        //删除行
        del:function(obj){
            var i = obj.parentNode.parentNode.rowIndex;
            this.id.deleteRow(i);
        }
    }
      
    function addRow(){
        var row2 = new row(“myTable”);
        row2.insert();
    }
    
    function delRow(obj){ 
        var row1 = new row(“myTable”);
        row1.del(obj);
    }
    
    var inputItem; // 输入框句柄
    var activeItem; // 保存正在编辑的单元格
    
    //转成文本
    function changeToText(obj){
        if( obj && inputItem ) {
            // 如果存在正在编辑的单元格, 则取消编辑状态, 并将编辑的数据保存起来
            var str = ” “;
            if(inputItem.value != “”) 
                str = inputItem.value;
            obj.innerText = str;   
        }
    }
    
    //转成编辑
    function changeToEdit(obj){
         if( !inputItem ) {
              inputItem = document.createElement(‘input’);
              inputItem.type = ‘text’;
              inputItem.style.width = ‘100%’;
         }
        // inputItem.style.display = ”;
         inputItem.value = obj.innerText; // 将该单元格的数据文本读到控件上
         obj.innerHTML = ”; // 清空单元格的数据
         obj.appendChild(inputItem);
         inputItem.focus();
         activeItem = obj;
    }
    
    
    //双击时文本变成文本框
    document.ondblclick = function(){
        if(event.srcElement.tagName.toLowerCase() == “td”){
            if(!inputItem){
                inputItem = document.createElement(“input”);
                inputItem.type = “text”;
                inputItem.style.width = “100%”;
            }
            changeToText();
            changeToEdit(event.srcElement);
        }else{
            event.returnValue = false;
            return false;
        }
    }
    
    //单击时文本框变成文本
    document.onclick = function(){
        if(event.srcElement.parentNode == activeItem || event.srcElement == activeItem)
            return;
        else
            changeToText(activeItem);
    }
    </script>
</head>
<body>
<input type=”button” onclick=”addRow()” value=”插入一行” />
<table id=”myTable” border=”0″ cellpadding=”0″ cellspacing=”1″>
<tr><th>编号</th><th>姓名</th><th>操作</th></tr>
</table>
</body>
</html>