`
sunxboy
  • 浏览: 2871536 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

【Prototype 1.4.0】源码解读(二)

阅读更多
//【结点的位置处理:Position对象】
/* prevent memory leaks in IE */
Event.observe(window, 'unload', Event.unloadCache, false);
var Position = {
  // set to true if needed, warning: firefox performance problems
  // NOT neeeded for page scrolling, only if draggable contained in
  // scrollable elements
  includeScrollOffsets: false,

  // must be called before calling withinIncludingScrolloffset, every time the
  // page is scrolled用于计算滚动条的位置信息
  prepare: function() {
    this.deltaX =  window.pageXOffset
                || document.documentElement.scrollLeft
                || document.body.scrollLeft
                || 0;
    this.deltaY =  window.pageYOffset
                || document.documentElement.scrollTop
                || document.body.scrollTop
                || 0;
  },
//计算节点的绝对滚动位置返回包含两个元素的数组到文档左侧 顶部的距离
  realOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.scrollTop  || 0;
      valueL += element.scrollLeft || 0;
      element = element.parentNode;
    } while (element);
    return [valueL, valueT];
  },
//计算结点相对于文档的绝对滚动位置,返回包含两个元素的数组到文档左侧 顶部的距离
  cumulativeOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
    } while (element);
    return [valueL, valueT];
  },
//相对位置
  positionedOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
      if (element) {
        p = Element.getStyle(element, 'position');
        if (p == 'relative' || p == 'absolute') break;
      }
    } while (element);
    return [valueL, valueT];
  },

  offsetParent: function(element) {
    if (element.offsetParent) return element.offsetParent;
    if (element == document.body) return element;

    while ((element = element.parentNode) && element != document.body)
      if (Element.getStyle(element, 'position') != 'static')
        return element;

    return document.body;
  },

  // caches x/y coordinate pair to use with overlap是否在element内
  within: function(element, x, y) {
    if (this.includeScrollOffsets)
      return this.withinIncludingScrolloffsets(element, x, y);
    this.xcomp = x;
    this.ycomp = y;
    this.offset = this.cumulativeOffset(element);

    return (y >= this.offset[1] &&
            y <  this.offset[1] + element.offsetHeight &&
            x >= this.offset[0] &&
            x <  this.offset[0] + element.offsetWidth);
  },

  withinIncludingScrolloffsets: function(element, x, y) {
    var offsetcache = this.realOffset(element);

    this.xcomp = x + offsetcache[0] - this.deltaX;
    this.ycomp = y + offsetcache[1] - this.deltaY;
    this.offset = this.cumulativeOffset(element);

    return (this.ycomp >= this.offset[1] &&
            this.ycomp <  this.offset[1] + element.offsetHeight &&
            this.xcomp >= this.offset[0] &&
            this.xcomp <  this.offset[0] + element.offsetWidth);
  },

  // within must be called directly before
  overlap: function(mode, element) {
    if (!mode) return 0;
    if (mode == 'vertical')
      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
        element.offsetHeight;
    if (mode == 'horizontal')
      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
        element.offsetWidth;
  },
//克隆结点 常用于拖放
  clone: function(source, target) {
    source = $(source);
    target = $(target);
    target.style.position = 'absolute';
    var offsets = this.cumulativeOffset(source);
    target.style.top    = offsets[1] + 'px';
    target.style.left   = offsets[0] + 'px';
    target.style.width  = source.offsetWidth + 'px';
    target.style.height = source.offsetHeight + 'px';
  },

  page: function(forElement) {
    var valueT = 0, valueL = 0;

    var element = forElement;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;

      // Safari fix
      if (element.offsetParent==document.body)
        if (Element.getStyle(element,'position')=='absolute') break;

    } while (element = element.offsetParent);

    element = forElement;
    do {
      valueT -= element.scrollTop  || 0;
      valueL -= element.scrollLeft || 0;
    } while (element = element.parentNode);

    return [valueL, valueT];
  },

  clone: function(source, target) {
    var options = Object.extend({
      setLeft:    true,
      setTop:     true,
      setWidth:   true,
      setHeight:  true,
      offsetTop:  0,
      offsetLeft: 0
    }, arguments[2] || {})

    // find page position of source
    source = $(source);
    var p = Position.page(source);

    // find coordinate system to use
    target = $(target);
    var delta = [0, 0];
    var parent = null;
    // delta [0,0] will do fine with position: fixed elements,
    // position:absolute needs offsetParent deltas
    if (Element.getStyle(target,'position') == 'absolute') {
      parent = Position.offsetParent(target);
      delta = Position.page(parent);
    }

    // correct by body offsets (fixes Safari)
    if (parent == document.body) {
      delta[0] -= document.body.offsetLeft;
      delta[1] -= document.body.offsetTop;
    }

    // set position
    if(options.setLeft)   target.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
    if(options.setTop)    target.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
    if(options.setWidth)  target.style.width = source.offsetWidth + 'px';
    if(options.setHeight) target.style.height = source.offsetHeight + 'px';
  },
//绝对定位
  absolutize: function(element) {
    element = $(element);
    if (element.style.position == 'absolute') return;
    Position.prepare();

    var offsets = Position.positionedOffset(element);
    var top     = offsets[1];
    var left    = offsets[0];
    var width   = element.clientWidth;
    var height  = element.clientHeight;

    element._originalLeft   = left - parseFloat(element.style.left  || 0);
    element._originalTop    = top  - parseFloat(element.style.top || 0);
    element._originalWidth  = element.style.width;
    element._originalHeight = element.style.height;

    element.style.position = 'absolute';
    element.style.top    = top + 'px';;
    element.style.left   = left + 'px';;
    element.style.width  = width + 'px';;
    element.style.height = height + 'px';;
  },
//相对定位
  relativize: function(element) {
    element = $(element);
    if (element.style.position == 'relative') return;
    Position.prepare();

    element.style.position = 'relative';
    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);

    element.style.top    = top + 'px';
    element.style.left   = left + 'px';
    element.style.height = element._originalHeight;
    element.style.width  = element._originalWidth;
  }
}

// Safari returns margins on body which is incorrect if the child is absolutely
// positioned.  For performance reasons, redefine Position.cumulativeOffset for
// KHTML/WebKit only.
if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
  Position.cumulativeOffset = function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      if (element.offsetParent == document.body)
        if (Element.getStyle(element, 'position') == 'absolute') break;

      element = element.offsetParent;
    } while (element);

    return [valueL, valueT];
  }
}

//--------->完成
 
分享到:
评论

相关推荐

    prototype-1.4.0源码解读.js

    《Prototype 1.4.0 源码解读:深入理解JavaScript库的基石》 Prototype 是一个著名的JavaScript库,它的1.4.0版本在Web开发领域有着广泛的使用。这个库为JavaScript程序员提供了许多实用的功能,包括对象扩展、类...

    【Prototype 1.4.0】源码解读----全文注释版

    【Prototype 1.4.0】是一个JavaScript框架,它的核心目标是简化动态Web开发,尤其强调面向对象的编程...尽管目前版本可能已更新至更高,但1.4.0版本的源码解读对于理解框架的设计理念和核心功能仍然具有很高的价值。

    prototype1.4.0

    "Prototype 1.4.0" 是一个JavaScript库,它为浏览器环境提供了许多实用的工具和功能,极大地简化了JavaScript的开发。这个版本是 Prototype 库的一个特定发行版,发布于2007年,旨在提升Web应用的性能和可维护性。在...

    Div+css布局教程,Prototype教程,js教程

    压缩包内包含的文件如下: 1.手册与教程: ...CSS 2.0样式表中文手册(推荐);...Prototype 1.4.0源码解读.txt; 4.prototype源码: prototype-1.5.1.2源码.js; prototype-1.6.0.2源码.js; Prototype 1.4.0源码.js.

    Prototype-1.4.0源码注释版

    Prototype-1.4.0源码注释版. prototype.js是一个非常优雅的javascript基础类库,对javascript做了大量的扩展,而且很好的支持Ajax,国外有多个基于此类库实现的效果库. prototype.js是由Sam Stephenson写的一...

    prototype 1.4.0

    prototype 1.4.0

    prototype1.4.0开发笔记

    万一你没有使用过大名鼎鼎的prototype.js,那么让我来告诉你,prototype.js是由Sam Stephenson写的一个javascript类库。这个构思奇妙,而且兼容标准的类库,能帮助你轻松建立有高度互动的web2.0特性的富客户端页面。...

    novnc-1.4.0源码包

    1、novnc-1.4.0源码包 2、可使用novnc在浏览器访问vnc

    prototype-1.4.0.rar及开发手册

    "prototype-1.4.0.rar" 是这个库的一个版本,包含了库的源代码和相关的开发资源。在本文中,我们将深入探讨Prototype.js 1.4.0版本的主要特性和用法。 Prototype.js 的核心概念之一是扩展JavaScript的基本类型,如...

    ethercat-1.4.0源码

    ethercat是目前使用较多的工业以太网解决方案。主站硬件无关,可以在通用的xp平台上面移植。ethercat-1.4.0源码,研究工业以太网不可缺少的研究对象。

    prototype-1.4.0

    "Prototype JavaScript 框架 1.4.0 版本" Prototype JavaScript 框架是一种广泛使用的开源库,旨在简化 JavaScript 编程,提高开发效率。它在2005年由 Sam Stephenson 发布,成为了当时Web开发中的重要工具,特别是...

    shiro 1.4.0 源码、jar包、javadoc

    包含 apache shiro-core v1.4.0 的 java源码、jar包、以及 javadoc。从源码库中整理而来。手动补充了源库 shiro-core-1.4.0-sources.jar 中缺少的 aop、cache、io、event、config、cryptor 等源代码,便于统一查看

    libjpeg-turbo-1.4.0源码

    **libjpeg-turbo-1.4.0源码详解** `libjpeg-turbo`是一个高效的JPEG图像处理库,它是对原始`libjpeg`库的优化版本,特别是在使用SSE2指令集的处理器上,其性能提升显著。1.4.0版本是该库的一个重要里程碑,它包含了...

    社群圈子通讯录v1.4.0源码-优化部分页面的显示.txt

    社群圈子通讯录v1.4.0源码-优化部分页面的显示

    编译好的worldwind1.4.0源码

    编译好的worldwind1.4.0源码,可以直接运行,显示3D地球,下载下来直接用vs2010打开运行就行了, debug和release的都编译通过了。 我的环境: win7,vs.net2010,32位系统。

    修改过的World Wind_1.4.0源码

    "World Wind_1.4.0源码"是一个开源项目,专为开发人员提供地球建模和虚拟全球导航的功能。这个修改过的版本是针对原始World Wind 1.4.0的源代码进行了一些修复和改进,使其能够在Visual Studio 2010这样的开发环境中...

    prototype-1.4.0.rar

    "Prototype 1.4.0" 是一个JavaScript库,它为JavaScript编程提供了许多实用功能,大大简化了DOM操作,事件处理以及对象扩展等任务。这个压缩包“prototype-1.4.0.rar”包含了该库的各个组成部分和相关文档,为开发者...

    CF1.4.0源码,非原创

    东西好不好,看了才知道.稳定才是王道

Global site tag (gtag.js) - Google Analytics