2016-11-13 2 views
0

У меня есть элементы диапазона, которые динамически генерируются из ответа ajax. Я пытаюсь обнаружить изменение значения span с помощью приведенного ниже кода и, похоже, работает в jsfiddle с фиксированными элементами, но не в реальном сценарии, где данные динамически генерируются. Значения span обновляются с помощью приращения числа setInterval, которое я пытаюсь обнаружить.динамически обнаруживать изменение элемента span

Шаги, которые я принимаю, были бы признательны за некоторые советы о том, почему мой код не будет работать?

  1. Для всех элементов с идентификатором, содержащим «минут» < - это будут мои пролетных элементы
  2. Получить 2
  3. Когда изменение обнаружено идентификаторами
  4. Обнаружение каких-либо изменений во всех элементах с идентификаторами от стадии , получить значение элемента диапазона
  5. Проверьте значение диапазона больше, чем 00 т 01 (это на самом деле значение минуты)
  6. Если условие с шагом 5 выполняются затем применить CSS
  7. Если условие с шага 5 не выполняется затем удалить CSS
$('[id*="minutes"]').each(function() { 
    spanid = $(this).attr('id'); 

    console.log(spanid); 

    $("#"+spanid).on('change',function(){ 

     spanval = $(this).text(); 
     id = $(this).attr('id').charAt(0); 

     if(spanval > 00) { 
      $('#results').text(span); 

      $("#"+id+"-wt-html").css({"background":"#FFE95B", "color":"red"}); 
     } else { 
      $("#"+id+"-wt-html").removeAttr("style") 
     } 
    }); 
}); 

образец HTML

<td id="9-wt-html"> 
<div id="9-wt-ajax"> 
<span id="9-hours">00</span>: 
<span id="9-minutes">15</span>: 
<span id="9-seconds">12</span> 
</div> 
</td> 

вышеупомянутые элементы пролетных созданы перед вызовом Ajax с использованием фиксированного сценария ниже :

for (var key in skills_arr) { 
//console.log(skills_arr[key]+" - "+key); 
$('#Table > tbody:last-child').append('<tr><td>'+skills_arr[key]+'</td><td id="'+key+'-cw-html"><div id="'+key+'-cw-ajax"></div></td><td id="'+key+'-aa-html"><div id="'+key+'-aa-ajax"></div></td><td id="'+key+'-wt-html"><div id="'+key+'-wt-ajax"><span id="'+key+'-hours">00</span>:<span id="'+key+'-minutes">00</span>:<span id="'+key+'-seconds">00</span></div></td><td id="'+key+'-op-html"><div id="'+key+'-op-ajax"></div></td></tr>'); 
} 
+0

Пожалуйста, поделитесь своими HTML. –

+0

Если вы добавите это, прежде чем генерировать промежутки, это не сработает –

+0

Я добавил его в нижней части моего файла сценария после создания пространств, но я не получу второй шаг. – user3436467

ответ

1

Хорошо, Я создал snippet ниже, основываясь на моем понимании.

Также хотел бы выделить следующие пункты.

Для элемента span мы не можем слушать событие change. Вместо этого код ниже прослушивает событие DOMSubtreeModified.

Кроме того, мы можем непосредственно прослушать событие элемента, используя $('[id*="minutes"]').on('DOMSubtreeModified', function(){}), если элемент существует до этой строки.

В противном случае, мы должны выслушать то же самое из его parent или document , как показано ниже.

$('#Table').on('DOMSubtreeModified', '[id*="minutes"]', function() { 
 
    var span = $(this); 
 
    var spanValue = parseInt(span.text()); 
 
    var id = span.attr('id').charAt(0); 
 
    if(spanValue > 0) { 
 
      //$('#results').text(span); // Not sure what is this? 
 

 
      $("#"+id+"-wt-html").css({"background":"#FFE95B", "color":"red"}); 
 
    } else { 
 
      $("#"+id+"-wt-html").removeAttr("style") 
 
    } 
 
}); 
 

 
var skills_arr = { 
 
    '9': 'some value here' 
 
}; 
 

 
for (var key in skills_arr) { 
 
$('#Table > tbody:last-child').append('<tr><td>'+skills_arr[key]+'</td><td id="'+key+'-cw-html"><div id="'+key+'-cw-ajax"></div></td><td id="'+key+'-aa-html"><div id="'+key+'-aa-ajax"></div></td><td id="'+key+'-wt-html"><div id="'+key+'-wt-ajax"><span id="'+key+'-hours">00</span>:<span id="'+key+'-minutes">00</span>:<span id="'+key+'-seconds">00</span></div></td><td id="'+key+'-op-html"><div id="'+key+'-op-ajax"></div></td></tr>'); 
 
} 
 

 
setTimeout(function(){ 
 
    $('#9-minutes').text('15'); 
 
    $('#9-seconds').text('12'); 
 
}, 3000); 
 

 
setTimeout(function(){ 
 
    $('#9-minutes').text('00'); 
 
    $('#9-seconds').text('10'); 
 
}, 6000);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<table id="Table"> 
 
    <tbody> 
 
    </tbody> 
 
</table> 
 
<p>Results:</p> 
 
<div id="#results"> 
 
</div>

+0

Thx очень много. Это, кажется, хорошо работает в моей лаборатории до сих пор .. запуск еще нескольких тестов и плохое возвращение – user3436467

+0

@ user3436467 Уверен :-) – Aruna

+0

'$ ('# results'). Text (span);' был из беспорядка. пожалуйста, удалите его из своего решения – user3436467

0

Основная причина, по которой он может не работать, заключается в том, что вы включаете div внутри td. Вы должны вложить их в DIV работать:

<div id="9-wt-html"> 
    <div id="9-wt-ajax"> 
    <span id="9-hours">00</span>: 
    <span id="9-minutes">15</span>: 
    <span id="9-seconds">12</span> 
    </div> 
</div> 

Затем в коде Jquery вы должны преобразовать поверочного текст Integre работы:

$('[id*="minutes"]').each(function() { 
    spanid = $(this).attr('id'); 

    console.log(spanid); 

    $("#" + spanid).on('change', function() { 

    spanval = parseInt($(this).text()); 
    id = $(this).attr('id').charAt(0); 

    if (spanval > 00) { 
     //$('#results').text(span); // ?where is span variable? 

     $("#" + id + "-wt-html").css({ 
     "background": "#FFE95B", 
     "color": "red" 
     }); 
    } else { 
     $("#" + id + "-wt-html").removeAttr("style") 
    } 
    }); 
}); 

Вот JSFiddle

+0

он должен быть в пределах td, так как я на самом деле применяю css к td, а не к div .. к сожалению, я не мог понять, как сделать div полной шириной ячейки таблицы bootstrap, поэтому я применяю css к td вместо – user3436467

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