отделение часов jQuery

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

Скажем, я имею:

<div id="hello"><p>Some content here</p></div>

Который в какой-то момент 5 секунд спустя изменяется на:

<div id="hello"><ul><li>This is totally different!</li></ul></div>

Как я могу быть уведомлен относительно этого через обратный вызов или что-то еще? Я могу в большинстве случаев получить JavaScript, который это делает вставку, чтобы сказать мне. Но я хотел знать, было ли это возможно.

30
задан atp 13 July 2010 в 03:42
поделиться

4 ответа

Метод jQuery .change() работает только для полей формы.

Я написал для вас небольшой jQuery-плагин:

<!-- jQuery is required -->

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>


<!-- this is the plugin -->

<script>
  jQuery.fn.contentChange = function(callback){
    var elms = jQuery(this);
    elms.each(
      function(i){
        var elm = jQuery(this);
        elm.data("lastContents", elm.html());
        window.watchContentChange = window.watchContentChange ? window.watchContentChange : [];
        window.watchContentChange.push({"element": elm, "callback": callback});
      }
    )
    return elms;
  }
  setInterval(function(){
    if(window.watchContentChange){
      for( i in window.watchContentChange){
        if(window.watchContentChange[i].element.data("lastContents") != window.watchContentChange[i].element.html()){
          window.watchContentChange[i].callback.apply(window.watchContentChange[i].element);
          window.watchContentChange[i].element.data("lastContents", window.watchContentChange[i].element.html())
        };
      }
    }
  },500);
</script>



<!-- some divs to test it with -->

<p>Testing it:  (click on divs to change contents)</p>

<div id="a" onclick="$(this).append('i')">Hi</div>
<div id="b" onclick="$(this).append('o')">Ho</div>
<div class="c" onclick="$(this).append('y')">He</div>
<div class="c" onclick="$(this).append('w')">He</div>
<div class="c" onclick="$(this).append('a')">He</div>




<!-- this is how to actually use it -->

<script>
  function showChange(){
    var element = $(this);
    alert("it was '"+element.data("lastContents")+"' and now its '"+element.html()+"'");
  }

  $('#a').contentChange(function(){  alert("Hi!") });
  $('div#b').contentChange( showChange );
  $('.c').contentChange(function(){  alert("He he he...") });
</script>

Имейте в виду, что он следит за изменениями только содержимого элемента (html), а не атрибутов.

63
ответ дан 27 November 2019 в 23:26
поделиться

Вот пример кода, который вызывает простое предупреждение при изменении данного значения:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>watchu, watchu, watchu want, watchu want?</title>
</head>
<body>

    <div id='foo'>Hello World!</div>

    <p><input type="button" id="ChangeButton" value="Change It" /></p>

    <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script>
    <script type="text/javascript">

        $(function () {

            $('#ChangeButton').click(function () {
                $('#foo').html('Awfveeterzain!');
            });

            window.watchForChangeOriginalValue = $('#foo').html();
            watchForChange();
        });

        function watchForChange() {
            if ($('#foo').html() != window.watchForChangeOriginalValue)
                alert('the value changed!');
            else
                window.setTimeout(watchForChange, 500);
        }

    </script>
</body>
</html>
0
ответ дан 27 November 2019 в 23:26
поделиться

Не существует собственного события jQuery/DOM, которое срабатывает при изменении содержимого HTML/DOM.

Вы можете (если чувствуете себя особенно расточительным) сделать что-то вроде этого:

$(function() {
  var $div = $("#hello");
  var html = $div.html();
  var checking = setInterval(function() {
    var newhtml = $div.html();
    if (html != newhtml) {
      myCallback();
      html = newhtml;
    }
  },100);

  function myCallback() {
    alert('content changed!');
    // if you only want it to fire once, uncomment the following:
    // clearInterval(checking);
  }
});

Только помните, что вызов .html() каждые 100 мс, вероятно, не лучшая идея для производительности вашего сайта.

jsFiddle mockup

6
ответ дан 27 November 2019 в 23:26
поделиться

Кто/что изменит это? Если это какой-то JS, который вы контролируете, используйте это, чтобы также вызвать ваш обратный вызов. Очевидно, что пользователь не может изменить это.

Если вы хотите следить за элементом и т.д., используйте событие 'change'. Версия jQuery здесь: http://api.jquery.com/change/

1
ответ дан 27 November 2019 в 23:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: