2011-07-27 128 views
2

假设我有一个简单的XML只有一个项目......导入XML值?

<myXML> 
    <valuesItem 
     name = 'name' 
     age = 'age' 
     gender = 'gender' 
    /> 
</myXML> 

...,想只导入该项目的属性值是一个jQuery对象这样的新值...

var myObject = { 
     name: 'name', 
     age: 'age', 
     gender: 'gender' 
}; 

...我该怎么办?

我试图达到我的目的是这样,但我至今没有成功:

var myObject = {}; 

$.get(myXML.xml, function(xmlData) { 
     var xmlValues = {}; 

     $(xmlData).find('valuesItem').each(function() { 
      var $item = $(this); 
      xml Values = { 
        name: $item.attr('name'), 
        age: $item.attr('age'), 
        gender: $item.attr('gender') 
      }; 
     }); 

     $.extend(myObject, xmlValues); 
}); 

我怎样才能让公众和$ .get()的返回结果?

+0

TY为编辑托默勒格没有注意到的错误,我相信我不能在标题中使用jQuery ... – RArtDesign

回答

3

这里的问题是,你正在做一个异步的ajax调用。您可以使用$ .ajax并将调用设置为不是异步的,或者如果您必须使用xml数据,则必须在$ .get调用的成功函数中调用函数。

例如,你可以这样做:

var myObject = {}; 

$.ajax({ 
    type: 'get', 
    url: 'myXML.xml', 
    dataType: 'xml', 
    async: false, 
    success: function (xmlData) { 

     $(xmlData).find('valuesItem').each(function() { 
      var $item = $(this); 
      myObject = { 
        name: $item.attr('name'), 
        age: $item.attr('age'), 
        gender: $item.attr('gender') 
      }; 
     }); 
    } 
}); 
//here myObject is set because it waits for the call to finish 
+0

谢谢Nicola,但这不起作用! 如果你注意到我的代码myObject是在get()之外声明的... 逻辑是一样的唯一的区别是你试图直接给myObject赋新值而在我的情况下我用$ .extend来合并两个对象... – RArtDesign

+0

是的,你是对的:问题是$ .get()调用是异步的,所以你将不得不使用$ .ajax并使其同步,我认为 –

+0

好吧!就是这个! “异步”是我的问题!谢谢尼古拉! – RArtDesign

1

你可以这样做。

var myObject = {}; 

$.ajax({ 
    type: 'get', 
    url: 'myXML.xml', 
    dataType: 'xml', 
    success: function (data) { 
    myObject = data; 
    } 
}); 

无论其,如果你把一个处理XML $.ajax()后直接你会遇到各种错误,因为调用将没有完成的代码。

更好的,你把所有的逻辑成功函数内,像这样..

$.ajax({ 
    type: 'get', 
    url: 'myXML.xml', 
    dataType: 'xml', 
    success: function (data) { 
    //do stuff with data here 
    //the variable "data" holds all of your xml, parsed into a JavaScript object 
    } 
}); 

如成功将不会被调用,直到服务器响应请求。

编辑:你可能会更好地为你的特定用例做这样的事情。

首先定义一个函数,它的参数data并设置插件

startPlugin = function (data) { 
    var newoptions = {}; 
    newOptions.name = data.myXML.valuesItem.name; 
    newOptions.age = data.myXML.valuesItem.age; 
    newOptions.gender = data.myXML.valuesItem.gender; 

    //start the plugin here with newOptions 
} 

然后,传递函数到AJAX作为成功回调。

$.ajax({ 
    type: 'get', 
    url: 'myXML.xml', 
    dataType: 'xml', 
    success: startPlugin 
}); 

$.ajax()可以设置async为false发出请求同步,但一个被认为是不好的做法。

+0

TY格雷格! 我会试试这个......也许在$ .get函数中找到并试图弄清楚我做错了什么不是最好的解决方案!我会告诉你! – RArtDesign

+0

@RArtDesign'$ .get()'只是'$ .ajax()'的简写,其中填充了一些参数。但是当你这样做的时候,你可以将'dataType'设置为xml,这很好,因为jQuery为你做了xml解析,你可以像这样调用你的成员......'data.myXML.valuesItem.name'那么, –

+0

。 。 。我使用$ .get获得相同的结果...“未定义” – RArtDesign