1

私は本当に改善したいjsコードを持っていますが、その方法はわかりません。以下の動作バージョンには、グローバル変数と、無名関数にマージできると思われる個別の関数宣言があります(以下のコードを抜粋:動作していません)

ヘルプやポインタをいただければ幸いです。

作業バージョン

var Data = {}; // would like to remove the global variable

function callBack() {
    $.ajax({
        url: "http://host/callBacks/script.js",
        //get and execute Script to process json data below
        dataType: "script"
    });
}


$(document).ready(function() {
    $.ajax({
        type: "Get",
        url: "http://host/data/json/",
        success: function(json) {
            Data = json; // Would like to just call the callback here
            callBack(Data);
        },
        error: function() {
            alert("error");
        }
    });
});


// Script which gets loaded from callBack
(function(Data) {
    var json = $.parseJSON(Data);
    $.each(json, function(i, v) {
        alert(v);
    });
})(Data);

必要なコード:機能しない

// Error: Length is null or not an object. In jQuery script

var Data = {}; // Ideally would like to remove this from global scope if possible

$(document).ready(function() {
    $.ajax({
        type: "Get",
        url: "http://host//data/json/",
        success: function(Data) {
            $.ajax({
                url: "http://host/callBacks/script.js",
                dataType: "script"
            });
        },
        error: function() {
            alert("error");
        }
    });
// Error: Length is null or not an object. In jQuery script

更新:adeneoの回答によると:グローバルデータへの必要性= {}; 返されたすぐに実行されるスクリプトがパラメータとして取り込まれるため、

var Data = {};

$(document).ready(function() {
    function doAjax() {
        return $.ajax({
            type: "GET",
            url: "http://host/data/json/"
        });
    }

    var XHR = doAjax();
    XHR.done(function(data) {
        Data = data; // <--- If I remove this I get Error:'length' is not or not an object
        $.ajax({
            url: "http://host/callBacks/script.js",
            dataType: "script"
        });
    }).fail(function() {
        alert("error");
    });
});

しかし、十分に良いようです。おそらく、私はこれをIE8でテストしていることに言及する必要があります。制約。更新されたタグ

4

3 に答える 3

3
$(function() {
    function doAjax() { //put inside function
        return $.ajax({ //return deffered object
            type: "GET",
            url: "/data/json/" //X domain not supported
        });
    }

    var XHR = doAjax();  //do ajax call
    XHR.done(function(data) { // use deffered object
        var json = $.parseJSON(data); //why would you need to get an external script just to parse some JSON?
        $.each(json, function(i, v) {
            alert(v);
        });
    }).fail(function() {
        alert("error");
    });
});
于 2012-08-20T05:04:07.330 に答える
0

グローバル変数と関連関数をクラスに管理し、そのクラス内でオブジェクトを作成できます。

$(document).ready(function(){
    // Your code here !
});
于 2012-08-20T05:04:46.053 に答える
0

次のようなものはどうですか?

(function () {

    var myData_andMethod = {
        data : {},
        method : function (data) { this.data = JSON.parse(data); }
    };

    $.ajax({success : (function (obj) {
            var callback = obj.method.bind(obj);
            return function (data) {
                callback(data);
            };
        }(myData_andMethod)) //, error : function... url:"".....
    });
    //attach events here.
}());

これで、グローバルなものは0個になりました。
今を除いて、コールバックが発生したらすぐにデータを処理する必要があります(または、データが永久に失われ、二度とアクセスできなくなります)。または、データをに送信する必要があります。既知のスコープ(グローバルまたはアプリの一部など)にある関数、またはパブリックにアクセス可能な変数に貼り付けて、クロージャーが封印された後にデータにアクセスできるようにますコールバックが戻ってきます。

myData_andMethodオブジェクトを他の場所に格納する他の関数にオブジェクトを送信するような単純なものでも...

于 2012-08-20T05:31:14.347 に答える