2010-07-08 2 views
0

У меня есть следующий код JQuery:jQuery: функция изменения не индуцируется?

$(document).ready(function() { 
      $('.restrictiveOptions input[type!=checkbox], .restrictiveOptions select').change(function() { 
       // check off enabled for that row if anything changed 
       $(this).closest('.fieldRow').find('.restrictiveOptionEnabled').attr('checked','true'); 
       alert('changed'); 
      }); 
     }); 

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

Я проверил, что $('.restrictiveOptions input[type!=checkbox], .restrictiveOptions select') верен (с помощью консоли firebug и проверки длины., Которая вернулась 484). Я также убедился, что нет синтаксических ошибок.

Как вы думаете, что я делаю неправильно? благодаря!

EDIT: я обновил код и изменил $(self) на $(this), но я все еще не вижу предупреждения. вот пример HTML (извините за форматирование, я добавил разрывы строк, но оно генерируется PHP):

<fieldset class="restrictiveOptions"><legend class="collapsable"> 
<img width="12" height="12" title="Collapse" alt="Collapse" class="toggle" src="branding/default/images/collapse.gif"> Restrictive Options</legend> 
<div style=""> 
<div class="fieldRow"> 
<div class="label"> 
<label>Executive</label></div> 
<div class="fieldWrapper"> 
<div class="cellValue"> 
<select onchange="changeRestrictionValue(&quot;event42_41&quot;)" id="event42_41_restrictionType" name="event42_41_restrictionType"> 
<option selected="selected" value="1">is equal to</option> 
<option value="2">is not equal to</option></select> 
<span id="event42_41_restrictionValue1Wrapper" class="event42_41_restrictionValueWrapper"> 
<select onchange="validateField(this)" name="event42_41_restrictionValue" id="event42_41_restrictionValue"> 
<option value="76">Yes</option> 
<option value="77">No</option></select></span> 
<span style="display: none;" id="event42_41_restrictionValue2Wrapper" class="event42_41_restrictionValueWrapper"> 
<select onchange="validateField(this)" name="event42_41_restrictionValue1" id="event42_41_restrictionValue1"> 
<option value="76">Yes</option> 
<option value="77">No</option></select> and 
<select onchange="validateField(this)" name="event42_41_restrictionValue2" id="event42_41_restrictionValue2"> 
<option value="76">Yes</option> 
<option value="77">No</option></select></span></div> 
<div style="float: right;" class="cellValue"> 
<label for="event42_41_enabled">Enabled?</label> 
<input type="checkbox" style="vertical-align: sub; margin: 2px; padding: 0pt;" class="restrictiveOptionEnabled" title="Check me to enable this restrictive option" name="event42_41_enabled" id="event42_41_enabled" value=""> 
</div></div></div> 
+0

Не могли бы вы разместить свой сопровождающий html? – HurnsMobile

+0

Четыреста восемьдесят четыре !!!! – Pointy

+0

@ HurnsMobile: я сделал, но его решили. в любом случае спасибо! @Pointy: его зверь формы =) динамически созданный блок кода, и каждый из них имеет этот код в нем (на самом деле я показываю только одну строку в примере html, где, вероятно, будет не менее 10) на самом деле, позволяет сделать эту математику Каждая строка имеет 4 выбора/ввода, каждый блок имеет 11 строк (в моем тестовом коде, но число строк также динамическое), и в настоящее время существует 11 блоков. 11 * 11 = 121, 121 * 4 = 484 =) – Garrett

ответ

2

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

$(function() { 
    $('.restrictiveOptions input[type!=checkbox], .restrictiveOptions select') 
    .live('click', function(ev) { 
     $(this).closest('.fieldRow').find('.restrictiveOptionEnabled').attr('checked','true'); 
     alert('changed'); 
    }); 
}); 
+0

, который только что запустил его работу! благодаря! – Garrett

5

Вместо self, вам нужно this, как это:

$(document).ready(function() { 
    $('.restrictiveOptions input[type!=checkbox], .restrictiveOptions select').change(function() { 
    $(this).closest('.fieldRow').find('.restrictiveOptionEnabled').attr('checked', true); 
    alert('changed'); 
    }); 
}); 

Внутри события обработчик вроде этого, this относится к рассматриваемому элементу, self часто используется, чтобы висеть на какой-то ссылке, но он по сути не доступен, это то, что вам нужно определить. В этом случае, он пытается сделать $(undefined), что не точно что вы хотите :)

+0

Я сделал это изменение, но предупреждение все еще не отображается = ( – Garrett

+0

@Garrett - Вы видите какие-либо ошибки в своей консоли? Я обновил для более точного '.attr ('checked', true);', но похоже, что вы по-прежнему получаете сообщение об ошибке. Вот рабочая версия против вашей разметки: http://jsfiddle.net/UKnmx/ Что-то вне вопроса должно быть ошибкой? –

+0

Кажется, это была функция «change» и переключения это «живое» заставило его работать. OHHH, я думаю, потому, что я создал строки на загрузке документа, так что код должен был работать первым и не находил элементы, потому что они еще не были созданы. большое спасибо за ваши усилия. Это была моя ошибка. – Garrett

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