我正在尝试做什么:
如果点击具有两个特定属性(<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”]
答案 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"));