循环反转数组的Javascript
我在for循环中填充了2个下拉控件,这两个控件都是包含相同数据的telerik下拉控件(月份或季度)。奇怪的是,这段代码的结果是,一个控件从一月到十二月进行排序,而另一个控件则相反,从十二月到一月(monthto下拉列表)。我已经修复了第二段代码的问题,但是想了解为什么会发生这种情况,某种参考问题 以下是生成交替下拉列表的代码:循环反转数组的Javascript,javascript,telerik,Javascript,Telerik,我在for循环中填充了2个下拉控件,这两个控件都是包含相同数据的telerik下拉控件(月份或季度)。奇怪的是,这段代码的结果是,一个控件从一月到十二月进行排序,而另一个控件则相反,从十二月到一月(monthto下拉列表)。我已经修复了第二段代码的问题,但是想了解为什么会发生这种情况,某种参考问题 以下是生成交替下拉列表的代码: function PeriodChoiceIndexChange(sender, args) { var itemText = args.get_item(
function PeriodChoiceIndexChange(sender, args) {
var itemText = args.get_item()._text;
var monthToDropDown, monthFromDropDown ;
monthToDropDown = $find("<%= ToMonthDropDown.ClientID %>");
monthFromDropDown = $find("<%= FromMonthDropDown.ClientID %>");
var months = new Array();
months[0] = "Jan";
months[1] = "Feb";
months[2] = "Mar";
months[3] = "Apr";
months[4] = "May";
months[5] = "Jun";
months[6] = "Jul";
months[7] = "Aug";
months[8] = "Sep";
months[9] = "Oct";
months[10] = "Nov";
months[11] = "Dec";
var quarters = new Array();
quarters[0] = "Q1";
quarters[1] = "Q2";
quarters[2] = "Q3";
quarters[3] = "Q4";
monthToDropDown.trackChanges();
monthToDropDown.clearItems();
monthToDropDown.commitChanges();
monthFromDropDown.trackChanges();
monthFromDropDown.clearItems();
monthFromDropDown.commitChanges();
if (itemText == "Quarterly") {
for (var i = 0; i < quarters.length; i++) {
var comboItem = new Telerik.Web.UI.RadComboBoxItem();
comboItem.set_text(quarters[i]);
comboItem.set_value(quarters[i]);
monthToDropDown.trackChanges();
monthToDropDown.get_items().add(comboItem);
monthToDropDown.commitChanges();
monthFromDropDown.trackChanges();
monthFromDropDown.get_items().add(comboItem);
monthFromDropDown.commitChanges();
}
} else {
for (var i = 0; i < months.length; i++) {
var comboItem = new Telerik.Web.UI.RadComboBoxItem();
comboItem.set_text(months[i]);
comboItem.set_value(months[i]);
monthToDropDown.trackChanges();
monthToDropDown.get_items().add(comboItem);
monthToDropDown.commitChanges();
monthFromDropDown.trackChanges();
monthFromDropDown.get_items().add(comboItem);
monthFromDropDown.commitChanges();
}
}
return false;
}
函数周期选择索引交换(发送方,参数){
var itemText=args.get_item()。_text;
变量monthToDropDown,monthFromDropDown;
monthToDropDown=$find(“”);
monthFromDropDown=$find(“”);
var months=新数组();
月[0]=“一月”;
月[1]=“2月”;
月[2]=“三月”;
月[3]=“4月”;
月[4]=“五月”;
月[5]=“六月”;
月[6]=“7月”;
月[7]=“8月”;
月[8]=“九月”;
月[9]=“10月”;
月[10]=“11月”;
月[11]=“12月”;
var quarters=新数组();
季度[0]=“Q1”;
季度[1]=“第二季度”;
季度[2]=“第三季度”;
季度[3]=“第四季度”;
monthToDropDown.trackChanges();
monthToDropDown.clearItems();
monthToDropDown.commitChanges();
monthFromDropDown.trackChanges();
monthFromDropDown.clearItems();
monthFromDropDown.commitChanges();
如果(itemText==“季度”){
对于(变量i=0;i
以下是以相同顺序填充两个控件的代码:
if (itemText == "Quarterly") {
for (var i = 0; i < quarters.length; i++) {
var comboItem = new Telerik.Web.UI.RadComboBoxItem();
comboItem.set_text(quarters[i]);
comboItem.set_value(quarters[i]);
var comboItem1 = new Telerik.Web.UI.RadComboBoxItem();
comboItem1.set_text(quarters[i]);
comboItem1.set_value(quarters[i]);
monthToDropDown.trackChanges();
monthToDropDown.get_items().add(comboItem);
monthToDropDown.commitChanges();
monthFromDropDown.trackChanges();
monthFromDropDown.get_items().add(comboItem1);
monthFromDropDown.commitChanges();
}
} else {
for (var i = 0; i < months.length; i++) {
var comboItem = new Telerik.Web.UI.RadComboBoxItem();
comboItem.set_text(months[i]);
comboItem.set_value(months[i]);
var comboItem1 = new Telerik.Web.UI.RadComboBoxItem();
comboItem1.set_text(months[i]);
comboItem1.set_value(months[i]);
monthToDropDown.trackChanges();
monthToDropDown.get_items().add(comboItem);
monthToDropDown.commitChanges();
monthFromDropDown.trackChanges();
monthFromDropDown.get_items().add(comboItem1);
monthFromDropDown.commitChanges();
}
}
if(itemText==“季度”){
对于(变量i=0;i
正如你所看到的,虽然我已经解决了这个问题,但我想理解这个逆转背后的理论,@nnnnnn所说的是正确的。在循环中,我们将元素添加到第一个下拉列表中,然后尝试将其添加到第二个下拉列表中。但是,将相同的元素添加到第二个下拉列表中会将其从第一个下拉列表中删除
我创建了一个示例来说明实际发生的情况
function PeriodChoiceIndexChange(sender, args) {
var monthToDropDown = $find("ToMonthDropDown"),
monthFromDropDown = $find("FromMonthDropDown");
var months = new Array();
months[0] = "Jan";
months[1] = "Feb";
monthFromDropDown.trackChanges();
monthFromDropDown.clearItems();
monthFromDropDown.commitChanges();
monthToDropDown.trackChanges();
monthToDropDown.clearItems();
monthToDropDown.commitChanges();
for (var i = 0; i < months.length; i++) {
var comboItem = new Telerik.Web.UI.RadComboBoxItem();
comboItem.set_text(months[i]);
comboItem.set_value(months[i]);
alert("[" + i + "][0] From Count = " + monthFromDropDown.get_items().get_count() + "; To Count = " + monthToDropDown.get_items().get_count());
monthFromDropDown.get_items().add(comboItem);
alert("[" + i + "][1] From Count = " + monthFromDropDown.get_items().get_count() + "; To Count = " + monthToDropDown.get_items().get_count());
monthToDropDown.get_items().add(comboItem);
alert("[" + i + "][2] From Count = " + monthFromDropDown.get_items().get_count() + "; To Count = " + monthToDropDown.get_items().get_count());
}
alert("[PeriodChoiceIndexChange] End");
return false;
}
是不是
month下拉列表
被颠倒了?顺便说一句,var quarters=[“Q1”、“Q2”、“Q3”、“Q4”]
和类似的months
比一次添加一个元素更短更容易…@nnnnnn编辑的问题谢谢,这是monthToDropDown,关于数组初始化是正确的!我不熟悉Telerik,但从一般意义上讲,当您将一个html元素附加到另一个html元素时,所附加的元素将从其以前的父元素中删除(而不是复制)。因此,我猜测(显然我可能完全错了)monthToDropDown
是相反的,因为在原始代码中,当您使用.add(comboItem)
将相同的项目添加到两个组合中时,可能是第二个.add()
将其从monthToDropDown
中删除,因此在每次迭代monthToDropDown
中只有一个选项元素,这会混淆UI组件,使其在列表的开头添加新的选项。(另一方面,我假设UI组件只在后台使用monthToDropDown
作为源代码,并构建一个更为奇特的控件来显示。)
Loop Alert0 Alert1 Alert2
0 0, 0 1, 0 0, 1
1 0, 1 1, 1 0, 2
var comboItem = new Telerik.Web.UI.RadComboBoxItem();
comboItem.set_text(quarters[i]);
comboItem.set_value(quarters[i]);
monthToDropDown.trackChanges();
monthToDropDown.get_items().add(comboItem);
monthToDropDown.commitChanges();
comboItem = new Telerik.Web.UI.RadComboBoxItem();
comboItem.set_text(quarters[i]);
comboItem.set_value(quarters[i]);
monthFromDropDown.trackChanges();
monthFromDropDown.get_items().add(comboItem);
monthFromDropDown.commitChanges();