【问题标题】:Jquery Dialog issueJquery 对话框问题
【发布时间】:2011-05-28 07:48:00
【问题描述】:

为了通过 $.extend() 方法使用 jquery UI 对话框模块,我写了这个:

User.confirmationDialog = function(options)
{
  if(undefined === options.selector)
  {
      return false;
  }

  this.close = function()
  {
    modal.dialog('close');
  }

  this.forward = function()
  {
    if(undefined !== trigger.attr('href'))
    {
      document.location.href = trigger.attr('href');
    }
  }

  var modalButtons = {};
  if(undefined !== options.buttons)
  {
    for(var buttonTitle in options.buttons)
    {
      modalButtons[buttonTitle] = (function(e, f)
      {
        return function() {
          e.call(f);
        }
      })(options.buttons[buttonTitle], this);
    }
    delete options.buttons;
  }

  var modalHtmlElementId = 'confirmDialog';
  if(undefined !== options.id)
  {
    modalHtmlElementId = options.id;
    delete options.id;
  }

  var modalOptions = jQuery.extend({
    autoOpen: false,
    width: 410,
    height: 'auto',
    minHeight: false,
    dialogClass: 'modalDefault',
    modal: true,
    resizable: false,
    draggable: false,
    close: function()
    {
      bindTriggers();
    },
    open: function()
    {
      unbindTriggers();
    },
    buttons: modalButtons
  }, options || {});

  var modal = jQuery('<div />', {'id': modalHtmlElementId});
  if(undefined !== options.text)
  {
    modal.html(options.text);
  }
  modal.dialog(modalOptions);


  var trigger = null;
  var onTriggerClick = function(e)
  {
    e.preventDefault();
    trigger = jQuery(e.target);
    if(undefined !== options.beforeOpen)
    {
      options.beforeOpen.call(trigger, modal, e);
    }
    modal.dialog('open');
  };

  //bind custom event to current options.selector elements
  var bindTriggers = function()
  {
    jQuery(options.selector).live('click', onTriggerClick);
  }

  //unbind custom event to current options.selector elements
  var unbindTriggers = function()
  {
    jQuery(options.selector).die('click', onTriggerClick);
  }

  //First init: bind custom event listener on option.selector
  bindTriggers();
}

/*
*
* @required User.confirmationDialog
*/
User.singleBtnDialog = function (options)
{
  if(undefined === options.selector) return false;

  var text= options.text,
      ok = options.okBtnTxt,
      dialogButton = {};

  dialogButton[ok] = function()
  {
    this.forward();
  };

  var modalOptions = jQuery.extend({
    selector: options.selector,
    text : text,
    closeOnEscape: false,
    open: function(event, ui)
    {
      jQuery(".ui-dialog-titlebar-close").hide()
    },
    buttons: dialogButton
  }, options || {});
  User.confirmationDialog(modalOptions);
}

User.twoBtnDialog = function(options)
{
  if(undefined === options.selector) return false;

  var text= options.text,
      ok = options.okBtnTxt,
      cancel = options.cancelBtnTxt,
      dialogButtons = {};

  dialogButtons[ok] = function()
  {
    forward();
  };
  dialogButtons[cancel] = function()
  {
    close();
  };

  var modalOptions = jQuery.extend({
    selector: options.selector,
    text: text,
    buttons: dialogButtons
  }, options || {});
  User.confirmationDialog(modalOptions);
};

User.ajaxContentDialog = function(options)
{
  if(undefined === options.selector) return false;

  var modalOptions = jQuery.extend({
    selector: options.selector,
    beforeOpen: function(modal, e)
    {
      e.stopPropagation();
      jQuery.ajax({
         async: false,
         type: 'GET',
         url: this.attr('href'),
         success: function(data, textStatus, XMLHttpRequest)
         {
          modal.html(data);
         }
      });
    }
  }, options || {});
  User.confirmationDialog(modalOptions);
};

前端,我实际上以这种方式绑定了 3 种方法(singbutton、2buttons 或 ajax)中的任何一种:

 [User.singleBtnDialog, {
      okBtnTxt: 'Ok',
      text: 'blablablablabl',
      selector: '.addToFav'}],

    [User.twoBtnDialog, {
      okBtnTxt: 'Ok',
      cancelBtnTxt: 'Ablehnen',
      text: 'blablablablabl',
      selector: '.topicOpenClose'}],

我的问题很简单,但我似乎无法轻松解决: 事件在我的每个选择器上都很好地绑定,按钮被正确创建,但是,当点击“确定”按钮时,我得到一个

trigger is null
[Break On This Error] if(undefined !== trigger.attr('href')) 

错误。我怀疑对范围有误解,但似乎找不到正确的解决方案。

感谢您的帮助,非常感谢。

【问题讨论】:

    标签: jquery scope jquery-ui-dialog undefined


    【解决方案1】:

    是的,这是一个范围问题。尝试使用User.confirmationDialog.forward(); 调用它,如果这不起作用,则使该函数公开可用。

    编辑:你应该把你的函数变成带有函数的对象并且只调用那些函数。

    User.confirmationDialog = {
    
     recent_function: function(options){
       // do ...
     }
    
     close: function()
      {
        alert('close');
      }
      ...
    }
    

    调用User.confirmationDialog.recent_function 将运行之前的函数confirmationDialog。 您现在可以使用User.confirmationDialog.close(); 访问关闭

    【讨论】:

    • 我很想,但我该怎么做呢? :O
    • 好的,所以我显然在使用公共函数时遇到了问题。正如您在上面的源代码中看到的,this.forward() 在语法上是正确的,不是吗?然而,当尝试绑定每个按钮时,例如 dialogBu​​tton[ok] = function() { this.forward(); };我得到的只是一个 User.confirmationDialog.forward 不是一个函数...:/
    • 这就是为什么你应该使用具有功能的对象,我编辑了我的帖子
    猜你喜欢
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多