2013-07-22 3 views
0

У меня проблема, скрывающая поле атрибута, основанное на выборе из другого поля атрибута.SlideDown working, SlideUp, отказывающийся

Поскольку этого недостаточно, я подумал о добавлении кода jquery в свой блок нижнего колонтитула.

Постараюсь объяснить текущую ситуацию как можно лучше.

У меня есть поле выбора, что в настоящее время в настоящее время генерируется так:

<select id="edit-attributes-4" class="form-select ajax-processed" name="attributes[4]"> 
<option selected="selected" value="12"> 
    Verzenden, €15.44 
</option><option value="13"> 
    Ophalen, €8.03 
</option></select> 

И это:

<select id="edit-attributes-5" class="form-select ajax-processed" name="attributes[5]"> 
<option selected="selected" value="14"> 
    1 Fles, €15.44 
</option><option value="15"> 
    1 Doos, €92.64 
</option></select> 

Я хочу поле редактирования-атрибут-4, которые будут скрыты при загрузке страницы, так я добавил это в CSS код Wich также в том же колонтитула блока:

#edit-attributes-4 { 
    display:none; 
    clear: both; 
} 

Четкое и был suggesti из некоторых выводов Google о том, что слайд-вскрытие не работает, я не уверен, что он делает, но в любом случае это не имеет никакого значения, по крайней мере, скрытие действительно работает при загрузке страницы.

Этот бит является JQuery код которым также в блоке колонтитула:

$(document).ready(function(){ 
    $("#edit-attributes-5").change(function(){ 

     if ($(#edit-attributes-5).val() == "15") { 
      $("#edit-attributes-4").slideDown("fast") 

     } else { 
       $("#edit-attributes-4").slideUp("fast") 
     } 
    }); 
}); 

поясню какие happpends, и что работает прекрасно, как всякий раз, когда поле атрибута 5 изменяется на значение 15, который должен купить 1 дюжину вместо одного единственного продукта, он показывает поле атрибута 4, чтобы иметь возможность выбирать значение 13, которое дает скидку для его сбора, вместо того, чтобы отправлять его клиенту.

Это все работает как должно и всякий раз, когда я выбираю значение 15 в поле 5, появляется поле 4, и я могу выбрать что-либо в нем, однако, когда я выбираю значение 14 в поле 5, поле 4 не идет обратно в укрытие.

В основном, что я хочу достичь, это иметь 2 клонированных поля для отправки или доставки, в которых 1 имеет скидку на выбор дюжины вместо одного продукта. Это позволяет людям заказывать 1 отдельный продукт при помещении формы 4 в стоимость 13 и получать такую ​​же скидку на нее, как если бы они решили приехать и получить дюжину себя в магазине и не доставлять им их, что является скидкой это все о. Надеюсь, это имеет смысл.

Может кто-нибудь пролить свет на то, почему это не работает, как должно? Почему он не возвращается в сокрытие? Я что-то пропустил? Я не очень люблю jquery, так что это может быть что-то действительно очевидное. Если есть более простые альтернативы, тогда я открываю для предложений.

Спасибо заранее,

Кевин

Update: http://jsfiddle.net/zhmSS/ скрипку, кажется, работает как шарм .. Однако на моей странице он держит неудачу, даже когда

if ($(#edit-attributes-5).val() == "15") { 

изменяется на:

if ($(this).val() == "15") { 

Что-то должно быть разбив его? Я попытался использовать обновление jQuery на Drupal и выбрать jQuery v1.5, v1.7 и v1.8, но ни один из них не имеет значения.

Страница в вопросе: http://italvin.arclyse.net/?q=producten&w=Rode%20Wijn&s=All&wh=All&d=All

+0

Является ли это typos 'if ($ (# edit-attributes-5)', потому что это должно быть 'if ($ ('# edit-attributes-5')'. Вы также можете заменить его '$ (this) .val() '. – Omar

+0

Это также помогло бы, если бы вы опубликовали демонстрационную версию jsFiddle. – Shivam

+0

Привет, Омар, Я забыл упомянуть, что я пробовал оба, так, как он выглядит сейчас, он также скользит вниз, как раньше, это было« это «раньше, но, поскольку он не работал, я попробовал альтернативные подходы. Самое смешное, когда я пытаюсь использовать эти коды в скрипке, и я меняю if ($ (# edit-attributes-5) на это, он работает как шарм, на странице он должен работать, это не работает. –

ответ

0

Если это в Drupal, вы должны структурировать JQuery немного по-другому. Drupal использует систему поведения, которая гарантирует, что ваш код javascript запускается всякий раз, когда контент добавляется через ajax. Прямо сейчас ваша функция jquery никогда не будет запущена, потому что документ «готов», прежде чем ваша форма будет полностью загружена.

Вот ссылка на working with javascript in Drupal

Вот типичный способ крепления поведения в Drupal:

(function ($, Drupal, window, document, undefined) { 

    Drupal.behaviors.selectionHandlers = { 
     attach: function(context, settings) { 

      $("#edit-attributes-5").once("select-handler", function() { 

        $(this).change(function(){ 
         if ($("#edit-attributes-5").val() == "15") { 
          $("#edit-attributes-4").slideDown("fast") 
         } else { 
          $("#edit-attributes-4").slideUp("fast") 
         } 
        }); 
      }); 
     } 
    } 

})(jQuery, Drupal, this, this.document); 

Добавление его как поведение говорит «запустить этот код, когда новый контент добавляется к странице» ,

Звонок once() гарантирует, что код запускается только при первоначальном добавлении содержимого, а не при добавлении другого содержимого.

+0

Благодарим вас за разъяснение и предоставление примера, однако, когда я добавляю этот метод на страницу, я вижу 1 вещь, которая дает понять, что что-то действительно происходит неправильно, что он теперь фактически скользит вниз, как это должно, с аккуратным эффектом, но он все равно не скроет список выбора, когда значение вернется к 14. Что я сделал сейчас, заменил свой блок jquery code на ваш и ушел остальное как есть, но все равно нет. Видя, как вы, кажется, больше знаете о самом drupal, знаете ли вы, возможно, что-то блокирует весь jquery? –

+0

Я думаю, что происходит то, что при изменении выбора 'Afname' вся форма перезагружается через ajax, что означает, что' # edit-attributes-5' был удален и заменен, что устраняет событие 'change()' обработчик, поэтому он будет запускаться в первый раз, но не второй. Чтобы проверить, если это так, добавьте вызов 'alert()' или 'console.log()' обработчику изменений и посмотрите, вызывается ли он. Как правило, вы не добавляете поведение drupal в заголовок представления, вы бы поместили его в файл .js, который загружает ваша тема (обычно в файле 'theme.info'). –