JavaScript大杂烩9 - 理解BOM
<script type="text/javascript">
alert(this);
// 下面这两个可不局限于只能使用在全局作用域中,它们在任何时候获得的都是Window对象
alert(self);
alert(window);
</script>
这里的self专指窗口对象本身,它返回的对象跟window对象一模一样。
var a = 10;
alert(a);
alert(window.a);
以后的例子中,我就省略window对象了。
alert用于显示一段信息和一个确认按钮。
confirm用于显示一段信息,一个确认按钮和一个取消按钮。
prompt用于让用于输入一个信息。
看一个简单的例子就可以了:
<div id="testDiv" onclick="demo()">Click Me!</div>
<script type="text/javascript">
function demo() {
var result = confirm('确认处理div的事件吗?');
if (result == true) {
alert('你选择确认处理div的事件了');
var name = prompt('请输入你的名字!', 'Frank');
if (name != null && name != '') {
alert('Hello ' + name + '!');
}
} else {
alert('你选择取消处理div的事件了');
}
}
</script>
open方法用于打开一个新的浏览器窗口或查找一个已命名的窗口。
close方法用于关闭当前的窗口。
看一下的例子:
<div id="testDiv" onclick="demo()">Click Me!</div>
<script type="text/javascript">
function demo() {
open('http://www.google.com');
alert('新窗口已经打开,本窗口准备关闭!');
close();
}
</script>
注意open方法可以携带很多的参数,通过这些参数可以定制新窗口的许多特征,比如窗口大小,位置,状态等,不再详述,需要的时候直接查阅W3School上的说明即可。
eval('var a = 10; alert(a);');
eval用好了可以化腐朽为神奇,用坏了可以导致网页一败涂地,这是个争议最多,也是安全风险最高的操作之一因为恶意用户很可能给你的页面传输一些包含可执行代码的字符串,一旦你使用eval去执行了,有可能你的服务器就收到攻击了,所以我的建议也是尽量少用这个方法,除非你深知使用它不会有问题,并且代码只有你能控制,不会有别人干预,这个条件过于苛刻了。
var timeout = setTimeout(function() {
alert('timeout!');
}, 1000); //clearTimeout(timeout);
注意例子中的clearTimeout被注掉了,如果不注掉的话,那个alert就出不来了。
function animation() {
// 动画绘制...
document.writeln('动画重绘了...');
setTimeout('animation()', 1000);
}
// 启动动画流程
animation();
不过很多人推荐如下的动画写法,这种写法效率更高:
// 一般是在初始化以后启动动画的循环
(function animloop() {
// 创建动画的推荐做法,不推荐使用setTimeout或者setInterval方法
window.requestAnimationFrame(animloop);
// 动画的逻辑,通常是更新窗口的内容,形成动画
self.tick();
})();
setTimeout与clearTimeout配合使用也可以实现一些带停止效果的循环特效,比如下面的可停止秒表:
<input type="button" value="开始计时" onclick="timeCount()" />
<input type="text" id="timetxt" size="5" />
<input type="button" value="停止计时" onclick="stopCount()" />
<script type="text/javascript">
var count = 0;
var timeID;
function timeCount()
{
document.getElementById('timetxt').value = count;
count++;
// 下面的写法等同于: timeID = setTimeout(timeCount,1000);
timeID = setTimeout('timeCount()',1000);
}
function stopCount()
{
clearTimeout(timeID);
}
</script>
不过从语义上来说,下面的这两个方法也许更适合写这样的循环代码。
<input type="button" value="开始计时" onclick="startCount()" />
<input type="text" id="timetxt" size="5" />
<input type="button" value="停止计时" onclick="stopCount()" />
<script type="text/javascript">
var count = 0;
var timeID;
function addSecond() {
count++;
document.getElementById('timetxt').value = count;
}
function startCount()
{
document.getElementById('timetxt').value = 0;
// 下面的写法等同于: timeID = setInterval(addSecond, 1000);
timeID = setInterval('addSecond()', 1000);
}
function stopCount()
{
clearInterval(timeID);
}
</script>
我们可以使用setTimeout与setInterval实现很多有趣的效果,不过这里还有一个问题需要解决,那就是如何给调用的函数传参数?这要借助这两个函数的第一个参数,它们的第一个参数可以是函数名、匿名函数、函数的引用以及其他可执行代码。上面的例子中我们使用了字符串形式的调用和直接使用函数名字的方式,下面看一下使用匿名函数的形式创建闭包来传递参数:
function show(msg) {
alert(msg);
}
var msg = 'Hi!'
setTimeout(function() { show(msg);}, 100);
escape方法将参数字符串编码生成可以用于URL的新字符串,比如把空格写成“%20”这种格式。“+”不被编码,如果要“+”也被编码,请用:escape('...', 1)。
unescape是 escape的反过程。解码参数中字符串成为一般字符串。encodeURI与decodeURI两个方法是替代上面这两个方法的,功能基本没太大区别,但是推荐使用后面两个。
看个例子:
// 推荐使用encodeURI与decodeURI
var test1 = 'http://www.xxx.com.cn/My first/';
var test2 = encodeURI(test1);
document.write(test2 + '<br />');
document.write(decodeURI(test2) + '<br />'); var test3 = '?!=()#%&';
var test4 = escape(test3);
document.write(test4 + '<br />');
document.write( unescape(test4));
<input type="button" value="移动myWindow" onclick="moveWin()" />
<script type="text/javascript">
myWindow = window.open('', '', 'width=200,height=100');
myWindow.document.write('Hello');
</script>
<script type="text/javascript">
function moveWin() {
myWindow.moveTo(50,50)
}
</script>
当然了,使用innerwidth, innerheight等属性是可以获得窗口的尺寸信息的。
<input type="button" value="New" onclick="newDoc()"></input>
<input type="button" value="Back" onclick="goBack()"></input>
<input type="button" value="Forward" onclick="goForward()"></input>
<script type="text/javascript">
// 当前地址
document.write(location.href);
// 输入新地址
function newDoc(){
location.assign('http://www.w3schools.com/js/js_window_history.asp');
// 实现相同功能的其它方式
// location.href = 'http://www.w3schools.com/js/js_window_history.asp';
// location.replace('http://www.w3schools.com/js/js_window_history.asp');
}
// 后退到上一个地址,在这个例子中没什么意义,纯演示
function goBack(){
history.back();
}
// 前进道下一个地址
function goForward(){
history.forward();
}
</script>
对于使用location对象打开新页面的3种方式需要说明一点,assign与href方式都会把新地址加入到历史记录中,这样你可以执行前进与后退操作,但是使用replace方式只是替换了当前的地址,并不会再历史记录中添加新的记录。
<input type="button" value="Navigator" onclick="showBroswer()"></input>
<div id="example"></div>
<script type="text/javascript">
function showBroswer() {
var txt = '<p>Browser CodeName: ' + navigator.appCodeName + '</p>';
txt += '<p>Browser Name: ' + navigator.appName + '</p>';
txt += '<p>Browser Version: ' + navigator.appVersion + '</p>';
txt += '<p>Cookies Enabled: ' + navigator.cookieEnabled + '</p>';
txt += '<p>Platform: ' + navigator.platform + '</p>';
txt += '<p>User-agent header: ' + navigator.userAgent + '</p>';
txt += '<p>User-agent language: ' + navigator.systemLanguage + '</p>'; document.getElementById('example').innerHTML = txt;
}
</script>
我在Chrome上运行这个例子,得到下列混乱的信息:
Browser CodeName: Mozilla
Browser Name: Netscape
Browser Version: 5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36
Cookies Enabled: true
Platform: Win32
User-agent header: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36
User-agent language: undefined
这些信息通常不是很准确,比如浏览器的Name严重错误。除了appVersion和userAgent还可以勉强有解析的意义外,其他的似乎可以忽略了。
var Sys = {};
var ua = navigator.userAgent.toLowerCase();
var s;
(s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] :
(s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] :
(s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] :
(s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] :
(s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0; //以下进行测试
if (Sys.ie) document.write('IE: ' + Sys.ie);
if (Sys.firefox) document.write('Firefox: ' + Sys.firefox);
if (Sys.chrome) document.write('Chrome: ' + Sys.chrome);
if (Sys.opera) document.write('Opera: ' + Sys.opera);
if (Sys.safari) document.write('Safari: ' + Sys.safari);
3). Screen对象 - 屏幕几何信息的抽象
document.write("<p>可用高度: ")
document.write(screen.availHeight + "</p>")
document.write("<p>可用宽度: ")
document.write(screen.availWidth + "</p>")
document.write("<p>屏幕高度: ")
document.write(screen.height + "</p>")
document.write("<p>屏幕宽度: ")
document.write(screen.width + "</p>")
可用高度与可用宽度指的是去掉任务栏这些东西后剩余的空间。
JavaScript大杂烩9 - 理解BOM的更多相关文章
- JavaScript大杂烩11 - 理解事件驱动
前面我们回顾了前端JavaScript只干的两件事:操作BOM与操作DOM,那么什么时候去干这些事呢?答案是需要干的时候去干.那么什么时候是需要干的时候呢?答案是事件被触发的时候.这就是通常所说的“事 ...
- JavaScript大杂烩1 - 理解JavaScript的类型系统
随着硬件水平的逐渐提高,浏览器的处理能力越来越强大,本人坚信,客户端会越来越瘦,瘦到只用浏览器就够了,服务端会越来越丰满:虽然很多大型的程序,比如3D软件,客户端仍然会存在,但是未来的主流必将是浏览器 ...
- JavaScript大杂烩12 - 理解Ajax
AJAX缘由 再次谈起这个话题,我深深的记得就在前几年,AJAX被炒的如火如荼,就好像不懂AJAX,就不会Web开发一样.要理解AJAX为什么会出现,就要先了解Web开发面临的问题. 我们先来回忆一下 ...
- JavaScript大杂烩10 - 理解DOM
操作DOM 终于到了JavaScript最为核心的部分了,通常来说,操作DOM,为页面提供更为友好的行为是JavaScript根本目标. DOM树 - HTML结构的抽象 既然DOM是操纵HTML ...
- JavaScript大杂烩8 - 理解文本解析的"黄金搭档"
文本解析"黄金搭档" - String与RegExp对象 文本解析是任何语言中最常用的功能,JavaScript中也是一样,而正则表达式作为最常用的方式,JavaScript也同样 ...
- JavaScript大杂烩7 - 理解内置集合
JavaScript内置了很多对象,简单的类型如String,Number,Boolean (相应的"值类型"拥有相同的方法),复杂一点的如Function,Object,Arra ...
- JavaScript大杂烩6 - 理解JavaScript中的this
在JavaScript开发中,this是很常用的一个关键字,但同时也是一个很容易引入bug的一个关键字,在这里我们就专门总结一下页面中可能出现的this关键字(包括几种在其他页面文件中出现的this) ...
- JavaScript大杂烩4 - 理解JavaScript对象的继承机制
JavaScript是单根的完全面向对象的语言 JavaScript是单根的面向对象语言,它只有单一的根Object,所有的其他对象都是直接或者间接的从Object对象继承.而在JavaScript的 ...
- JavaScript大杂烩3 - 理解JavaScript对象的封装性
JavaScript是面向对象的 JavaScript是一种基于对象的语言,你遇到的所有东西,包括字符串,数字,数组,函数等等,都是对象. 面向过程还是面向对象? JavaScript同时兼有的面向过 ...
随机推荐
- js 学习记录(一)
前情提要: 本记录参照 <<javascript 入门导论>> 这本书学习
- selenium+Python(select定位)
1.Select元素 1.打开百度-设置-搜索设置界面,如下图所示 2.箭头所指位置,就是 select 选项框,打开页面元素定位,下方红色框框区域,可以看到 select 标签属性: <sel ...
- 交换路由中期测验20181226(动态路由配置与重分发、NAT转换、ACL访问控制列表)
测试拓扑: 接口配置信息 HostName 接口 IP地址 网关 Server 0 Fa0 172.16.15.1/24 172.16.15.254 Server 1 Fa0 100.2.15.200 ...
- TCP/IP 笔记 - TCP连接管理
TCP是一种面向连接的单播协议,在发送数据之前,通信双方必须在彼此建立一条连接:这与UDP的无连接不同,UDP无需通信双方发送数据之前建立连接.所有TCP需要处理多种TCP状态时需要面对的问题,比如连 ...
- Vue + Element UI 实现权限管理系统 前端篇(十):动态加载菜单
动态加载菜单 之前我们的导航树都是写死在页面里的,而实际应用中是需要从后台服务器获取菜单数据之后动态生成的. 我们在这里就用上一篇准备好的数据格式Mock出模拟数据,然后动态生成我们的导航菜单. 接口 ...
- spring的第二天
spring的第二天 ssm框架 spring 在昨天简单的介绍了一下spring,那么今天接着继续介绍. spring值的注入 自动装配[autowire] 引用资源 applicationCon ...
- FFmpeg封装格式处理4-转封装例程
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10506662.html FFmpeg封装格式处理相关内容分为如下几篇文章: [1]. F ...
- 浅析JavaScript正则表达式
1.正则表达式的定义 正则表达式是一个描述字符模式的对象.JavaScript的RegExp类表示正则表达式,String和RegExp都定义了方法,后者使用正则表达式进行强大的模式匹配和文本检索与替 ...
- 初识Scala
scala 是 scalable Language 的简写,是一门多范式的编程语言. scala是一种纯面向对象的语言每个值都是对象, 同时支持大量的函数式特性. scala运行于Java虚拟机(JV ...
- Java Generator
以前我以为只有Python才会有generator,看来当时的我才年轻,后来认真研读<Thinking in Java>之后大有感悟,原来Java亦有generator,故做一次记录分享. ...