實用的javascript程式碼片段

來源:互聯網
上載者:User

在Javascript項目開發過程中,往往一些短小精悍的功能函數總是能使一些疑難雜症迎刃而解,或者又能激發開發人員的編程靈感寫出更加強大的程式。所以在這裡,我將平時用到的或看到的一些優美的函數分門別類整理出來,也算是作為程式碼片段,方便日後尋找和學習。

將多個JavaScript函數綁定到onload事件處理函數上

function addLoadEvent(func){
  var oldonload = window.onload;
  if(typeof window.onload != 'function'){
    window.onload = func;
  }else{
    window.onload = function(){
      oldonload();
      func();
    }
  }
}

擷取元素真實、最終的CSS樣式屬性值的函數

//擷取指定元素(elem)的樣式屬性(name)
function getStyle(elem , name){
  //如果屬性存在於style[]中,那麼它已經被設定了(並且是當前的)
  if(elem.style[name])
   return elem.style[name];
  //否則,嘗試使用IE的方法
  else if(elem.currentStyle)
    return elem.currentStyle[name];
  //W3C方法
  else if(document.defaultView && document.defaultView.getComputedStyle){
    //它使用的是通用的'text-align'的樣式規則而非'textAlign'
    name = name.replace(/({A-Z})/g,"-$1");
    name = name.toLowerCase();
    //擷取樣式對象並擷取屬性(存在的話)值
    var s = document.defaultView.getComputedStyle(elem,"");
    return s && s.getPropertyValue(name);
  //否則使用的是其他瀏覽器
  }else
    return null;
}

元素位置

確定元素相對於整個文檔的x和y位置的輔助函數:

function pageX(elem){
 return elem.offsetParent?
 //如果能繼續獲得上一個元素,增加當前的位移量並繼續向上遞迴
 elem.offsetLeft + pageX(elem.offsetParent):
 //否則,擷取當前的位移量
 elem.offsetLeft;
}
function pageY(elem){
 return elem.offsetParent?elem.offsetTop + pageY(elem.offsetParent):elem.offsetTop;
}

確定元素相對於父級標籤位置的函數:

//擷取元素相對於父級標籤的水平位置
function parentX(elem){
 //如果offsetParent是元素的父級標籤,那麼提前退出
 return elem.parentNode == elem.offsetParent?
  elem.offsetLeft:
  //否則,需要找到元素和元素的父親相對於整個頁面位置,並計算它們的差
  pageX(elem)- pageX(elem.parentNode);
}

//擷取元素相對於父級標籤的垂直位置
function parentY(elem){
 return elem.parentNode  == elem.offsetParent ? elem.offsetTop : pageY(elem)-pageY(elem.parentNode);
}

設定元素x和y位置的函數:

//設定元素水平位置的函數
function setX(elem,pos){
 elem.style.left = pos + "px";
}

//設定元素垂直位置的函數
function setY(elem,pos){
 elem.style.top = pos + "px";
}

調整元素相對於當前位置的距離:

//在元素水平位置上增加距離
function addX(elem ,pos){
 setX(posX(elem) + pos);
}
//在元素垂直位置上增加距離
function addY(elem ,pos){
 setY(posY(elem) + pos);
}

元素的尺寸

擷取元素當前的高度和寬度

Code
function getHeight(elem){
  return parseInt(getStyle(elem, 'height'));
}

function getWidth(elem){
  return parseInt(getStyle(elem,'width'));
}

即使元素隱藏,亦能分別擷取它潛在的完整高度和寬度的兩個函數

Code
function fullHeight(elem){
  //如果元素是顯示的,那麼使用offsetHeight就能獲得高度,如果沒有offsetHeight,則使用getHeight()
  if(getStyle(elem,'display') != 'none')
    return elem.offsetHeight || getHeight(elem);
  //否則必須處理display為None的元素,所以重設它的css屬性以獲得更精確的讀數
  var old = resetCSS(elem,{display:'',visibility:'hidden', position:'absolute'});
  //使用clientHeight找出元素的完整高度,如果還不生效,則使用getHeight函數
  var h = elem.clientHeight || getHeight(elem);
  //恢複CSS的原有屬性
  restoreCSS(elem,old);
  //返回元素的完整高度
  return h;
}

function fullWidth(elem){
  if(getStyle(elem,'display')!='none')
    return elem.offsetWidth || getWidth(elem);
  var old = resetCSS(elem, {display:'',visibility:'hidden',position:'absolute'});
  var w = elem.clientHeight || getWidth(elem);
  restoreCSS(elem, old);
  return w;
}
}

設定CSS一組屬性的函數,可以恢複到原有設定;恢複CSS原有屬性,防止resetCSS函數副作用的函數

Code
function resetCSS(elem, prop){
  var old = {};
  for(var i in prop){
    //記錄舊的屬性值
    old[i] = elem.style[i];
    //設定新的值
    elem.style[i] = prop[i];
  }
  //返回已經變化的值的集合,預留給restoreCSS函數使用
  return old;
}

function restoreCSS(elem,prop){
  //重設所有屬性,恢複它們的原有值
  for(var i in prop)
    elem.style[i] = prop[i];
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.