2012-03-07 2 views
0

Обновлен с полным кодомJQuery Делегат внутри Диалог - селектор не работает

У меня есть диалоговое окно JQuery, что я хочу, чтобы связать некоторые события обработчика нажмите чтобы с помощью JQuery делегата, но почему-то не работает ,

Это работает:

$('table.standard tbody td .delete').live('click', function() { 
    alert('delete something'); 
}); 

Это не работает, это вызывает предупреждение, когда я нажимаю ВЕЗДЕ внутри контейнера, но я только хочу для «.delete» селектора .

$('div.container').delegate('table.standard tbody td .delete', 'click', function() { 
    alert('delete something'); 
}); 

div.container является DIV внутри диалога. Я также пытался использовать тело и документ как контейнер, тот же аффект.

Вот полный код

Это своего рода работа, но он не получает привязку к селектору .delete класса, вместо этого, он связывается с целой строки.

function ClientTierDialog_class() { 
    var self = this; 

    this.fDialogBehavior = function(dialog) { 
     $(dialog).find("a.button").unbind("click").bind("click", function(e) { 

      if ($(this).hasClass("cancelButton")) { 
       $(dialog).dialog("close"); 
      } 
      else if ($(this).hasClass("okButton")) { 
       self.saveTier(); 
      } 
     }); 
    }; 

    this.$dialog = null; 

    this.baseOptions = { 
     id: "TierDialog", 
     width: 585, 
     height: 600, 
     className: "tier-dialog", 
     header: "Create Tier", 
     body: "", 
     buttonText: { 
      cancel: "Close", 
      ok: "Save" 
     }, 
     resizable: false, 
     modal: true, 
     fDialogBehavior: this.fDialogBehavior 
    }; 
} 

/*************************************************************** 
* Events 
***************************************************************/ 

ClientTierDialog_class.prototype.openDialog = function(options) { 
    var self = this; 
    var tierName = options.tierName; 
    var url = "Administration/GetClientTierDialog"; 

    this.$dialog = null; 

    $.ajax({ 
     url: url, 
     data: options, 
     success: function(response) { 
      var $content = $(response.html); 
      var options = self.baseOptions; 

      if (tierName !== undefined && tierName.length > 0) { 
       options.header = "Edit Tier"; 
      } 

      options.body = $content; 
      WSOD.dialog(options); 

      this.$dialog = $("div.tier-dialog"); 
      self.initEvents(); 
     }, 
     error: function() { 
      // Handle errors 
     } 
    }); 
}; 

ClientTierDialog_class.prototype.delete = function() { 
    $('table#addedFirms tbody tr').delegate('.delete', 'click', function() { 
     alert('delete something'); 
    }); 
}; 

ClientTierDialog_class.prototype.initEvents = function() { 
    var self = this; 
    self.delete(); 
}; 

$(document).ready(function() { 
    ClientTierDialog = new ClientTierDialog_class(); 
}); 

Спасибо.

+1

Существует ли 'div.container' в момент выполнения' делегата'? (Является ли он в обработчике событий готовности DOM?) –

+0

'div.container' существует, когда диалог открыт. Благодарю. – Saxman

+0

Вы должны разместить больше своих HTML и JS. – shanabus

ответ

0

Не видя больше кода его трудно быть уверенным, но это может быть, добавление делегата до инициализации диалогового окна или перед тем, как элемент div.content присутствует. Если это так, то div.container может не существовать и, следовательно, не будет связан.

Попробуйте это: http://jsbin.com/itiyel/4/edit#preview

Это похоже на работу и, возможно, это поможет вам.

1

Использование:

$(document).delegate('table.standard tbody td .delete', 'click', function() { 
    alert('delete something'); 
}); 
+0

Не удалось заставить $ (документ) работать. Пробовал $ ('body'), и я получил сигнал предупреждения везде, где я нажимаю! – Saxman

2

стандарты JQuery склоняется к on и off с версии 1.7+:

$('table.standard').on('click', '.delete', function() { 
    alert('delete something'); 
}); 
+0

Мы все еще на jQuery 1.5, поэтому «on» - это не вариант. Благодарю. – Saxman

+0

Вы знаете, обновление jQuery не только просто рекомендуется. Они исправили много ошибок с 1,5 и сделали удивительные улучшения производительности. – AlienWebguy

+0

Я понимаю, но я не могу принять это решение :) FYI, мы все еще на ASP.NET MVC 1, когда бета-версия MVC уже вышла! – Saxman

Смежные вопросы