2018-11-05(参考基础阮一峰大神记录)一

随笔以防止忘记

闭包



    
        
        
    
    
        

闭包


移动端适配链接(淘宝弹性布局方案https://www.cnblogs.com/lyzg/p/5058356.html)


获取网页 宽高 元素定位

因此,document元素的clientHeight和clientWidth属性,就代表了网页的大小。

  function getViewport(){
    if (document.compatMode == "BackCompat"){
      return {
        width: document.body.clientWidth,
        height: document.body.clientHeight
      }
    } else {
      return {
        width: document.documentElement.clientWidth,
        height: document.documentElement.clientHeight
      }
    }
  }

//上面的getViewport函数就可以返回浏览器窗口的高和宽。使用的时候,有三个地方需要注意:

//1)这个函数必须在页面加载完成后才能运行,否则document对象还没生成,浏览器会报错。

//2)大多数情况下,都是document.documentElement.clientWidth返回正确值。但是,在IE6的quirks模式中,document.body.clientWidth返回正确的值,因此函数中加入了对文档模式的判断。

//3)clientWidth和clientHeight都是只读属性,不能对它们赋值。

//三、获取网页大小的另一种方法

//网页上的每个元素还有scrollHeight和scrollWidth属性,指包含滚动条在内的该元素的视觉面积。

//那么,document对象的scrollHeight和scrollWidth属性就是网页的大小,意思就是滚动条滚过的所有长度和宽度。

//仿照getViewport()函数,可以写出getPagearea()函数。

  function getPagearea(){
    if (document.compatMode == "BackCompat"){
      return {
        width: document.body.scrollWidth,
        height: document.body.scrollHeight
      }
    } else {
      return {
        width: document.documentElement.scrollWidth,
        height: document.documentElement.scrollHeight
      }
    }
  }

//但是,这个函数有一个问题。如果网页内容能够在浏览器窗口中全部显示,不出现滚动条,那么网页的clientWidth和scrollWidth应该相等。但是实际上,不同浏览器有不同的处理,这两个值未必相等。所以,我们需要取它们之中较大的那个值,因此要对getPagearea()函数进行改写。

  function getPagearea(){
    if (document.compatMode == "BackCompat"){
      return {
        width: Math.max(document.body.scrollWidth,
                document.body.clientWidth),
        height: Math.max(document.body.scrollHeight,
                document.body.clientHeight)
      }
    } else {
      return {
        width: Math.max(document.documentElement.scrollWidth,
                document.documentElement.clientWidth),
        height: Math.max(document.documentElement.scrollHeight,
                document.documentElement.clientHeight)
      }
    }
  }

获取元素位置

引用 getBoundingClientRect() 方法

window.onload=function(){
    var h1=document.getElementsByClassName('h2')[0]
//  var X= h1.getBoundingClientRect().left;
//  
//  var Y =h1.getBoundingClientRect().top;
    console.log(h1.getBoundingClientRect())
//  alert(X)
//它返回一个对象,其中包含了left、right、top、bottom四个属性,分别对应了该元素的左上角和右下角相对于浏览器窗口(viewport)左上角的距离。
//
//所以,网页元素的相对位置就是
//
//  var X= this.getBoundingClientRect().left;
//
//  var Y =this.getBoundingClientRect().top;
//
//再加上滚动距离,就可以得到绝对位置
//
//  var X= this.getBoundingClientRect().left+document.documentElement.scrollLeft;
//
//  var Y =this.getBoundingClientRect().top+document.documentElement.scrollTop;
}


javascript this 指向问题 http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascript.html

this是 JavaScript 语言的一个关键字。

它是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用。


function test() {
 this.x = 1;
}

上面代码中,函数test运行时,内部会自动有一个this对象可以使用。

那么,this的值是什么呢?

函数的不同使用场合,this有不同的值。总的来说,this就是函数运行时所在的环境对象。下面分四种情况,详细讨论this的用法。

情况一:纯粹的函数调用

这是函数的最通常用法,属于全局性调用,因此this就代表全局对象。请看下面这段代码,它的运行结果是1。


var x = 1;
function test() {
   console.log(this.x);
}
test();  // 1

情况二:作为对象方法的调用

函数还可以作为某个对象的方法调用,这时this就指这个上级对象。


function test() {
  console.log(this.x);
}

var obj = {};
obj.x = 1;
obj.m = test;

obj.m(); // 1

情况三 作为构造函数调用

所谓构造函数,就是通过这个函数,可以生成一个新对象。这时,this就指这个新对象。


function test() {
 this.x = 1;
}

var obj = new test();
obj.x // 1

运行结果为1。为了表明这时this不是全局对象,我们对代码做一些改变:


var x = 2;
function test() {
  this.x = 1;
}

var obj = new test();
x  // 2

运行结果为2,表明全局变量x的值根本没变。

情况四 apply 调用

apply()是函数的一个方法,作用是改变函数的调用对象。它的第一个参数就表示改变后的调用这个函数的对象。因此,这时this指的就是这第一个参数。


var x = 0;
function test() {
 console.log(this.x);
}

var obj = {};
obj.x = 1;
obj.m = test;
obj.m.apply() // 0

apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。

如果把最后一行代码修改为


obj.m.apply(obj); //1

运行结果就变成了1,证明了这时this代表的是对象obj。

你可能感兴趣的:(2018-11-05(参考基础阮一峰大神记录)一)