Подтвердить что ты не робот

Как обновить сохраненную и сфотографированную переменную селектора jquery

Вчера я столкнулся с проблемой с jquery-селектором, который я назначил переменной, и это сводит меня с ума.

Вот jsfiddle с testcase:

  • назначьте .elem моему obj var
  • запишите обе длины на консоль. Результат = > 4
  • Удалите # 3 из DOM
  • log obj на консоли = > удаленный # 3 все еще существует, а длина - 4. Я понял, что запрос jquery снят? к переменной и не может? не будет? обновляться
  • log.elem к консоли.. yep Результат = > 3, а # 3 ушел
  • Теперь я обновляю .elem с новой шириной 300
  • logging obj и obj.width дает мне 300.. Итак, снимок был обновлен? Интересно, что 3 из 4 divs имеют новую ширину, но удаленный № 3 не...

Еще одно испытание: добавление элемента li в domtree и ведение журнала obj и .elem. .elem имеет новые li и obj не делает, потому что он все еще старый снимок

http://jsfiddle.net/CBDUK/1/

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

4b9b3361

Ответ 1

Да, это снимок. Кроме того, удаление элемента из дерева DOM страницы не волшебным образом приведет к исчезновению всех ссылок на элемент.

Вы можете обновить его так:

var a = $(".elem");

a = $(a.selector);

Mini-плагин:

$.fn.refresh = function() {
    return $(this.selector);
};

var a = $(".elem");

a = a.refresh();

Это простое решение не работает со сложными обходами. Вам нужно будет сделать синтаксический анализатор для свойства .selector для обновления моментального снимка для них.

Формат выглядит следующим образом:

$("body").find("div").next(".sibling").prevAll().siblings().selector
//"body div.next(.sibling).prevAll().siblings()"

Мини-плагин на месте:

$.fn.refresh = function() {
    var elems = $(this.selector);
    this.splice(0, this.length);
    this.push.apply( this, elems );
    return this;
};

var a = $(".elem");
a.refresh() //No assignment necessary

Ответ 2

Мне также понравилось решение @Esailija, но кажется, что у этого.селектора есть некоторые ошибки с фильтром. Поэтому я изменил свои потребности, возможно, кому-то это будет полезно

Это было для jQuery 1.7.2, который не тестировал обновление на отфильтрованных снимках в более высоких версиях

$.fn.refresh = function() { // refresh seletor
    var m = this.selector.match(/\.filter\([.\S+\d?(\,\s2)]*\)/); // catch filter string
    var elems = null;
    if (m != null) { // if no filter, then do the evarage workflow
        var filter = m[0].match(/\([.\S+\d?(\,\s2)]*\)/)[0].replace(/[\(\)']+/g,'');
        this.selector = this.selector.replace(m[0],''); // remove filter from selector
        elems = $(this.selector).filter(filter); // enable filter for it
    } else {
        elems = $(this.selector);
    }
    this.splice(0, this.length);
    this.push.apply( this, elems );
    return this;
};

Код не так красив, но он работал для моих фильтрованных селекторов.

Ответ 3

Jquery.selector устарел, лучше запоминать строку с селекторным значением некоторой переменной в тот момент, когда вы назначаете

function someModule($selector, selectorText) {
   var $moduleSelector = $selector;
   var moduleSelectorText = selectorText;

   var onSelectorRefresh = function() {
      $moduleSelector = $(moduleSelectorText);
   }
}

https://api.jquery.com/selector/

Ответ 4

Если вы используете remove(), он удалит только часть DOM, но не всех дочерних или связанных, вместо этого, если вы используете empty() для элемента, проблема исчезла.

например:.

 $('#parent .child).find('#foo').empty();

Может быть, это может быть полезно кому-то!