我正在尝试在表单提交上创建一个JSON对象以传递给Perl。
我有几个嵌套div
,其中ul
和li
s允许jQuery-ui可排序排序。
为了能够保存已排序的li
(分布在几个div
上),我编写了以下代码:
jQuery("form[name='editorview']").submit(function(event) {
event.preventDefault();
var values = '{ ';
jQuery(this).find(".div_abcd").each(function(){
values += '"'+this.id+'": [';
jQuery(this).find("div[id^='CONT']").each(function(){
values += '{"'+this.id+'": [';
jQuery(this).find("li").each(function(){
if (jQuery(this).not("class='placeholder'")){
values += '"'+this.id+'",';
} else {
values +='"placeholder",';
}
});
values = values.slice(0, -1); //removing trailing ,
values +=']},';
});
values = values.slice(0, -1); //removing trailing ,
values += '],';
});
values = values.slice(0, -1); //removing trailing ,
values += '}';
jQuery("#order").val(values);
document.editorview.submit();
});
类div
最多有4 div_abcd
个,但它们不一定包含其他div
个。在这种情况下,我遇到第二个values = values.slice(0, -1);
从第5行删除开头[
的问题。
如果else
与任何内容不匹配,有没有办法jQuery(this).find("div[id^='CONT']").each(function(){
。我尝试使用.not()
,但它没有用。
修改
即使我的问题已经解决,我仍然想知道是否有可能知道每个()都没有经历过一次。
第二次编辑:
现在一切都清楚了。感谢。
答案 0 :(得分:5)
我敢打赌,有一个比循环更好的方法,但是一开始:不要手动构建字符串!
var values = {};
jQuery(".div_abcd", this).each(function(){
var a = values[this.id] = [];
jQuery("div[id^='CONT']", this).each(function(){
var obj = {};
obj[this.id] = jQuery("li", this).map(function() {
if (jQuery(this).is(".placeholder")){
return "placeholder";
}
return this.id;
}).get();
a.push(obj);
});
});
values = JSON.stringify(values);
更新:您还必须使用is()
代替not()
选中DEMO。
更新以回答您的问题:
您始终可以使用length
检查选择的元素数量:
var $elements = jQuery(this).find("div[id^='CONT']");
if($elements.length > 0) {
$elements.each(...);
}
else {
// something else
}
答案 1 :(得分:1)
您可以将结果输入变量并检查结果的长度。如果它不是空的,你可以进行循环,否则你可以跳过修剪。