2015-01-13 2 views
1

Предположим Jquery .each цикл:

function reverifyDiscounts() { 
    //everything we need to verify a discount is already on the page. 
    //we'll remove the "bad" discounts when we submit the page 
    console.info("Entering reverification"); 
    //event discounts are always valid once they're on the page because it's for the event 
    $(".discountPromoItem").each(function() { 
     //skip events 
     if ($(this).attr("appliesto") == $("#hdnEventID").val()) { 
      return true; 
     } 
     //we just need to make sure that the checkbox that the appliesto attribute references is checked! 
     if (!$("checkbox[attribute$='" + $(this).attr("applitesto") + "']").is(":checked")) { 
      //we also need to remove the promo code from the list of promo codes entered into the hidden textboxes 
      $("#hdnAppliedPromoCode").val($("#hdnAppliedPromoCode").val().replace($(this).attr("code"), "")); 
      //the item that it applies to is no longer selected and the promo must be removed 
      $(this).remove(); //can't remove $(this) while inside the loop for whatever reason. 
     } 
    }); 
    recalculate(); 
} 

Почему $(this).remove() неудачу или я делаю что-то не так?

+3

Вы можете иметь только один элемент с заданным идентификатором в документе –

+0

Позвольте мне изменить код, потому что я на самом деле делает это на классе ... держись ... – MetalPhoenix

+1

Прошу воспроизвести вашу проблему в скрипке. –

ответ

6

Update:

Помимо отсутствующего ) в конце концов, ваш код на самом деле работает: http://jsfiddle.net/TrueBlueAussie/hdc9ke9k/

Проблема должна быть в тесте if.

Попробуйте использовать фильтр затем сделать удалить последний:

function reverifyDiscounts() { 
    //everything we need to verify a discount is already on the page. 
    //we'll remove the "bad" discounts when we submit the page 
    console.info("Entering reverification"); 
    //event discounts are always valid once they're on the page because it's for the event 
    $(".discountPromoItem").filter(function() { 
     //skip events 
     if ($(this).attr("appliesto") == $("#hdnEventID").val()) { 
      return false; 
     } 
     //we just need to make sure that the checkbox that the appliesto attribute references is checked! 
     if (!$("checkbox[attribute$='" + $(this).attr("applitesto") + "']").is(":checked")) { 
      $("#hdnAppliedPromoCode").val($("#hdnAppliedPromoCode").val().replace($(this).attr("code"), "")); 
      return true; 
     } 
    }).remove(); 

    recalculate(); 
} 

Исходный код для оригинальной версии вопроса

each с селекторе не имеет смысла как ID должен быть уникальным, и только первый будет соответствовать.

Причина в том, что браузеры поддерживают высокоскоростной поисковый словарь каждого идентификатора по сравнению с одним элементом DOM. jQuery (и JavaScript) может получить только первое совпадение по идентификатору.

Используйте классы вместо множественного для согласования элемента:

$(".thatThing").each(function(){ 
    if (someBoolCondition){ 
     $(this).remove(); 
    } 

}); 

JSFiddle:http://jsfiddle.net/TrueBlueAussie/hdc9ke9k/

+0

Вот что я на самом деле делаю, я набирал селектор id по привычке. Я исправил код, чтобы исправить это. – MetalPhoenix

+0

В этом случае ваш код верен, поэтому ошибка, скорее всего, будет проводиться в тесте 'if'. Можете ли вы показать остальную часть реального кода? –

+0

Я поставил фактический код, который я использую, должен подчеркнуть проблему. Interstingly, я попытался сделать скрипку этого в упрощенной форме, и он работает ... – MetalPhoenix

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