2012-04-09 12 views
0

Matthew Eernise(詳細はhere)の「自分のAJAX Webアプリケーションの構築」のチュートリアルに基づいて、JavaScriptを使用して基本的なAjaxライブラリを作成しようとしました。 AJAX XML-RPCとRESTのこの本に基づいてAJAXやXMLHttpRequestを取得するためのJavaScriptコンストラクタ関数を作成しましたが、どういうわけかスコープ外の問題を抱えているようで、Ajaxクラスは次のスクリプトでは定義されていません:基本的なAjaxライブラリのバグ

私はスコープの問題を修正するためにvar self = this; // fix loss-of-scope in inner function を追加しましたにもかかわらず、エラーajax is not definedを取得

var hand = function (str) { 
    alert(str); 
} 
var Ajax = new Ajax(); // new instance as can ben done with PHP5 constructor classes 
ajax.doGet ('/fakeserverpage.php', hand); 

と、このスクリプトをロードするとAjaxの新しいインスタンスを起動するページに取得エラー。私は何が欠けていますか?

アップデート1

彼らは衝突しないように、ここでは先端のおかげで、新しいインスタンスに別の名前を与えた:

var hand = function (str) { 
    alert(str); 
} 
var ajax = new Ajax(); // new instance as can ben done with PHP5 constructor classes 
ajax.doGet ('/fakeserverpage.php', hand); 

を今、私はもう少しです。 Uncaught TypeError: Object #<Ajax> has no method 'doGet'

アップデート2

ここでは共同のDEVによって推奨されているように、私が代わりにthis.initAjax.prototype.initを使用してみましたが、私はまだ同じエラーを持っている...

更新:今、私は新しいエラーを取得します3 @Soufiana Hassouのおかげで、すべてのメソッドにAjax.prototypeを追加してコードを改善しました。コンストラクターと一緒に作業する必要があることは分かりませんでしたが、それはあります。コードはhttp://pastebin.com/g86k0z8dです。 Could not create XMLHttpRequest object.このエラーメッセージはメソッドに組み込まれているので動作しますが、何らかの形でオブジェクトを作成することはできません。これは、XMLHttpRequestに対する私の要求にエラーがあることを意味します。すべてのケースをカバーし、ローカルMacPorts MAMPのコードを使用してMac用Firefox 11でこれをテストしました。どちらかというか、私が知らない何か他のもの..

更新4た誤植を修正しました

があります。それから私は偽のサーバページをロードする404を得ました。修正されたパスajax.doGet ('/ajax/fakeserverpage.php', hand);今すぐOK。私はOKを得るためにコードを生成するためにPHPを取得する必要があります。ヘッダーの応答はOKですが、まだAJAXアラートは表示されません。それから私は、コンソールをチェックし、このエラーを検出しました:http://pastebin.com/g86k0z8d

self.req is undefined 
http://localhost/ajax/ajax.js 
Line 78 

は、最新のコードを参照してください。私は彼らがまだ必要であると思ったところでさらにAjax.prototypeを追加しました。今、私が取得:いくつかのより多くの変更がVAR self = thisを使用して範囲外の問題のために最初に使用されるいくつかの自殖を取り除くメイド

this.req is null 
http://localhost/ajax/ajax.js 
Line 100 

更新5

。コードはまだ同じpastebinですが、私はそれを更新しました。今、私が持っている:

Ajax.prototype.handleResp is not a function 
http://localhost/ajax/ajax.js 
Line 92 

更新6

私はreq.onreadystatechange = function()機能に犯した過ちの一部をクリーンアップし、今、私が実行しません。私はlocalhostのFirefoxポップアップブロッカーを無効にして、リロード時に別のタブを開き、テキストundefinedを表示しました。だからほとんどそこにある。エラーはなく、OKのポップアップはありません。 Chromeは本体にundefinedというポップアップを表示しました。更新コード:http://pastebin.com/g86k0z8d通常通り

答えて

3

インスタンスとクラス自体に同じ名前が使用されています。 また、Ajaxを宣言し、ajaxを使用すると、Javascriptでは大文字と小文字が区別されます。

+0

ありがとうございます!今私はさらなる一歩を踏み出しています。なぜ私は今私が得ているエラーを得るのかを理解する必要があります - 更新された質問を見てください。 – rhand

+0

arxanasの答えを見てください。あなたの新しいエラーはどこから来たのでしょうか? –

+0

はい、私は 'Ajax.prototype.init = function(){'を試しましたが、それでも私には同じエラー 'Uncaught TypeError :オブジェクト#にはメソッド 'doGet'がありませんので、他に何かがあるはずです。まだ – rhand

1

まず、var Ajax = new Ajax();があります。代わりにvar ajax = new Ajax();が必要です。

第2に、コンストラクタ外のthisを使用しても、Ajaxオブジェクトは参照されません。代わりにプロトタイプを使用してください:

function Ajax() { 
    // Set properties here 
} 
Ajax.prototype.init = function() { 
    // ... 
} 

詳細については、this article on Javascript classesを参照してください。