我正在尝试做的事情:
当单击<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"]