0

我正在尝试做的事情:

当单击<li>具有两个特定属性 (data-modeldata-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"]

4

1 回答 1

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"));
于 2013-07-15T04:33:47.677 回答