2017-01-12 10 views
0

タイマーでhtml span要素のテキストを変更する必要があります。 タイマーは正常に機能しますが、スパンの内容を変更することはできません。要素をjQuery関数に渡す

問題はである:

$(element).text(hour); 

私はここで何をしないのですか?ここで

私のコードです:

HTML:ここ

<span id="mytimer">00:00</span> 

私のJSです:

function loaded(selector, callback){ 
     $(function() { 
      callback($(selector)); 
     }); 
     $(document).on('DOMNodeInserted', selector, function() { 
      callback($(this)); 
     }); 
    }; 

    function setupTimer(element, duration, interval) { 
     var start = Date.now(), 
      diff, 
      minutes, 
      seconds; 
     clearInterval(window.mytimer); 
     function timer() { 
      diff = duration - (((Date.now() - start)/1000) | 0); 
      minutes = (diff/60) | 0; 
      seconds = (diff % 60) | 0; 
      if (minutes < 0) { 
       minutes = 0; 
      } 
      if (seconds < 0) { 
       seconds = 0; 
      } 
      minutes = minutes < 10 ? "0" + minutes : minutes; 
      seconds = seconds < 10 ? "0" + seconds : seconds; 
      hour=minutes + ":" + seconds; 
      $(element).text(hour); 
      if (window.mytimer != null & diff < 0) { 
       clearInterval(window.mytimer); 
      } 
     }; 
     timer(); 
     window.mytimer = setInterval(timer, interval * 1000); 
    }; 

    loaded('#mytimer', function(el){ 
      setupTimer(el,100,1); 
    }); 
+0

要素は、あなただけの 'element.text(時間)を使用することができ、既に選択されたjQueryオブジェクトである一緒に入れ;'必要が二回 – Kaddath

+1

@Danielコルソなぜだろうと助けを、それを選択するには? 'time'はテキストを含み、' .text(argument) 'は要素の子要素を渡された引数を含むテキストノードに置き換えるための有効なJqueryメソッドです。 – VKK

+0

@DanielCorzo、なぜ '.html()'は動作するのですか? '' text() '? –

答えて

3

まず、これはKaddathの一つに追加の答えは、私は上記のコメントで述べたように、彼は、正しい、がロードされたメソッド(またはでを削除少なくともその一部)。

なぜ?

    DOMNodeInserted
  • 非推奨と パフォーマンスに負の影響を有しています。
  • この要素の内容(HTML /テキスト)を変更するたびに、挿入された新しいイベントがトリガーされるため、タイマーが機能しなくなります。

あなたが本当にあなたのコメントbeowで説明したように、あなたがDOMNodeInsertedロジックを「置き換え」とmutationobserverを使用することができ、「待つ」する必要がある場合。私は小さなexample

$().ready(function() { 

    function setupTimer(element, duration, interval) { 
    var start = Date.now(), 
     diff, 
     minutes, 
     seconds; 
    clearInterval(window.mytimer); 
    function timer() { 
     diff = duration - (((Date.now() - start)/1000) | 0); 
     minutes = (diff/60) | 0; 
     seconds = (diff % 60) | 0; 
     if (minutes < 0) { 
      minutes = 0; 
     } 
     if (seconds < 0) { 
      seconds = 0; 
     } 
     minutes = minutes < 10 ? "0" + minutes : minutes; 
     seconds = seconds < 10 ? "0" + seconds : seconds; 
     hour=minutes + ":" + seconds; 
     element.text(hour); 
     if (window.mytimer != null & diff < 0) { 
      clearInterval(window.mytimer); 
     } 
    }; 
    timer(); 
    window.mytimer = setInterval(timer, interval * 1000); 
    }; 

    // simply run your method here (in case DOM element exists) 
    // setupTimer($('#mytimer'),100,1); 

    // in case your element is not there you can 
    // observe the document for changes like this... 
    var observer = new MutationObserver(function(mutations) { 
     mutations.forEach(function(mutation) { 
     var newNodes = mutation.addedNodes; // DOM NodeList 
     if(newNodes !== null) { // If there are new nodes added 
      var $nodes = $(newNodes); // jQuery set 
      $nodes.each(function() { 
       var $node = $(this); 
       // looking for your element 
       if($node.attr('id') === 'mytimer') { 
        // do your action 
        setupTimer($('#mytimer'),100,1); 
        // in case you do not need it any longer 
        observer.disconnect(); 
       } 
      }); 
     } 
     });  
    }); 

    // Configuration of the observer: 
    // might be possible to reduce this in your case 
    var config = { 
     attributes: true, 
     childList: true, 
     characterData: true 
    }; 

    // the target has to be an existing DOM node 
    // adapt this to your needs... 
    var target = document.body; 

    // Pass in the target node, as well as the observer options 
    observer.observe(target, config); 

}); 
+0

私はmytimerが実行時に作成されるので、こんにちは、それは私にはうまくいきません。私はそれに言及するのを忘れた。 –

+0

Axelに感謝します。「オン」とデリゲートについていくつか知っています。しかし、スパン(タイマー付き)がdinamically作成された後、どのようなOnメソッドを使用してタイマーをトリガーする必要がありますか? –

+0

@LuizAlvesなぜ要素を作成するときにsetupTimerメソッドを呼び出さないのですか? –

0

は、挿入されたDOMとの一部を削除し、それは間隔が再されますなぜなら、 `` text() `を実行すると、要素を挿入するからです。

function loaded(selector, callback){ 
    $(function() { 
     callback($(selector)); 
    }); 
    /*$(document).on('DOMNodeInserted', selector, function() { 
     callback($(this)); 
    });*/ 
}; 

チェックこのフィドル:https://jsfiddle.net/rzaeg38g/

+0

これは私のアプリケーションの他の部分を壊すことはありません?私は実行時に作成された他のhtmlページに多くのdom要素を持っており、コールバックを使用する必要があります。 –

+0

コードをsetuptimerに変更して: \t /*$(element).text(hora);*/ \t $( '#mytimer')。テキスト(hora);できます。だからあなたの答えが正しい理由は分かりません。 –

+0

axel michelの答えを参照してください、彼はまた、より良い構造化コードを提供します – Kaddath

関連する問題