jQuery: найти клонированного ребенка в клонированном родителе? - PullRequest
3 голосов
/ 03 сентября 2010

Допустим, у меня есть метод расширения jQuery:

$.fn.foobar = function() {
    var clone = this.parent().clone();
};

После того как я получил clone, как я могу найти клонированный дочерний элемент, который совпадает с this?

Будет ли это работать?

$.fn.foobar = function() {
    var clone = this.parent().clone();
    var cloneOfThis = clone.find(this);
};

Или это?

$.fn.foobar = function() {
    var clone = this.parent().clone();
    var self = this;
    var cloneOfThis;
    clone.children().each(function() {
        var $this = $(this);
        if ($this === self) {
            cloneOfThis = $this;
        }
    });
};

Ответы [ 3 ]

3 голосов
/ 03 сентября 2010

Вы можете попытаться дать ему какой-то уникальный класс, который можно использовать для ссылки на соответствующий элемент.

$.fn.foobar = function() {
      // Add a class to "this", then clone its parent
    var clonedParent = this.addClass("someUniqueClass").parent().clone();
      // Reference the new clone of "this" inside the cloned parent,
      //   then remove the class
    var cloneOfThis = clonedParent.find(".someUniqueClass").removeClass("someUniqueClass");
      // Remove the class from the original
    this.removeClass("someUniqueClass");
};
1 голос
/ 03 сентября 2010

Вы не можете получить эталонное сравнение, чтобы работать здесь, потому что this не в клоне, это оригинальный элемент, он не был перемещен. Элемент , такой как , который вы клонировали, находится в клонированном родительском элементе, поэтому вы должны решить, что означает «тот же», это тот же идентификатор, тот же контент HTML, то же значение?

Вам просто нужно выбрать значение, которое вы можете сравнить, потому что здесь ссылка не сработает ... вы не можете найти то, чего там нет:)

0 голосов
/ 03 сентября 2010

Подумав немного дальше о ответе Патрика Д.В. и включив комментарий Феликса Кинга, я бы предложил следующее:

$.fn.foobar = function() {
    return $(this).each(function() {
        // Add a class to "this", then clone its parent
        var clonedParent = $(this).addClass("someUniqueClass").parent().clone();

        // Reference the new clone of "this" inside the cloned parent
        var cloneOfThis = clonedParent.find(".someUniqueClass");

        //remove the unique class to preserve the original state (other than the clone which is now present)
        $('.someUniqueClass').add(cloneOfThis).removeClass('someUniqueClass');
    });
};
...