jQuery:累积循环错误,不确定源代码和代码包括控制台

时间:2013-07-15 03:09:20

标签: jquery

我正在尝试做什么:

如果点击具有两个特定属性(<li>data-model)的data-state元素,则函数应收集每个data-id元素的<li>属性使用两个特定的数据属性并将它们折叠成一个字符串,以成为ajax调用的一部分。

有什么不对

每当函数触发时,它会继续触发更多次,因为它已被调用到目前为止(这让我感到困惑,请参阅下面的控制台打印输出)。

此外,.toggleClass()被反复调用(并且越来越频繁),因此activeDomains不仅仅是在积累。我只是完全被这个问题困住了 - 如果需要任何信息,请告诉我。如果重要的话,我正在使用CakePHP进行开发,但主要使用外部JS文档或缓冲脚本(即。$this->Js-buffer())而不是Cake的JsHelper。

我的代码

注意:为避免命名空间冲突,我使用jQuery.noConflict(),因此$ j

$j( 'li[data-model="domain"][data-state=0]').click( function() {
    var controller = "subjects";
    var action = "fetchByDomain";

    //inspect and toggle state
    $j(this).toggleClass("selected").attr("data-state", 1);

    //collect list of domains to send to subjects controller
    var activeDomains = [];
    $j('li[data-model="domain"][data-state=1]').each(function () { activeDomains.push(  $j(this).attr("data-id"))});

    console.log(activeDomains); //see output below

    //reload #subjectsList, WWW, APP, & DS are defined globally
    $j("#subjectList").load(WWW + APP + DS + controller + DS + action + DS + activeDomains.join(","));
});

相关HTML

<div class="row">
    <div class="large-4 columns">
        <div id="domainList" class="row">
            <ul>
                <li data-id="2" data-parentid="-1" data-model="domain" data-state=0 class="module-filter">English</li>
                <li data-id="5" data-parentid="-1" data-model="domain" data-state=0 class="module-filter">Fine Arts</li>
                <li data-id="3" data-parentid="-1" data-model="domain" data-state=0 class="module-filter">Mathematics</li>
                <li data-id="1" data-parentid="-1" data-model="domain" data-state=0 class="module-filter">Psychology</li>
                <li data-id="4" data-parentid="-1" data-model="domain" data-state=0 class="module-filter">Sociology</li>            
            </ul>
     </div>
     <div id="subjectList" class="row"></div>
     <div id="excerptList" class="row"></div>
</div>

控制台输出

假设我有5个列表元素,其中data-id值为1-5,这是随时间变化的输出:

点击<li data-id=1>

[ “1”]

点击<li data-id=2>

[ “1”, “2”]

[ “1”, “2”]

点击(再次)<li data-id=2>

[“1”,“2”]

[ “1”, “2”]

这里至少对我来说! - 真的很奇怪:

点击<li data-id=3>

[ “1”, “2”, “3”]

[ “1”, “2”, “3”]

[ “1”, “2”, “3”]

[ “1”, “2”, “3”]

[ “1”, “2”, “3”]

[ “1”, “2”, “3”]

1 个答案:

答案 0 :(得分:0)

您可以像其他人一样使activeDomains全局变量并替换

$j('li[data-model="domain"][data-state=1]').each(function () { activeDomains.push(  $j(this).attr("data-id"))});

activeDomains.push($(this).attr("data-id"));