JavaScript中的对象歧义

萨钦·维玛(Sachin Verma)

我在页面中多次加载了一些JavaScript。

var chart = new AmCharts.AmSerialChart();
...more with chart object...
        $( "#chartdiv${divId}" ).closest('#mainBox').find('#toggleTrendline').on('click',
                     function() {
                if(chart.trendLines==""){
                    chart.addTrendLine(trendLine)
                    }else{
                    chart.removeTrendLine(trendLine)
                        }
                chart.validateNow()
              });

在上面的代码中,它可以访问chart对象,因为该代码在使用图表对象的同一脚本中。
但是由于同一页面上有多个图表,因此该脚本被多次加载,并且所有图表的脚本都将具有图表对象。
现在我的问题是:
每当上述代码中的事件发生时,它都不知道chart要处理哪个对象,addTrendLine因此它会调用addTrendLine/removeTrendLine随机图表对象。
有道理?

我如何管理事情,以便每个事件处理程序将仅处理相关图表上的事件object
任何人都可以帮助,在此先感谢。

TJ人群

每当以上代码中的事件发生时,它都不知道要处理哪个图表对象,addTrendLine因此它将在随机对象调用addTrendLine/ 有道理?removeTrendLinechart

不,不是。假定正在按所示方式加载此代码(不在另一个函数内),则该事件将始终使用最后 chart加载对象,因为chart每次加载该代码时,该全局变量都会被覆盖。

我该如何管理事情,以便每个事件处理程序将仅处理相关图表对象上的事件。

通过将该代码置于作用域函数中,并使处理程序关闭其自己的副本chart

(function () {
    var chart = new AmCharts.AmSerialChart();
    //...more with chart object...
    $("#chartdiv${divId}")
        .closest('#mainBox')
        .find('#toggleTrendline')
        .on('click',
            function () {
                if (chart.trendLines == "") {
                    chart.addTrendLine(trendLine)
                } else {
                    chart.removeTrendLine(trendLine)
                }
                chart.validateNow()
            }
        );
})();

现在,在作用域内是事件处理程序关闭chart局部变量这些单元中的每一个都是独立的。

当然,我只是指出您正在使用带有ids的元素(如#mainBox),并且ids在页面上必须是唯一的,因此在代码的多个加载之间将存在交互。可能有一种更好的方法来构造它,但是以上内容至少可以满足您的要求,chart每次重复代码时都会给您一个单独的名称。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章