JQuery найти обработчики событий, зарегистрированных с объектом

Это ужасный дизайн, и я его не рекомендую (вы должны просто создать другую таблицу), но это возможно.

Сначала вам нужно будет использовать атрибут byte[] для хранения сериализованной версии списка лиц, которые будут храниться в BLOB в базе данных. Так что аннотируйте его getter с @Lob (я бы сделал getter и setter private, чтобы не выставлять их). Затем выведите «fake» getter и setter для возврата или установите List из byte[]. Я использую SerializationUtils из Commons Lang в приведенном ниже примере (предоставит вам собственный вспомогательный класс, если вы не хотите импортировать эту библиотеку) для сериализации / десериализации на лету в / из byte[]. Не забудьте отметить «фальшивый» геттер с помощью @Transcient или Hibernate попытается создать поле (и сбой, потому что он не сможет определить тип для List).

@Entity(name = "family")
class Family implements Serializable {

    // ...

    private byte[] familyMembersAsByteArray;

    public Family() {}

    @Lob
    @Column(name = "members", length = Integer.MAX_VALUE - 1)
    private byte[] getFamilyMembersAsByteArray() { // not exposed
        return familyMembersAsByteArray;
    }

    private void setFamilyMembersAsByteArray((byte[] familyMembersAsByteArray() { // not exposed
        this.familyMembersAsByteArray = familyMembersAsByteArray;
    }

    @Transient
    public List getFamilyMembers() {
        return (List) SerializationUtils.deserialize(familyMembersAsByteArray);
    }

    public void setParticipants(List familyMembers) {
        this.familyMembersAsByteArray = SerializationUtils.serialize((Serializable) familyMembers);
    }
}

Не забудьте сделать класс Person Serializable и добавить реальный serialVersionUID (я просто показываю по умолчанию здесь):

public class Person implements Serializable {

   private static final long serialVersionUID = 1L;

   // ...

   private String firstName, lastName;
   private int age;

}

Но пусть пусть я настаиваю, это ужасный дизайн, и он будет очень хрупким (изменение Person может потребовать «переноса» содержимого BLOB, чтобы избежать проблем десериализации, и это станет болезненным. Вы действительно должны пересмотреть эту идею и использовать другую таблицу вместо Person (или я не понимаю, почему вы используете базу данных).

526
задан Ian 23 May 2013 в 21:22
поделиться

3 ответа

Начиная с jQuery 1.8, данные о событиях больше не доступны из "общедоступных" API »для данных. Прочтите это сообщение блога jQuery . Вместо этого вы должны использовать это:

jQuery._data( elem, "events" );

elem должен быть элементом HTML, а не объектом jQuery или селектором.

Обратите внимание, что это внутренняя, «частная» структура, и ее не следует изменять. Используйте это только для целей отладки.

В более старых версиях jQuery вам, возможно, придется использовать старый метод:

jQuery( elem ).data( "events" );
673
ответ дан 22 November 2019 в 22:23
поделиться

Я объединил некоторые ответы выше и создал этот сумасшедший взгляд, но функциональный сценарий, который перечисляет, надо надеяться, большинство слушателей события на данном элементе. Не стесняйтесь оптимизировать его здесь.

var element = $("#some-element");

// sample event handlers
element.on("mouseover", function () {
  alert("foo");
});

$(".parent-element").on("mousedown", "span", function () {
  alert("bar");
});

$(document).on("click", "span", function () {
  alert("xyz");
});

var collection = element.parents()
  .add(element)
  .add($(document));
collection.each(function() {
  var currentEl = $(this) ? $(this) : $(document);
  var tagName = $(this)[0].tagName ? $(this)[0].tagName : "DOCUMENT";
  var events = $._data($(this)[0], "events");
  var isItself = $(this)[0] === element[0]
  if (!events) return;
  $.each(events, function(i, event) {
    if (!event) return;
    $.each(event, function(j, h) {
      var found = false;        
      if (h.selector && h.selector.length > 0) {
        currentEl.find(h.selector).each(function () {
          if ($(this)[0] === element[0]) {
            found = true;
          }
        });
      } else if (!h.selector && isItself) {
        found = true;
      }

      if (found) {
        console.log("################ " + tagName);
        console.log("event: " + i);
        console.log("selector: '" + h.selector + "'");
        console.log(h.handler);
      }
    });
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="parent-element">
  <span id="some-element"></span>
</div>
0
ответ дан 22 November 2019 в 22:23
поделиться

Вы можете сделать это путем сканирования событий (начиная с jQuery 1.8+), например:

$.each($._data($("#id")[0], "events"), function(i, event) {
  // i is the event type, like "click"
  $.each(event, function(j, h) {
    // h.handler is the function being called
  });
});

Вот пример, с которым вы можете поиграть:

 $ (function () {$ ("# el ") .click (function () {alert (" click ");}); $ (" # el "). mouseover (function () {alert (" mouseover ");}); $ .each ($ ._ data ($ ("# el") [0], "events"), function (i, event) {output (i); $ .each (event, function (j, h) {output ("-" + h. обработчик);});});}); функция output (текст) {$ ("# output"). html (function (i, h) {return h + text + "
";}); }
  
Тест < / div>
82
ответ дан 22 November 2019 в 22:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: