我试图创造一种通用的XML解析器,像这样的:1jQuery的范围问题
部分:
与过滤的对象被创建:
var product = {
holder : {
id: '',
title: '',
text : '',
price: ''
},
filter : {
id: '',
test: function(elementHolder) {
if(elementHolder.id == product.filter.id) {
return true;
}
return false;
}
}
}
第2部分:
XML解析器:
/*
* Generic XML parser
* Parses the url into elementHolder objects
*/
var xmlParser = {
parseXml: function(url, node, element, functie) {
var i = 0; // result counter
var result = []; // the result array
/*
* Open the xml file
*/
jQuery.get(url, function(data){
/*
* Loop through the results, if we have a filter, apply it.
*/
jQuery(data).find(node).each(function(){
/*
* Copy the element holder
*/
var elementHolder = element.holder;
var elementData = jQuery(this);
/*
* Fill the copied holder with the xml data
*/
elementData.children().each(function() {
elementHolder[ this.nodeName ] = jQuery(this).text();
});
/*
* if the filter applies, add the holder to the result
*/
if(element.filter.test(elementHolder)) {
result[i] = elementHolder; $i++;
}
// console.log(result);
});
/*
* If there is a callback (prevents the result from parsing before it is ready)
*/
try {
if (typeof functie == "undefined") {
throw 'There is no callback function specified.';
}
} catch(e) { alert(e); return; }
functie(result);
});
}
}
3部分:
调用的文件准备:
product.filter.id = 11;
/*
* parsen
*/
var productXml = 'test.xml';
xmlParser.parseXml(productXml, "product", product, function(data) {
console.log('result:');
console.log(data);
});
第4部分:
的的test.xml:
<data>
<products>
<product>
<id>1</id>
<title>test 1</title>
<text>text 1</text>
<price>1.00</price>
</product>
<product>
<id>2</id>
<title>test 2</title>
<text>text 2</text>
<price>2.00</price>
</product>
<product>
<id>3</id>
<title>test 3</title>
<text>text 3</text>
<price>3.00</price>
</product>
</products>
</data>
它所有的工作,除了一件事罚款;
结果被新创建的持有者覆盖每个循环,有没有人有任何想法如何解决这个问题? (我认为它的确与范围有关)。
谢谢!
这个函数会使用firefox,它甚至可以使用这个函数: function clone(obj)if(obj == null || typeof(obj)!='object') return obj; var temp = new obj.constructor(); (var key in obj) temp [key] = clone(obj [key]); return temp; } – FrankBr 2009-08-13 07:10:46