function outputNumbers(count) {
    (function () {
        for (var i =0;i < count; i++) {
            alert(i);
        }
    })();

    alsert(i);    //导致一个错误!
}

      块作用域经常,这种技术在全局作用中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。一般来说,我们都应该尽量少向全局作用域中添加变量和函数。在一个由很多人员共同参与的大型应用程序中,过多的全局变量和函数很容易导致命名冲突。而通过创建私有作用域,每个开发人员即可以使用自己的变量,又不必担心搞乱全局作用域。

JavaScript是单线程语言,但它允许通过设置超时值和间歇时间值来调度代码在特定的时刻执行。

前者是在指定的时间过后执行代码,而后者则是每隔指定的时间就执行一次代码。

var timeoutId = setTimeOut(function, ms);

clearTimeOut(timeoutId);

var intervalId = setInterval(function, ms);

clearInterval(intervalId);

在开发环境中,很少使用真正的间歇调用,原因是后一个间歇调用可能会在前一个间歇调用结束之前启动。

 

动态加载脚本

动态加载js

function loadScript(url) {
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src = url;
    document.body.appendChild(script);
}

 

function loadScriptString(code) {
    var script = document.createElement("script");
    script.type = "text/javascript";
    try {
        script.appendChild(document.createTextNode(code));
    }
    catch (ex) {
        script.text = code;
    }

    document.body.appendChild(script);
}

动态加载css

function loadStyles(url) {
    var link = document.createElement("link");
    link.rel = "stylesheet";
    link.type = "text/css";
    link.href = url;
    var head = document.getElementsByTagName("head")[0];
    head.appendChild(link);
}

 

function loadStyleString(css) {
    var style = document.createElement("style");
    style.type = "text/css";
    try  {
        style.appendChild(document.createTextNode(css));
    }catch (ex)  {
        style.stylesheet.cssText = css;
    }

    var head = document.getElementsByTagName("head")[0];
    head.appendChild(style);
}

11.2.3 元素大小

1. 偏移量

包括元素在屏幕上占用的所有可见的空间。

offsetHeight: 元素在垂直方向上占用的空间大小,单位像素。包括元素的高度、(可见的)水平滚动条的高度、上边框高度和下边框高度。

offsetWidth:元素在水平方向上占用的空间大小,单位像素。包括元素的宽度、(可见的)垂直滚动条的宽度、左边框宽度和右边框宽度。

offsetLeft:元素的左外边框至包含元素的上内边框之间的像素距离。

offsetTop:元素的上外边框至包含元素的上内边框之间的像素距离。

2. 客户区大小

客户区大小(client dimension)指的是元素内容及其内边距所占据的空间大小。属性:clientWidth和clientHeight。

3. 滚动大小

指的是包含桂东内容的元素的大小。

scrollHeight:在没有滚动条的情况下,元素内容的总高度。

scrollWidth:在没有滚动条的情况下,元素内容的总宽度。

scrollLeft:被隐藏在内容区域左侧的像素数。通过设置这个属性可以改变元素的滚动位置。

scrollTop:被隐藏在内容区域上方的像素数。通过设置这个属性可以改变元素的滚动位置。

注意,对于运行在混杂模式的IE,则需要用document.body代替document.documentElement。

function scrollToTop(element) {
    if (element.scrollTop != 0) {
        element.scrollTop = 0;
    }
}

11.2.2 操作样式表

CSSStyleSheet类型表示的样式表,包括通过<link>元素包含的样式表和在<style>元素中定义的样式表。它们分别是由HTMLLinkElement和HTMLStyleElementHTML类型表示的。

function getStyleSheet(element) {
    return element.sheet || element.styleSheet;    //styleSheet针对IE
}

//跨浏览器插入规则,可以使用如下函数
function insertRule(sheet, selectorText, cssText, position) {
    if (sheet.insertRule) {
        sheet.insertRule(selectorText + "{" + cssText + "}", position);
    }else if (sheet.addRule) {
        sheet.addRule(selectorText, cssText, position);
    }
}

 

//跨浏览器删除样式
function deleteRule(sheet, index) {
    if (sheet.deleteRule) {
        sheet.deleteRule(index);
    } else if (sheet.removeRule) {
        sheet.removeRule(index);
    }
}

12.1.3 DOM事件流

“DOM2级事件”规定的事件流包括三个阶段:事件捕获阶段、处于目标阶段和事件冒泡阶段。

首先发生的是事件捕获,为截获事件提供了机会。然后是实际的目标接收到事件。最后一个阶段是冒泡阶段,可以在这个阶段对事件作出响应。

 

12.2 事件处理程序(或事件侦听器)

跨浏览器的事件处理。默认采用DOM0方法。

var EventUtil = {
    addHandler: function(element, type, handler) {
        if (element.addEventListener) {
            element.addEventListener(type, handler, false);
        } else if (element.attachEvent) {
            element.attachEvent(type, handler, false);
        } else {
            element["on" + type] = handler;
        }
    },

    getEvent: function(event) {
        return event ? event :window.event;
    },
    getTarget: function(event) {
        return event.target  || event.srcElement;
    },
    preventDefault: function(event) {
        if (event.preventDefault) {
            event.preventDefault();
        } else {
            event.returnValue = false;
        }
    }

   
    removeHandler: function(elemet, type, handler) {
        if (elemet.removeEventListener) {
            elemet.removeEventListener(type, handler, false);
        } else if (elemet.detachEvent) {
            element.detachEvent(type, handler, false);
        } else {
            elemet["on" + type] = null;
        }
    }

   stopPropagation: function(event) {
        if (event.stopPropagation) {
            event.stopPropagation();
         } else {
            event.cancelable = true;
    }
}

};

 

只有cancelable属性设置为true的事件,才可以使用preventDefault()来取消其默认行为。另外,stopPropagation()方法用于立即停止事件在DOM层次中的传播,即取消进一步的事件捕获或冒泡。

事件对象的eventPhase属性,可以用来确定事件当前正位于事件流的哪个阶段。如果是在捕获阶段调用的事件处理程序,那么eventPhase等于1;如果事件处理程序处于目标对象上,则eventPhase等于2;如果是在冒泡阶段调用的事件处理程序,eventPhase等于3.

12.4 事件类型

不同的事件类型具有不同的信息,而“DOM2级事件”规定了5中事件:

  1. ·  UI(User Interface,用户界面)事件,在用户与页面上的元素交互时触发;
  2. · 鼠标事件,当用户通过鼠标在页面上执行操作时触发;
  3. · 键盘事件,当用户通过键盘在页面上执行操作时触发;
  4. · HTML事件,当浏览器窗口发生变化或发生特定的客户端/服务器交互时触发;
  5. · 变动事件,当底层DOM结构发生变化时触发。

12.4.1 UI事件

       UI事件主要与元素的焦点相关,而且仅在兼容DOM的浏览器中受到了支持。有3个:

       ·  DOMActive:表示元素已经被用户操作(通过鼠标或者键盘)激活;

       · DOMFocusIn:表示元素已经获得了焦点;这是HTML中focus事件的普通版;

       · DOMFocusOut:表示元素已经失去了焦点;这是HTML中blur事件的普通版。

支持这几个UI事件的浏览器很少!

12.4.2 鼠标事件

        7个鼠标事件:

        · click:单击。在用户单击主鼠标按钮或者按下回车键时触发。

        · dbclick:双击。

        · mousedown:按下鼠标按键。不能通过键盘触发这个事件。

        · mouseout:鼠标移出。键盘触发移动不能触发这个事件。

        · mouseover:鼠标移入。不能通过键盘触发这个事件。

        · mouseup:释放鼠标。不能通过键盘触发这个事件。

        · mousemove:鼠标移动。不能通过键盘触发这个事件。

       页面上的所有元素都支持鼠标事件。所有鼠标事件都会冒泡,也可以被取消,而取消鼠标事件将会影响浏览器的默认行为。取消鼠标事件还会影响其他事件,因为鼠标事件与其他事件是密不可分的关系。

        1. 客户区坐标位置

         鼠标事件都是在浏览器视口中的特定位置上发生的。这个位置信息保存在事件对象的clientX和clientY属性中。所有浏览器都支持这两个属性,它们的值表示事件发生时鼠标指针在视口中的水平和垂直坐标。

        2. 屏幕坐标位置

        通过screenX和screenY属性就可以确定鼠标事件发生时鼠标指针相对于整个屏幕的坐标信息。

        3. 修改键

        Shift、Ctrl、Alt和Meta(在window键盘中是windows键,在苹果机中是Cmd键),它们经常被用来修改鼠标事件的行为。Dom规定了4个属性,表示这些修改键的状态:shiftKey、ctrlKey、altKey和metaKey。这些属性中包含的都是布尔值。如果被按下,则值为true,否则为false。

         4. 相关元素

DOM通过event对象的relatedTarget属性提供了相关元素的信息。
var EventUtil = {
    //省略了其他代码

    getRelatedTarget : function(event) {
        if (event.relatedTarget) {
            return event.relatedTarget;
        } else if (event.toElement) {
            return event.toElement;
        } else if (event.fromElement) {
            return event.fromElement;
        } else {
            return null;
        }
    }
}

 

JavaScript 高级程序设计 第二版的更多相关文章

  1. JavaScript 高级程序设计第二版

    20.4 部署 20.4.1 构建 构建过程始于在源控制中定义用于存储文件的逻辑结构.最好避免使用一个文件存放所有的JavaScript,遵循以下面向对象语言中的典型模式:将每个对象或自定义了类别分别 ...

  2. javascript高级程序设计第二章知识点提炼

    这是我整理的javascript高级程序设计第二章的脑图,内容也是非常浅显与简单.希望您看了我的博客能够给我一些意见或者建议.

  3. javascript高级程序设计---第二、三章

    在HTML中引用javaScript javascript的几个属性  type async(异步加载 只适用于外部JS且IE8以上 HTML5规范 先于load执行) src defer(延迟加载 ...

  4. javascript高级程序设计第二章

    看后总结: 1.js代码用得最多的两种加载方式: a)外部文件形式:<script type="text/javascript" src="jquery.min.j ...

  5. 读书笔记 - javascript 高级程序设计 - 第二章 在Html中使用JavaScript

    1 <script>的6个属性 async  立即下载当前script标签的外部脚本 但不能影响别的 charset 没用了 defer  文档显示之后再执行脚本,只对外部脚本有效 lan ...

  6. 《JavaScript高级程序设计》(第二版)

    这本书的作者是 Nicholas C.Zakas ,博客地址是 http://www.nczonline.net/ ,大家可以去多关注,雅虎的前端工程师,是YUI的代码贡献者,可想而知这本书得含金量, ...

  7. 《JavaScript高级程序设计(第3版)》阅读总结记录第一章之JavaScript简介

    前言: 为什么会想到把<JavaScript 高级程序设计(第 3 版)>总结记录呢,之前写过一篇博客,研究的轮播效果,后来又去看了<JavaScript 高级程序设计(第3版)&g ...

  8. JavaScript高级程序设计(第三版)学习笔记20、21、23章

    第20章,JSON JSON(JavaScript Object Notation,JavaScript对象表示法),是JavaScript的一个严格的子集. JSON可表示一下三种类型值: 简单值: ...

  9. (读书笔记)函数参数浅析-JavaScript高级程序设计(第3版)

    ECMAScript函数不介意传递的参数个数,因为在其内部是用一个数组进行表示的.在函数体内可以通过arguments对象来访问这个参数数组,就像我们正常访问数组一样处理. arguments对象只是 ...

随机推荐

  1. 【防坑指南】nginx重启后出现[error] open() “/usr/local/var/run/nginx/nginx.pid” failed

    重新启动nginx后,出现报错,原因就是下没有nginx文件夹或没有nginx.pid文件,为什么会没有呢? 原因就是每次重新启动,系统都会自动删除文件,所以解决方式就是更改pid文件存储的位置, 打 ...

  2. C语言中用于计算数组长度的函数 “strlen() ”。

    de>#include<stdio.h>#include<stdlib.h>#define MAX_LEN 255int my_strlen1(const char* s ...

  3. SQLServer常用分页方式

    mysql的分页是基于limit关键字,oracle的分页是基于rownum行号,SQLserver的分页在下面进行研究,是基于SQLServer2012进行的测试. 0.原来的SQL的所有数据 下面 ...

  4. GridView item设置点击背景

    GridView item设置点击背景 android:listSelector="@android:color/transparent"

  5. android 控件设置透明度

    问题:java文件中引用组件设置透明度:mGuideLayout.getBackground().setAlpha(125); 一直报null 修改办法:对应的布局文件中添加 android:back ...

  6. NIO相关

    Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/G ...

  7. PHP反序列化漏洞

    反序列化漏洞利用的条件 1.程序中存在序列化字符串的输入点. 2.程序中存在可以利用的魔术方法. 反序列化漏洞的一个简单DEMO <?php class example { public $ha ...

  8. Tomcat 部署及配置

    下载,解压tomcat.jdk 1.解压,链接tomcat.jdk tar xf jdk-8u161-linux-x64.tar.gz .tar.gz .0_161/ /usr/local/ .0_1 ...

  9. http和ftp下载的区别

    HTTP和FTP是两种网络传输协议的缩写,FTP是File Transportation Protocol(文件传输协议)的缩写,而HTTP则是Hyper Text Transportation Pr ...

  10. HDU - 1402 A * B Problem Plus FFT裸题

    http://acm.hdu.edu.cn/showproblem.php?pid=1402 题意: 求$a*b$ 但是$a$和$b$的范围可以达到 $1e50000$ 题解: 显然...用字符串模拟 ...