2011-07-27 92 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