discuz中用到的javascript函数解析 原创

  function ajaxupdateevents(obj, tagName) {

  tagName = tagName ? tagName : 'A';

  var objs = obj.getElementsByTagName(tagName);

  for(k in objs) {

  var o = objs[k];

  ajaxupdateevent(o);

  }

  }

  function ajaxupdateevent(o) {

  if(typeof o == 'object' && o.getAttribute) {

  if(o.getAttribute('ajaxtarget')) {

  if(!o.id) o.id = Math.random();

  var ajaxevent = o.getAttribute('ajaxevent') ? o.getAttribute('ajaxevent') : 'click';

  var ajaxurl = o.getAttribute('ajaxurl') ? o.getAttribute('ajaxurl') : o.href;

  _attachEvent(o, ajaxevent, newfunction('ajaxget', ajaxurl, o.getAttribute('ajaxtarget'), o.getAttribute('ajaxwaitid'), o.getAttribute('ajaxloading'), o.getAttribute('ajaxdisplay')));

  if(o.getAttribute('ajaxfunc')) {

  o.getAttribute('ajaxfunc').match(/(w+)((.+?))/);

  _attachEvent(o, ajaxevent, newfunction(RegExp.$1, RegExp.$2));

  }

  }

  }

  }

  /*

  *@ url: 需求请求的 url

  *@ id : 显示的 id

  *@ waitid: 等待的 id,默认为显示的 id,如果 waitid 为空字符串,则不显示 loading..., 如果为 null,则在 showid 区域显示

  *@ linkid: 是哪个链接触发的该 ajax 请求,该对象的属性(如 ajaxdisplay)保存了一些 ajax 请求过程需要的数据。

  */

  function ajaxget(url, showid, waitid, loading, display, recall) {

  waitid = typeof waitid == 'undefined' || waitid === null ? showid : waitid;

  var x = new Ajax();

  x.setLoading(loading);

  x.setWaitId(waitid);

  x.display = typeof display == 'undefined' || display == null ? '' : display;

  x.showId = $(showid);

  if(x.showId) x.showId.orgdisplay = typeof x.showId.orgdisplay === 'undefined' ? x.showId.style.display : x.showId.orgdisplay;

  if(url.substr(strlen(url) - 1) == '#') {

  url = url.substr(0, strlen(url) - 1);

  x.autogoto = 1;

  }

  var url = url + '&inajax=1&ajaxtarget=' + showid;

  x.get(url, function(s, x) {

  evaled = false;

  if(s.indexOf('ajaxerror') != -1) {

  evalscript(s);

  evaled = true;

  }

  if(!evaled && (typeof ajaxerror == 'undefined' || !ajaxerror)) {

  if(x.showId) {

  changedisplay(x.showId, x.showId.orgdisplay);

  changedisplay(x.showId, x.display);

  x.showId.orgdisplay = x.showId.style.display;

  ajaxinnerhtml(x.showId, s);

  ajaxupdateevents(x.showId);

  if(x.autogoto) scroll(0, x.showId.offsetTop);

  }

  }

  if(!evaled)evalscript(s);

  ajaxerror = null;

  if(recall) {eval(recall);}

  });

  }

  var ajaxpostHandle = 0;

  function ajaxpost(formid, showid, waitid) {

  showloading();

  var waitid = typeof waitid == 'undefined' || waitid === null ? showid : (waitid !== '' ? waitid : '');

  if(ajaxpostHandle != 0) {

  return false;

  }

  var ajaxframeid = 'ajaxframe';

  var ajaxframe = $(ajaxframeid);

  if(ajaxframe == null) {

  if (is_ie && !is_opera) {

  ajaxframe = document.createElement("");

  } else {

  ajaxframe = document.createElement("iframe");

  ajaxframe.name = ajaxframeid;

  ajaxframe.id = ajaxframeid;

  }

  //ajaxframe.id = ajaxframeid;

  ajaxframe.style.display = 'none';

  $('append_parent').appendChild(ajaxframe);

  }

  $(formid).target = ajaxframeid;

  ajaxpostHandle = [showid, ajaxframeid, formid, $(formid).target];

  if(ajaxframe.attachEvent) {

  ajaxframe.detachEvent ('onload', ajaxpost_load);

  ajaxframe.attachEvent('onload', ajaxpost_load);

  } else {

  document.removeEventListener('load', ajaxpost_load, true);

  ajaxframe.addEventListener('load', ajaxpost_load, false);

  }

  $(formid).submit();

  return false;

  //$(waitid).innerHTML = 'Loading...';

  }

  function ajaxpost_load() {

  showloading('none');

  if(is_ie) {

  var s = $(ajaxpostHandle[1]).contentWindow.document.XMLDocument.text;

  } else {

  var s = $(ajaxpostHandle[1]).contentWindow.document.documentElement.firstChild.nodeValue;

  }

  evaled = false;

  if(s.indexOf('ajaxerror') != -1) {

  evalscript(s);

  evaled = true;

  }

  if(!evaled && (typeof ajaxerror == 'undefined' || !ajaxerror)) {

  ajaxinnerhtml($(ajaxpostHandle[0]), s);

  if(!evaled)evalscript(s);

  setMenuPosition($(ajaxpostHandle[0]).ctrlid, 0);

  setTimeout("hideMenu()", 3000);

  }

  ajaxerror = null;

  if($(ajaxpostHandle[2])) {

  $(ajaxpostHandle[2]).target = ajaxpostHandle[3];

  //$(ajaxpostHandle[2]).removeChild($(ajaxpostHandle[1]));

  }

  ajaxpostHandle = 0;

  }

  function ajaxmenu(e, ctrlid, timeout, func, cache, duration, ismenu, divclass, optionclass) {

  showloading();

  if(jsmenu['active'][0] && jsmenu['active'][0].ctrlkey == ctrlid) {

  hideMenu();

  doane(e);

  return;

  } else if(is_ie && is_ie < 7 && document.readyState.toLowerCase() != 'complete') {

  return;

  }

  if(isUndefined(timeout)) timeout = 3000;

  if(isUndefined(func)) func = '';

  if(isUndefined(cache)) cache = 1;

  if(isUndefined(divclass)) divclass = 'popupmenu_popup';

  if(isUndefined(optionclass)) optionclass = 'popupmenu_option';

  if(isUndefined(ismenu)) ismenu = 1;

  if(isUndefined(duration)) duration = timeout > 0 ? 0 : 3;

  var div = $(ctrlid + '_menu');

  if(cache && div) {

  showMenu(ctrlid, e.type == 'click', 0, duration, timeout, 0, ctrlid, 400, 1);

  if(func) setTimeout(func + '(' + ctrlid + ')', timeout);

  doane(e);

  } else {

  if(!div) {

  div = document.createElement('div');

  div.ctrlid = ctrlid;

  div.id = ctrlid + '_menu';

  div.style.display = 'none';

  div.className = divclass;

  $('append_parent').appendChild(div);

  }

  var x = new Ajax();

  var href = !isUndefined($(ctrlid).href) ? $(ctrlid).href : $(ctrlid).attributes['href'].value;

  x.div = div;

  x.etype = e.type;

  x.optionclass = optionclass;

  x.duration = duration;

  x.timeout = timeout;

  x.get(href + '&inajax=1&ajaxmenuid='+ctrlid+'_menu', function(s) {

  evaled = false;

  if(s.indexOf('ajaxerror') != -1) {

  evalscript(s);

  evaled = true;

  if(!cache && duration != 3 && x.div.id) setTimeout('$("append_parent").removeChild($('' + x.div.id + ''))', timeout);

  }

  if(!evaled && (typeof ajaxerror == 'undefined' || !ajaxerror)) {

  if(x.div) x.div.innerHTML = '';

  showMenu(ctrlid, x.etype == 'click', 0, x.duration, x.timeout, 0, ctrlid, 400, 1);

  if(func) setTimeout(func + '("' + ctrlid + '")', x.timeout);

  //if(!cache && duration != 3 && x.div.id) setTimeout('document.body.removeChild($('' + x.div.id + ''))', timeout);

  }

  if(!evaled) evalscript(s);

  ajaxerror = null;

  showloading('none');

  });

  doane(e);

  }

  }

  //得到一个定长的hash值, 依赖于 stringxor()

  function hash(string, length) {

  var length = length ? length : 32;

  var start = 0;

  var i = 0;

  var result = '';

  filllen = length - string.length % length;

  for(i = 0; i < filllen; i++){

  string += "0";

  }

  while(start < string.length) {

  result = stringxor(result, string.substr(start, length));

  start += length;

  }

  return result;

  }

  function stringxor(s1, s2) {

  var s = '';

  var hash = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

  var max = Math.max(s1.length, s2.length);

  for(var i=0; i

  var k = s1.charCodeAt(i) ^ s2.charCodeAt(i);

  s += hash.charAt(k % 52);

  }

  return s;

  }

  function showloading(display, waiting) {

  var display = display ? display : 'block';

  var waiting = waiting ? waiting : 'Loading...';

  $('ajaxwaitid').innerHTML = waiting;

  $('ajaxwaitid').style.display = display;

  }

  function ajaxinnerhtml(showid, s) {

  if(showid.tagName != 'TBODY') {

  showid.innerHTML = s;

  } else {

  while(showid.firstChild) {

  showid.firstChild.parentNode.removeChild(showid.firstChild);

  }

  var div1 = document.createElement('DIV');

  div1.id = showid.id+'_div';

  div1.innerHTML = '

'+s+'
';

  $('append_parent').appendChild(div1);

  var trs = div1.getElementsByTagName('TR');

  var l = trs.length;

  for(var i=0; i

  showid.appendChild(trs[0]);

  }

  var inputs = div1.getElementsByTagName('INPUT');

  var l = inputs.length;

  for(var i=0; i

  showid.appendChild(inputs[0]);

  }

  div1.parentNode.removeChild(div1);

  }

  }

  var hiddenobj = new Array();

  var pmwinposition = new Array();

  function pmwin(action, param) {

  var objs = document.getElementsByTagName("OBJECT");

  if(action == 'open') {

  for(i = 0;i < objs.length; i ++) {

  if(objs[i].style.visibility != 'hidden') {

  objs[i].setAttribute("oldvisibility", objs[i].style.visibility);

  objs[i].style.visibility = 'hidden';

  }

  }

  var clientWidth = document.body.clientWidth;

  var clientHeight = document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight;

  var scrollTop = document.body.scrollTop ? document.body.scrollTop : document.documentElement.scrollTop;

  var pmwidth = 800;

  var pmheight = clientHeight * 0.9;

  if(!$('pmlayer')) {

  div = document.createElement('div');div.id = 'pmlayer';

  div.style.width = pmwidth + 'px';

  div.style.height = pmheight + 'px';

  div.style.left = ((clientWidth - pmwidth) / 2) + 'px';

  div.style.position = 'absolute';

  div.style.zIndex = '999';

  $('append_parent').appendChild(div);

  $('pmlayer').innerHTML = '

' +

  '

' +

  '

' +

  '' +

  '

';

  }

  $('pmlayer').style.display = '';

  $('pmlayer').style.top = ((clientHeight - pmheight) / 2 + scrollTop) + 'px';

  if(!param) {

  pmframe.location = 'pm.php';

  } else {

  pmframe.location = 'pm.php?' + param;

  }

  } else if(action == 'close') {

  for(i = 0;i < objs.length; i ++) {

  if(objs[i].attributes['oldvisibility']) {

  objs[i].style.visibility = objs[i].attributes['oldvisibility'].nodeValue;

  objs[i].removeAttribute('oldvisibility');

  }

  }

  hiddenobj = new Array();

  $('pmlayer').style.display = 'none';

  }

  }

  var pmwindragstart = new Array();

  function pmwindrag(obj) {

  obj.onmousedown = function(e) {

  if(is_ie) {

  document.body.onselectstart = function() {

  return false;

  }

  }

  pmwindragstart = is_ie ? [event.clientX, event.clientY] : [e.clientX, e.clientY];

  pmwindragstart[2] = parseInt($('pmlayer').style.left);

  pmwindragstart[3] = parseInt($('pmlayer').style.top);

  $('pmwinmask').style.display = '';

  doane(e);

  }

  _attachEvent(document.body, 'mousemove', function(e) {

  if(pmwindragstart[0]) {

  var pmwindragnow = is_ie ? [event.clientX, event.clientY] : [e.clientX, e.clientY];

  with($('pmlayer')) {

  style.left = (pmwindragstart[2] + pmwindragnow[0] - pmwindragstart[0]) + 'px';

  style.top = (pmwindragstart[3] + pmwindragnow[1] - pmwindragstart[1]) + 'px';

  }

  doane(e);

  }

  });

  obj.onmouseup = function(e) {

  if(is_ie) {

  document.body.onselectstart = function() {

  return true;

  }

  }

  pmwindragstart = [];

  $('pmwinmask').style.display = 'none';

  doane(e);

  }

  obj.onmouseover = null;

  }

  function pmchecknew() {

  ajaxget('pm.php?checknewpm=' + Math.random(), 'pmnotice', 'ajaxwaitid');

  }

  var discuz_uid = isUndefined(discuz_uid) ? 0 : discuz_uid;

  if(discuz_uid && !getcookie('checkpm') && typeof IN_ADMINCP == 'undefined') {

  if(document.attachEvent) {

  window.attachEvent('onload', pmchecknew);

  } else {

  window.addEventListener('load', pmchecknew, false);

  }

  }

  您可能感兴趣的文章: