2017-03-22 86 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

所以,你正在把一些东西放在一个循环中,并想知道为什么循环实际运行? – baao

+0

使用['$ .one()'](http://api.jquery.com/one/)。这将附加处理程序,并且每个事件类型每个元素最多执行一次。 – 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); 
    }); 
}); 

这将重新安装之前卸下的事件,因此,如果被称为一个以上的时间,将有一次连接,其实。

Protip:保持您的缩进清洁。 Protip 2:如果这是问题,那么你应该看看为什么这段代码被称为多次而不是使用这种黑客。

+0

函数createTableWidget(data,errorStatus,callbackDataUI)给出的答案{...................... – Illusion

+0

我可以使用上面的相同代码这也是因为我调用这个函数 - >函数createTableWidget(data,errorStatus,callbackDataUI){.........},并且函数运行多次。 – Illusion

+0

@Illusion这是一个肮脏的补丁,正如我已经说过的,你必须检查为什么这部分代码被多次调用。如果你只是添加肮脏的补丁,你最终会得到一个脏破碎的代码。如果你修复了根,那么你将不会再面临“多次运行”的问题。检查调用的函数的位置,并检查父项和父项等。另外,添加'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 
相关问题