简易 Javascript DOM 包 | 元素水平垂直居中 | 动态执行 JS 代码 | 获取指定元素

这个简易的 DOM 包提供了三个功能,一是使特定的元素水平或者垂直居中;二是可以动态地执行字符串中的 JS 代码;三是最常用的一个操作,即:通过元素 ID 来获取指定的元素,返回单个元素引用或者多个元素引用的数组。

来看看源码:

/**
 * jscript.dom package
 * This package contains functions for accessing and manipulating the DOM.
 */
 /*命名空间*/
if (typeof jscript == 'undefined') {
  jscript = function() { }
}

jscript.dom = function() { }

/**
 * Center a given layer on the screen horizontally.
 *(水平居中一个元素 inObj)
 * @param inObj A reference to the element (presumably a layer) to center.
 */
jscript.dom.layerCenterH = function(inObj) {

  var lca;
  var lcb;
  var lcx;
  var iebody;
  var dsocleft;
   iebody = (document.compatMode &&
    document.compatMode != "BackCompat") ?
    document.documentElement : document.body;/*判断 IE 中页面采用的渲染方式*/
  if (window.innerWidth) {
    lca = window.innerWidth;
  } else {
    lca = iebody.clientWidth;
  }/*获取浏览器窗口的宽度*/
  lcb = inObj.offsetWidth;/*获取 layer 的宽度*/
  lcx = (Math.round(lca / 2)) - (Math.round(lcb / 2));
  dsocleft = document.all ? iebody.scrollLeft : window.pageXOffset;
  inObj.style.left = lcx + dsocleft + "px";

} // End layerCenterH().

/**
 * Center a given layer on the screen vertically.
 *(垂直居中一个元素)
 * @param inObj A reference to the element (presumably a layer) to center.
 */
jscript.dom.layerCenterV = function(inObj) {

  var lca;
  var lcb;
  var lcy;
  var iebody;
  var dsoctop;
  iebody = (document.compatMode &&
    document.compatMode != "BackCompat") ?
    document.documentElement : document.body;
  if (window.innerHeight) {
    lca = window.innerHeight;
  } else {
    lca = iebody.clientHeight;
  }
  lcb = inObj.offsetHeight;
  lcy = (Math.round(lca / 2)) - (Math.round(lcb / 2));
  dsoctop = document.all ? iebody.scrollTop : window.pageYOffset;
  inObj.style.top = lcy + dsoctop + "px";

} // End layerCenterV().

/**
 * This function is used to execute all the script blocks found in a
 * chunk of text.  This is typically used to execute the scripts found in
 * an AJAX response.
 *(此函数用来执行 <script> 块里面的 js 代码,可以把它用在 AJAX 的 response 上,也就是用来执行 response 里面的 <script>)
 * @param inText The text to parse scripts from to execute.
 */
jscript.dom.execScripts = function (inText) {

  var si = 0;
  while (true) {
    // Finding opening script tag.(找到开始处的标签)
    var ss = inText.indexOf("<" + "script" + ">", si);
    if (ss == -1) {
      return;
    }
    // Find closing script tag.(找到闭合处的标签)
    var se = inText.indexOf("<" + "/" + "script" + ">", ss);
    if (se == -1) {
      return;
    }
    // Jump ahead 9 characters, after the closing script tag.(跳过 9 个字符)
    si = se + 9;
    // Get the content in between and execute it.
    var sc = inText.substring(ss + 8, se);
    eval(sc);
  }

} // End execScripts().

/**
 * This function accepts one or more DOM IDs and returns an array which
 * contains a reference to all of them.  If no arguments are passed in,
 * null is returned.  If a single ID is passed in, a single element is
 * returned.  If more than one ID is passed in, an array is passed back.
 *(当传入一个 ID 的时候返回一个单独的 element,若传入多个 ID 的时候则会返回 elements 数组)
 * @param  ?? A variable number of arguments, each being a DOM ID to get a
 *            reference to (or a single ID).
 * @return    Null is no arguments passed in, or a reference to a single
 *            DOM element if one ID passed in, or an array of references to
 *            DOM elements if multiple IDs passed in.
 */
jscript.dom.getDOMElements = function() {

  if (arguments.length == 0) {
    return null;
  }
  if (arguments.length == 1) {
    return document.getElementById(arguments[0]);
  }
  var elems = new Array();
  for (var i = 0; i < arguments.length; i++) {
    elems.push(document.getElementById(arguments[i]));
  }
  return elems;

} // End getDOMElements().

这个包提供了跨浏览器的实现,注意代码在 IE 中的处理,与 IE 的版本相关,判断采用的渲染方式:

iebody = (document.compatMode && document.compatMode != "BackCompat") ?
          document.documentElement : document.body;

当 document.compatMode 等于 BackCompat(标准兼容模式关闭) 时,iebody 要取 document.body;

当 document.compatMode 等于 CSS1Compat (标准兼容模式开启)时,iebody 要取 document.documentElement。

来看看测试代码:

<a href="javascript:void(0);"
onClick="jscript.dom.execScripts('this is a string<script>alert(\'I am script within a string\');</script>more string');">
execScripts()-Execute the script blocks in a string
</a>
<br /><br />

<div >testElem1</div>
<div >testElem2</div>
<a href="javascript:void(0);"
onClick="alert(jscript.dom.getDOMElements('testElem1'));alert(jscript.dom.getDOMElements('testElem1','testElem2'));">
getDOMElements()-Get a single element, then multiple elements
</a>
<br /><br />

来看看测试效果:

execScripts()-Execute the script blocks in a string

testElem1

testElem2

getDOMElements()-Get a single element, then multiple elements

这里只测试了:execScripts() 和 getDOMElements() ,元素居中的函数可以自行测试下!:->