2017-03-22 18 views
0

ここではHTMLコードですが、clearfixクラスをクリックすると関数が呼び出され、同じ関数が4回実行されます。同じ関数をJavaScriptで何度も呼び出すのを止める方法は?

<div class="clearfix"> 
    <ul id="dashboard-tab" class="nav nav-tabs pull-left"> 
     <li class="active" isdashboardloaded="true"> 
      <a data-toggle="tab" href="#dashboard_5" aria-expanded="true">DashLoadingLineChart</a> 
     </li> 
     <li class="" isdashboardloaded="true"> 
      <a data-toggle="tab" href="#dashboard_6" aria-expanded="false">Zoom</a> 
     </li> 
    </ul> 
</div> 

JS機能

$(document).on('click','.clearfix',function(){ 
    var dashId=$('.dashboardTabContent.active').attr('id'); 
    var dash_ids = bu.angular.pageScope.dashboardCollection.collection; 
    var dashBoardUrl=event.target.href; 
    $.each(dashObj.widgetObj,function(widgetId,widgetObj){ 
     clearWidget(widgetId,widgetObj.mode); 
     var widget_refresh_interval = widgetObj.refresh_interval; 
     //widgetInterval[widgetId] = 0; 
     clearInterval(widgetInterval[widgetId]); 
     bu.angular.pageScope.$digest(); 
     widgetWiseReload(widgetId,dashId) 
     getWidgetData(widgetId,dashId,widgetObj,data_sources); 
    }); 
}); 

私は一度だけ、この関数を実行する必要があるが、それは2回以上実行されています。

+0

だから、ループにsometingを入れて、ループが実際に実行される理由が不思議です。 – baao

+0

['$ 1one()'](http://api.jquery.com/one/)を使用してください。これはハンドラをアタッチし、イベントタイプごとに最大で1回実行されます。 – Pugazh

+0

@baao、ループを完了した後、再び同じ機能に戻ります。 – Illusion

答えて

1

機能を複数回追加していることがあります。これを試してみてください:

$(document).off("click", ".clearfix").on('click','.clearfix',function() { 
    $.each(dashObj.widgetObj,function(widgetId,widgetObj){ 
     clearWidget(widgetId,widgetObj.mode); 
     var widget_refresh_interval = widgetObj.refresh_interval; 
     //widgetInterval[widgetId] = 0; 
     clearInterval(widgetInterval[widgetId]); 
     bu.angular.pageScope.$digest(); 
     widgetWiseReload(widgetId,dashId) 
     getWidgetData(widgetId,dashId,widgetObj,data_sources); 
    }); 
}); 

これは、それを再度取り付ける前に、イベントを切り離しますので、複数回呼び出された場合、それは実際には、1時間に付加されます。

Protip:インデントをきれいに保ちます。

Protip 2これが問題だった場合は、このコードをこのハッキングを使用する代わりに複数回呼び出す理由を調べる必要があります。

+0

関数createTableWidget(data、errorStatus、callbackDataUI){...................... – Illusion

+0

で与えられた答えを確認してください私は上記と同じを使用することができます私はこの関数を呼び出しています - > function createTableWidget(data、errorStatus、callbackDataUI){.........}、および関数は複数回実行されています。 – Illusion

+0

@Illusionこれは汚れたパッチです。すでに述べたように、コードのその部分が複数回呼び出されている理由を確認する必要があります。汚れたパッチだけを追加すると、汚れたコードが汚れてしまいます。 rootを修正すると、 "複数回実行中"の問題に直面することはありません。その関数が呼び出されている場所を確認し、親、親などを確認します。また、 'debugger;'行を追加するとブラウザが停止し、どこから来たのかを確認することができます。開発者ツール(F12)を使用する方法を学ぶ必要があります。このようなことには本当に重要です。 –

0
// define a function of runOce 
function runOnce(fn) { 
    var isDone = false; 
    return function(){ 
    if(isDone){ 
     return; 
    } 
    isDone = true; 
    fn(); 
    }; 
} 

// demo 
function youWantRunFn(){ 
    alert(0); 
} 
var changeYourFn = runOnce(youWantRunFn); 
// now,changeYourFn only can run once 
changeYourFn(); // alert 0 
changeYourFn(); // nothing 
関連する問題