2012-04-27 5 views
0

私は現在、私が持っているXMLファイルの値を使ってドロップダウンリストを作成するjavascriptクロージャを作成しようとしています。私はそれをコードの大部分のために働かせ、使用するたびにXMLファイルをロードしていました。私はコードをより効率的にしたいと思って、XMLファイルを一度ロードするだけです。私は以下のコードを使用してこれをしようとしましたが、エラーが続いています。これは、関数を呼び出すコードをあるjavascriptクロージャーでXMLファイルを一度ロードする

var closure = function() { 

    var xmlDoc; 

    return{ 

      setXML: function() 
      { 
       xmlDoc = this.loadXMLDoc("feed.xml"); 
      }, 


      loadXMLDoc: function(dname) 
      { 
       if (window.XMLHttpRequest) 
       { 
        xhttp=new XMLHttpRequest(); 
       } 
       else 
       { 
        xhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
       } 

       xhttp.open("GET",dname, false); 
       xhttp.send(); 
       return xhttp.responseXML; 
      }, 


      createField: function() 
      { 
       x = xmlDoc.getElementsByTagName("name"); 
       //code to create the drop down box 
      }, 

      findValue: function() 
      { 
       y = xmlDoc.getElementsByTagName("value"); 
       //code to find value 
      } 

    }; 

}(); 

これは私が閉鎖を持っているコードです... ...

$(document).ready(function() { 
    closure.setXML(); 
}); 

私は取得していますエラーは「できないです定義されていない 'getElementsByTagName'メソッドを呼び出します。これはcreateField関数にあります。これは、私がxmlDocを使用しようとする最初のインスタンスです。

問題に関するヘルプやチュートリアルは大変ありがたいです。

答えて

1

あなたはdoint jQueryなので、クロージャでもjQueryを使用してみませんか? xmlDocundefinedの場合は、読み込み中に問題が発生することがあります。 console.logを実行して、AJAXの実行後にデータが返されたかどうかを確認してください。

var closure = (function($) { 

    var xmlDoc; 

    return { 
     setXML: function() { 
      this.loadXMLDoc("feed.xml", function(data) { 
       xmlDoc = data; 
      }); 
     }, 
     loadXMLDoc: function(dname, callback) { 
      $.get(dname, function(data) { 

       //a possible point of failure 
       //do console.log(data) to see if anything was returned 

       callback(data); 
      }, 'xml'); 
     }, 
     createField: function() { 
      x = $("name",xmlDoc); 
      //code to create the drop down box 
     }, 
     findValue: function() { 
      y = $("value",xmlDoc); 
      //code to find value 
     } 
    }; 
}(jQuery));​ 
+0

私はこれを実装しようとしましたが、エラー 'callback is undefined'が返されます。しかし、console.log(data)はすべてのXMLデータを返すので、うまくいくようです。 – Phil

+0

@Phil [ここで動作するようです](http://jsfiddle.net/vC8ZQ/)。 'callback'は、' loadXMLDoc'が呼び出されたときに渡される関数です。コールバックがまったく渡されなかった場合にのみ 'undefined 'になっていました。 – Joseph

+0

申し訳ありませんコードの一部を見逃してしまいましたが、私はいつも答えを使ってコードを変更しています。コピーして貼り付けるのではなく、どのように動作するかを知りたいからです...ありがとう – Phil

関連する問題