2011-01-24 2 views
1

Я использую Drupal для создания листа измерений (Measurement sheets in Drupal 6), и я в той точке, где у меня есть все поля на месте, мне просто нужно написать некоторый jQuery, который автоматически обновляет соответствующее поле, когда пользователь вводит данные. Код ниже:Автоматическое обновление ширины/длины/области с использованием jQuery и Drupal6

jQuery(document).ready(function ($) { 


$('input').change(

    function() { 
    $parent = $(this).parent("td").children("div").children("div"); 
    length = $parent.children("div[id*='field-length-0-wrapper']").children("div.container-inline").children('div[id*="field-length-0-value-wrapper"]').children('input[id*="field-length-0-value"]').val(); // get the width 
    width = $parent.children("div[id*='field-width-0-wrapper']").children("div.container-inline").children('div[id*="field-width-0-value-wrapper"]').children('input[id*="field-width-0-value"]').val(); // get the length 
    $parent.children("div[id*='field-area-0-wrapper']").children("div.container-inline").children('div[id*="field-area-0-value-wrapper"]').children('input[id*="field-area-0-value"]').val(length * width); //put area 
    } 
); 

}); 

Это взаимодействует со следующим кодом вида:

<thead class="tableHeader-processed"><tr><th colspan="2">Measurements: </th> </tr></thead> 
<tbody> 
<tr class="draggable odd"><td class="content-multiple-drag"><a title="Drag to re-order" href="#" class="tabledrag-handle"><div class="handle">&nbsp;</div></a></td><td><div class="form-item" id="edit-field-room-0-wrapper"> 
<div class="form-item" id="edit-field-room-0-value-wrapper"> 
<div class="form-item" id="edit-field-room-0-value-field-roomname-0-value-wrapper"> 
<label for="edit-field-room-0-value-field-roomname-0-value">Room: </label> 
<input autocomplete="OFF" name="field_room[0][value][field_roomname][0][value]" id="edit-field-room-0-value-field-roomname-0-value" size="50" value="" class="form-text form-autocomplete text" type="text"> 
</div> 
<input class="autocomplete autocomplete-processed" id="edit-field-room-0-value-field-roomname-0-value-autocomplete" value="http://www.imeasure.hairysquid.net/autocomplete_widgets/room/field_roomname" disabled="disabled" type="hidden"><div class="form-item" id="edit-field-room-0-value-field-length-0-wrapper"> 
<label for="edit-field-room-0-value-field-length-0">Length: </label> 
<div class="container-inline"><div class="form-item" id="edit-field-room-0-value-field-length-0-value-wrapper"> 
<input maxlength="16" name="field_room[0][value][field_length][0][value]" id="edit-field-room-0-value-field-length-0-value" size="24" value="" class="form-text formatted-number formatted-number-processed" decimals="2" type="text"> 
</div> 
<div class="form-item" id="edit-field-room-0-value-field-length-0-unit-wrapper"> 
<select name="field_room[0][value][field_length][0][unit]" class="form-select" id="edit-field-room-0-value-field-length-0-unit"><option value="" selected="selected">---</option><option value="length_meter">m</option><option value="length_foot">ft</option><option value="length_inch">in</option></select> 
</div> 
</div> 
</div> 
<div class="form-item" id="edit-field-room-0-value-field-width-0-wrapper"> 
<label for="edit-field-room-0-value-field-width-0">Width: </label> 
<div class="container-inline"><div class="form-item" id="edit-field-room-0-value-field-width-0-value-wrapper"> 
<input maxlength="16" name="field_room[0][value][field_width][0][value]" id="edit-field-room-0-value-field-width-0-value" size="24" value="" class="form-text formatted-number formatted-number-processed" decimals="2" type="text"> 
</div> 
<div class="form-item" id="edit-field-room-0-value-field-width-0-unit-wrapper"> 
<select name="field_room[0][value][field_width][0][unit]" class="form-select" id="edit-field-room-0-value-field-width-0-unit"><option value="" selected="selected">---</option><option value="length_meter">m</option><option value="length_foot">ft</option><option value="length_inch">in</option></select> 
</div> 
</div> 
</div> 
<div class="form-item" id="edit-field-room-0-value-field-area-0-wrapper"> 
<label for="edit-field-room-0-value-field-area-0">Area: </label> 
<div class="container-inline"><div class="form-item" id="edit-field-room-0-value-field-area-0-value-wrapper"> 
<input maxlength="16" name="field_room[0][value][field_area][0][value]" id="edit-field-room-0-value-field-area-0-value" size="24" value="" class="form-text formatted-number formatted-number-processed" decimals="2" type="text"> 
</div> 
<div class="form-item" id="edit-field-room-0-value-field-area-0-unit-wrapper"> 
<select name="field_room[0][value][field_area][0][unit]" class="form-select" id="edit-field-room-0-value-field-area-0-unit"><option value="" selected="selected">---</option><option value="area_square_foot">ft2</option><option value="area_square_meter">m2</option></select> 
</div> 
</div> 
</div> 

</div> 

</div> 
</td><td style="display: none;" class="delta-order"><div class="form-item" id="edit-field-room-0--weight-wrapper"> 
<select name="field_room[0][_weight]" class="form-select field_room-delta-order" id="edit-field-room-0--weight"><option value="-2">-2</option><option value="-1">-1</option><option value="0" selected="selected">0</option><option value="1">1</option><option value="2">2</option></select> 
</div> 
</td> </tr> 
<tr class="draggable even"><td class="content-multiple-drag"><a title="Drag to re-order" href="#" class="tabledrag-handle"><div class="handle">&nbsp;</div></a></td><td><div class="form-item" id="edit-field-room-1-wrapper"> 
<div class="form-item" id="edit-field-room-1-value-wrapper"> 
<div class="form-item" id="edit-field-room-1-value-field-roomname-0-value-wrapper"> 
<label for="edit-field-room-1-value-field-roomname-0-value">Room: </label> 
<input autocomplete="OFF" name="field_room[1][value][field_roomname][0][value]" id="edit-field-room-1-value-field-roomname-0-value" size="50" value="" class="form-text form-autocomplete text" type="text"> 
</div> 
<input class="autocomplete autocomplete-processed" id="edit-field-room-1-value-field-roomname-0-value-autocomplete" value="http://www.imeasure.hairysquid.net/autocomplete_widgets/room/field_roomname" disabled="disabled" type="hidden"><div class="form-item" id="edit-field-room-1-value-field-length-0-wrapper"> 
<label for="edit-field-room-1-value-field-length-0">Length: </label> 
<div class="container-inline"><div class="form-item" id="edit-field-room-1-value-field-length-0-value-wrapper"> 
<input maxlength="16" name="field_room[1][value][field_length][0][value]" id="edit-field-room-1-value-field-length-0-value" size="24" value="" class="form-text formatted-number formatted-number-processed" decimals="2" type="text"> 
</div> 
<div class="form-item" id="edit-field-room-1-value-field-length-0-unit-wrapper"> 
<select name="field_room[1][value][field_length][0][unit]" class="form-select" id="edit-field-room-1-value-field-length-0-unit"><option value="" selected="selected">---</option><option value="length_meter">m</option><option value="length_foot">ft</option><option value="length_inch">in</option></select> 
</div> 
</div> 
</div> 
<div class="form-item" id="edit-field-room-1-value-field-width-0-wrapper"> 
<label for="edit-field-room-1-value-field-width-0">Width: </label> 
<div class="container-inline"><div class="form-item" id="edit-field-room-1-value-field-width-0-value-wrapper"> 
<input maxlength="16" name="field_room[1][value][field_width][0][value]" id="edit-field-room-1-value-field-width-0-value" size="24" value="" class="form-text formatted-number formatted-number-processed" decimals="2" type="text"> 
</div> 
<div class="form-item" id="edit-field-room-1-value-field-width-0-unit-wrapper"> 
<select name="field_room[1][value][field_width][0][unit]" class="form-select" id="edit-field-room-1-value-field-width-0-unit"><option value="" selected="selected">---</option><option value="length_meter">m</option><option value="length_foot">ft</option><option value="length_inch">in</option></select> 
</div> 
</div> 
</div> 
<div class="form-item" id="edit-field-room-1-value-field-area-0-wrapper"> 
<label for="edit-field-room-1-value-field-area-0">Area: </label> 
<div class="container-inline"><div class="form-item" id="edit-field-room-1-value-field-area-0-value-wrapper"> 
<input maxlength="16" name="field_room[1][value][field_area][0][value]" id="edit-field-room-1-value-field-area-0-value" size="24" value="" class="form-text formatted-number formatted-number-processed" decimals="2" type="text"> 
</div> 
<div class="form-item" id="edit-field-room-1-value-field-area-0-unit-wrapper"> 
<select name="field_room[1][value][field_area][0][unit]" class="form-select" id="edit-field-room-1-value-field-area-0-unit"><option value="" selected="selected">---</option><option value="area_square_foot">ft2</option><option value="area_square_meter">m2</option></select> 
</div> 
</div> 
</div> 

</div> 

</div> 
</td><td style="display: none;" class="delta-order"><div class="form-item" id="edit-field-room-1--weight-wrapper"> 
<select name="field_room[1][_weight]" class="form-select field_room-delta-order" id="edit-field-room-1--weight"><option value="-2">-2</option><option value="-1">-1</option><option value="0">0</option><option value="1" selected="selected">1</option><option value="2">2</option></select> 
</div> 
</td> </tr> 
</tbody> 

Это показывает два номер блока - обратите внимание на field_room [] значение. По сути дела, я создал два типа контента CCK - Sheet and Room. В комнате есть четыре текстовых поля: имя, ширина, длина, площадь - в этом порядке. Имя - это поле автозаполнения, ширина, длина и область - поля измеренных значений, что означает, что можно переключить устройство. Затем в типе содержимого листа я использую flexinode для создания повторяющейся серии типов содержимого комнаты.

Что случилось с моим jQuery?

Любая помощь приветствуется. :)

ответ

1

В коде JQuery, должен быть parents использован вместо parent для td поиска:

$parent = $(this).parents("td").children("div").children("div"); 

Это делает значение площади необходимо рассчитать, как только ширина или длина изменяется.

EDIT:

Существует также возможность оптимизации JQuery, например, к этому (может быть улучшена еще больше):

jQuery(document).ready(function ($) { 
    $('input').change(function() { 
    var $parent = $(this).parents("td").children("div").children("div"), 
     length = $parent.find('input[id*="field-length-0-value"]').val(), 
     width = $parent.find('input[id*="field-width-0-value"]').val(); 
    $parent.find('input[id*="field-area-0-value"]').val(length * width); 
    }); 
}); 
+0

Боже мой. Не могу поверить, что я пропустил что-то настолько очевидное. Спасибо!!! – aendrew

+0

Проверьте jsbin, если вы хотите посмотреть, как это работает ... [ссылка] (http://jsbin.com/olone5/edit) – rdamborsky