今天需要遇到添加商品的某一类型的时候,原来的类型只有一个下拉框,虽然下拉框有层次缩进,但太长了,很不好使用,于是,想有这么一个处理:
1)首先生成根类的下拉框
2)选择某一个父类的时候,随后生成一个其子类的下拉框,如果有子类的子类(即孙子),不列出它们。
3)以此类推
完成以上功能的话,非JavaScript莫属了。
这里有一个难点,如果处理好只能生成当前父类的子类(如果存在的话),而且不能重复生成子类的下拉框(select)。变化到同级中的另一个父类的时候,之前父类的子类(还有由点击子类生成的其子类(即孙子类)的下拉框,再类推以下几级),都要消失,而是生成当前指向的父类的子类。
说得乱七八糟的吧。其实,也简单,我们要处理的是,当前某层类位置以后东东,我们需要一个东西记录这些东东,以便选择同层中另一个类时候的删除它们,插进该类的子类。
以上也只是自己想得处理这问题的一个方法,当前能力还非常有待提高,所以很期待高人指点。下边贴出代码,JavaScript好些东西是用于致学(即是用的时候,查看了下参考手册,很多东西没了解,用的比较生硬),还有,以下只支持IE,非常郁闷!其它浏览器不支持Event对象的srcElement属性哦!
HTML DOM:
处理xml并生成category的select菜单的JavaScript:xml_category.js
/**
* @param xml_name xml文档的路径
* @param target_id html的DOM的ID
*/
function xml_category(xml_name, target_id)
{
var self = this; // 私有变量,指向对象本身,在JS“类”的封装和访问机制,理解还有待加强。
this.xmlDoc = loadXMLDoc(xml_name) // loadXMLDoc函数见/?p=302
this.targetID = document.getElementByID(target_id);
this.catTree = new Array(); // 记录select的情况
/**
* 产生select下拉框
*/
this.createSelect = function(parent_id)
{
var xmlDoc = self.xmlDoc;
var cat, cat_num;
// 以下为了都兼容各浏览器,不使用用与IE的XML DOM的selectNodes() 方法用一个 XPath(//cat[pid=*])[*表传来对应的parent_id] 查询选择节点.其它浏览器可参考Document.evaluate()。
cat = xmlDoc.getElementByTagName("cat");
cat_num = parseInt(cat.length);
if (cat_num > 0) // 类别存在
{
var slt;
var is_set = false; // 为标志该层是否有类别,即有option选项
slt = document.createElement("SELECT") // 创建一个select元素节点
slt.onchange = self.createChildSelect; // onchange事件
// 每次都是整树遍历啊! !--
for (var i=0, j=0; i < cat_num; i++)
{
// 同层的类别
if (parseInt(cat[i].getAttribute("pid")) === parseInt(parent_id))
{
// option选项
slt.optons[j] = new Option(cat[i].childNodes[0].nodeValue, cat[i].getAttribute("id"));
is_set = true;
j++;
}
}
// 有选项值
if (is_set)
{
self.catTree.push(slt); // 记录这个select下拉框
self.targetID.appendChild(slt);
}
else
{
slt = null;
}
}
}
/**
* 生成子类
*/
this.createChildSelect = function()
{
var slt_len = self.catTree.length;
if (slt_len > 0)
{
var s = 0; // 标记当前触发option在catTree的位置(如果存在的情况)
// 很不顺眼的遍历
for (var i=0; i < slt_len; i++)
{
// srcElement是IE的属性。 !--
if (self.catTree[i] == event.srcElement)
{
s = i ; break;
}
}
// 删除该层位置以后所有的东东
for (var i= slt_len - 1; i > s; i--)
{
self.targetID.removeChild(self.catTree[i]);
seft.catTree.pop();
}
self.createSelect(event.srcElement.value);
}
}
}
下来在之前HTML文档位于id=”cat”写下如下JS,便可实现了:
var xml = xml_category("xml_category.xml", "cat")
xml.createSelect(0);
以上处理,还非常欠缺灵活性,就是初始化这个select下拉框的时候,如果输入的parent_id不是根类的ID,而是子类,或以下几层的子类的ID的时候,不能生成相应的select下拉框。
到此,写下这点记录,希望高人指点,也继续更进~
