为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能

复制代码 代码如下:

  $("#dialog").dialog({

  bgiframe: true,

  autoOpen: false,

  position: [PosX, PosY], //alert 出来为:" , "(不含双引号),或者报错,不知什么原因。

  height: 300,

  modal: true,

  buttons: {

  '创建新账号': function() {

  var bValid = true;

  allFields.removeClass('ui-state-error');

  bValid = bValid && checkLength(name, "username", 3, 16);

  bValid = bValid && checkLength(email, "email", 6, 80);

  bValid = bValid && checkLength(password, "password", 5, 16);

  bValid = bValid && checkRegexp(name, /^[a-z]([0-9a-z_])+$/i, "Username may consist of a-z, 0-9, underscores, begin with a letter.");

  // From jquery.validate.js (by joern), contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/

  bValid = bValid && checkRegexp(email, /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i, "eg. [email protected]");

  bValid = bValid && checkRegexp(password, /^([0-9a-zA-Z])+$/, "Password field only allow : a-z 0-9");

  if (bValid) {

  $('#users tbody').append('<tr>' +

  '<td>' + name.val() + '</td>' +

  '<td>' + email.val() + '</td>' +

  '<td>' + password.val() + '</td>' +

  '</tr>');

  $(this).dialog('close');

  };

  },

  取消: function() {

  $(this).dialog('close');

  }

  },

  close: function() {

  allFields.val('').removeClass('ui-state-error');

  }

  });

  后来参考"wind"的为jquery.ui.dialog 增加“自动记住关闭时的位置”的功能。,在他的建议下,完全照葫芦画瓢写了个jquery.ui.dialog的重载方法,实现在鼠标当前位置打开dialog

  代码如下

  

复制代码 代码如下:

  ///////////////////////////////////

  //指定 jquery.ui.dialog打开时的位置

  ///////////////////////////////////

  (function($) {

  var originOpen = $.ui.dialog.prototype.open

  $.ui.dialog.prototype.open = function() {

  //var event= window.event || arguments.callee.caller.arguments[0];

  //var event = event || window.event;

  var event = getEvent();

  //alert(event) // ie 和 ff下,都显示 "[object]"

  var PosX = 0;

  var PosY = 0;

  if (event.pageX || event.pageY) {

  PosX = event.pageX;

  PosY = event.pageY;

  }

  else {

  PosX = event.clientX + document.body.scrollLeft - document.body.clientLeft;

  PosY = event.clientY + document.body.scrollTop - document.body.clientTop;

  };

  this.options.position = [PosX, PosY];

  //alert(this.options.position);

  originOpen.apply(this, arguments);

  };

  function getEvent() { //同时兼容ie和ff的写法

  if (document.all) return window.event;

  func = getEvent.caller;

  while (func != null) {

  var arg0 = func.arguments[0];

  if (arg0) {

  if ((arg0.constructor == Event || arg0.constructor == MouseEvent)

  || (typeof (arg0) == "object" && arg0.preventDefault && arg0.stopPropagation)) {

  return arg0;

  }

  }

  func = func.caller;

  }

  return null;

  }

  })(jQuery);

  再次感谢"wind"。感谢 jww测试。(已兼容ie7,8,firefox3.5,chrome4)