JavaScript与DOM(下)
介绍
操作元素
document.getElementById('intro').style.color = '#FF0000';
var myDocument = document;
var myIntro = myDocument.getElementById('intro');
var myIntroStyles = myIntro.style;
// 现在,我们可以设置颜色了:
myIntroStyles.color = '#FF0000';
myIntroStyles.padding = '2px 3px 0 3px';
myIntroStyles.backgroundColor = '#FFF';
myIntroStyles.marginTop = '20px';
myIntroStyles.padding-top = '10em';
// 产生语法错误:
// 在JavaScript里横线-是减法操作符
// 而且也没有这样的属性名称
function changeStyle(elem, property, val) {
elem.style[property] = val; // 使用[]来访问属性}
// 使用上述的函数:
var myIntro = document.getElementById('intro');
// 获取intro文本对象
changeStyle(myIntro, 'color', 'red');
var myIntro = document.getElementById('intro');
// 替换当前的内容
myIntro.innerHTML = 'New content for the amazing paragraph!';
// 添加内容到当前的内容里
myIntro.innerHTML += '... some more content...';
Node节点
var myIntro = document.getElementById('intro');
// 添加内容
var someText = 'This is the text I want to add';
var textNode = document.createTextNode(someText);
myIntro.appendChild(textNode);
var myIntro = document.getElementById('intro');
// 添加新连接到文本节点
// 首先,创建新连接元素
var myNewLink = document.createElement('a'); //
myNewLink.href = 'http://google.com'; //
myNewLink.appendChild(document.createTextNode('Visit Google'));
// Visit Google
// 将内容附件到文本节点
myIntro.appendChild(myNewLink);
// 'Target'是DOM里已经存在的元素
// 'Bullet'是要插入的新元素
function insertAfter(target, bullet) {
target.nextSibling ?
target.parentNode.insertBefore(bullet, target.nextSibling)
: target.parentNode.appendChild(bullet);
}
// 使用了3目表达式:
// 格式:条件?条件为true时的表达式:条件为false时的表达式
Event事件
鼠标事件
‘mousedown’ – 鼠标设备按下一个元素的时候触发mousedown事件。 ‘mouseup’ – 鼠标设备从按下的元素上弹起的时候触发mouseup事件。 ‘click’ – 鼠标点击元素的时候触发click事件。 ‘dblclick’ – 鼠标双击元素的时候触发dblclick事件。 ‘mouseover’ – 鼠标移动到某元素上的时候触发mouseover事件。 ‘mouseout’ – 鼠标从某元素离开的时候触发mouseout事件。 ‘mousemove’ – 鼠标在某元素上移动但未离开的时候触发mousemove事件。
键盘事件
‘keypress’ – 按键按下的时候触发该事件。 ‘keydown’ – 按键按下的时候触发该事件,并且在keypress事件之前。 ‘keyup’ – 按键松开的时候触发该事件,在keydown和keypress事件之后。
表单事件
‘select’ – 文本字段(input, textarea等)的文本被选择的时候触发该事件。 ‘change’ – 控件失去input焦点的时候触发该事件(或者值被改变的时候)。 ‘submit’ – 表单提交的时候触发该事件。 ‘reset’ – 表单重置的时候触发该事件。 ‘focus’ – 元素获得焦点的时候触发该事件,通常来自鼠标设备或Tab导航。 ‘blur’ – 元素失去焦点的时候触发该事件,通常来自鼠标设备或Tab导航。
其它事件
‘load’ – 页面加载完毕(包括内容、图片、frame、object)的时候触发该事件。 ‘resize’ – 页面大小改变的时候触发该事件(例如浏览器缩放)。 ‘scroll’ – 页面滚动的时候触发该事件。 ‘unload’ – 从页面或frame删除所有内容的时候触发该事件(例如离开一个页面)。
事件处理
<button id="my-button">Click me!button>
// JavaScript:
var myElement = document.getElementById('my-button');
// 事件处理句柄:
function buttonClick() {
alert('You just clicked the button!');
}
// 注册事件
myElement.onclick = buttonClick;
<button onclick="return buttonClick()">Click me!button>
// 格式:target.addEventListener( type, function, useCapture );
// 例子:
var myIntro = document.getElementById('intro');
myIntro.addEventListener('click', introClick, false);
// 格式: target.attachEvent ( 'on' + type, function );
// 例子:
var myIntro = document.getElementById('intro');
myIntro.attachEvent('onclick', introClick);
function introClick() {
alert('You clicked the paragraph!');
}
function addEvent(elem, type, fn) {
if (elem.attachEvent) {
elem.attachEvent('on' + type, fn);
return;
}
if (elem.addEventListener) {
elem.addEventListener(type, fn, false);
}
}
function removeEvent(elem, type, fn) {
if (elem.detachEvent) {
elem.detachEvent('on' + type, fn);
return;
}
if (elem.removeEventListener) {
elem.removeEventListener(type, fn, false);
}
}
var myIntro = document.getElementById('intro');
addEvent(myIntro, 'click', function () {
alert('YOU CLICKED ME!!!');
});
// 注意:前提是我们已经定于好了addEvent/removeEvent函数
// (定义好了才能使用哦)
var myIntro = document.getElementById('intro');
addEvent(myIntro, 'click', oneClickOnly);
function oneClickOnly() {
alert('WOW!');
removeEvent(myIntro, 'click', oneClickOnly);
}
addEvent(myIntro, 'click', function () {
alert('WOW!');
removeEvent(myIntro, 'click', arguments.callee);
});
关于W3C和微软模型还有其他的少许差异,比如this,在触发事件的时候函数中的this一般都是该元素上下文,,也就说this引用该元素自身,在基本事件注册和W3C模型中都没有问题,但在微软模型的实现里却可能出错,请参考如下代码:
function myEventHandler() {
this.style.display = 'none';
}
// 正常工作,this是代表该元素
myIntro.onclick = myEventHandler;
// 正常工作,this是代表该元素
myIntro.addEventListener('click', myEventHandler, false);
// 不正常,这时候的this是代表Window对象
myIntro.attachEvent('onclick', myEventHandler);
Event对象
function myEventHandler(e) {
// 注意参数e
// 该函数调用的时候e是event对象(W3C实现)
// 兼容IE的代码
e = e || window.event;
// 现在e就可以兼容各种浏览器了
}
// 这里可以自由地绑定事件了
if (!e) {
e = window.event;
} // 没有else语句,因为e在其它浏览器已经定义了
function myEventHandler(e) {
e = e || window.event;
// 防止默认行为
if (e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false;
}
}
事件冒泡
这样你就可以利用该特性去处理自己的逻辑了,并且再任何时候都可以停止冒泡,比如,如果你只想冒泡到文本节点上,而不再进一步冒泡,你可以在p的click事件处理函数里丁停止冒泡:
function myParagraphEventHandler(e) {
e = e || window.event;
// 停止向上冒泡
if (e.stopPropagation) {
// W3C实现
e.stopPropagation();
} else {
// IE实现
e.cancelBubble = true;
}
}
// 使用我们自定义的addEvent函数将myParagraphEventHandler绑定到click事件上:
addEvent(document.getElementsByTagName('p')[0], 'click', myParagraphEventHandler);
var myTable = document.getElementById('my-table');
myTable.onclick = function () {
// 处理浏览器兼容
e = e || window.event;
var targetNode = e.target || e.srcElement;
// 测试如果点击的是TR就触发
if (targetNode.nodeName.toLowerCase() === 'tr') {
alert('You clicked a table row!');
}
}
总结
评论