2010-03-08 4 views
19

Ich benutze die jQuery $ .ajax() -Funktion. Ich habe dies in eine Elternfunktion eingefügt, die einige Werte in die Ajax-Funktion übergibt. Was ich tun möchte, ist eine benutzerdefinierte Callback-Funktion, die den Datenparameter von der Ajax-Erfolgsfunktion erhält. Hier

ist, was ich dachte funktionieren würde, aber es ist nicht:

testFunc = function(str, callback) { 
    // Send our params 
    var data = 'some data to send'; 
    $.ajax({ 
     type: 'POST', 
     url: 'http://www.myurl.com', 
     data: data, 
     success: callback 
    }); 
} 

Dann habe ich diese Funktion aufrufen können, wollen, und in meiner benutzerdefinierten Funktion übergeben, so dass ich die Erfolgs Funktionen nutzen Daten aus dem Inneren dieser Funktion:

testFunc('my string data', function(data){ 
    alert(data); 
}); 

ich dies wollte das gleiche wie sein:

testFunc = function(str, callback) { 
    // Send our params 
    var data = 'some data to send'; 
    $.ajax({ 
     type: 'POST', 
     url: 'http://www.myurl.com', 
     data: data, 
     success: function(data) { 
      alert(data); 
     } 
    }); 
} 
+0

Sind Bist du sicher, dass du einen "Erfolg" bekommst? – Jeremy

+0

Ja, ich bekomme einige Daten durch "Erfolg". –

Antwort

29

Arbeiten gut für mich:

<script src="/jquery.js"></script> 
<script> 
var callback = function(data, textStatus, xhr) 
{ 
    alert(data + "\t" + textStatus); 
} 

var test = function(str, cb) { 
    var data = 'Input values'; 
    $.ajax({ 
     type: 'post', 
     url: 'http://www.mydomain.com/ajaxscript', 
     data: data, 
     success: cb 
    }); 
} 
test('Hello, world', callback); 
</script> 
+0

Nicht sicher, was ich vermisst habe, aber Ihrem Beispiel folgend, hat es perfekt funktioniert. Danke! –

1

Ich glaube, Ihr Problem ist, dass Sie testFunct einen String, und nicht ein Funktionsobjekt sind vorbei, (ist das überhaupt möglich?)

1

Obwohl ich bin nicht 100% sicher was Sie wollen (wahrscheinlich ist mein Gehirn langsam heute), hier ist ein Beispiel für eine ähnliche Verwendung zu dem, was Sie beschreiben:

function GetProcedureById(procedureId) 
{ 
    var includeMaster = true; 
    pString = '{"procedureId":"' + procedureId.toString() + '","includeMaster":"' + includeMaster.toString() + '"}'; 
    $.ajax({ 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     data: pString, 
     datatype: "json", 
     dataFilter: function(data) 
     { 
      var msg; 
      if (typeof (JSON) !== 'undefined' && 
        typeof (JSON.parse) === 'function') 
       msg = JSON.parse(data); 
      else 
       msg = eval('(' + data + ')'); 
      if (msg.hasOwnProperty('d')) 
       return msg.d; 
      else 
       return msg; 
     }, 
     url: "webservice/ProcedureCodesService.asmx/GetProcedureById", 
     success: function(msg) 
     { 
      LoadProcedure(msg); 
     }, 
     failure: function(msg) 
     { 
      // $("#sometextplace").text("Procedure did not load"); 
     } 
    }); 
}; 
/* build the Procedure option list */ 
function LoadProcedure(jdata) 
{ 
    if (jdata.length < 10) 
    { 
     $("select#cptIcdProcedureSelect").attr('size', jdata.length); 
    } 
    else 
    { 
     $("select#cptIcdProcedureSelect").attr('size', '10'); 
    }; 
    var options = ''; 
    for (var i = 0; i < jdata.length; i++) 
    { 
     options += '<option value="' + jdata[i].Description + '">' + jdata[i].Description + ' (' + jdata[i].ProcedureCode + ')' + '</option>'; 
    }; 
    $("select#cptIcdProcedureSelect").html(options); 
}; 
2

im ersten Codeblock, werden Sie nie die str Parameter. Willst du Folgendes sagen?

testFunc = function(str, callback) { 
    $.ajax({ 
     type: 'POST', 
     url: 'http://www.myurl.com', 
     data: str, 
     success: callback 
    }); 
} 
2

das ist, wie ich es tun

function run_ajax(obj) { 
    $.ajax({ 
     type:"POST", 
     url: prefix, 
     data: obj.pdata, 
     dataType: 'json', 
     error: function(data) { 
      //do error stuff 
     }, 
     success: function(data) { 

      if(obj.func){ 
       obj.func(data); 
      } 

     } 
    }); 
} 

alert_func(data){ 
    //do what you want with data 
} 

var obj= {}; 
obj.pdata = {sumbit:"somevalue"}; // post variable data 
obj.func = alert_func; 
run_ajax(obj); 
+0

Ich bin sicher, dass Sie Objekteigenschaften für einen einfachen Anwendungsfall nicht separat deklarieren, warum nicht ein Objektliteral verwenden? '{" pdata ": {" abschicken ":" somevalue "}," func ": alert_func}' Kann ich fragen, welchen Effekt (wenn überhaupt) dies auf GC in JS hat? – MrMesees

21

Sie dieses Schlüsselwort verwenden können benutzerdefinierte Daten zugreifen zu können, übergeben zu $ Schnipsel() Funktion:

$.ajax({ 
     // ... // --> put ajax configuration parameters here 
     yourCustomData: {param1: 'any value', time: '1h24'}, // put your custom key/value pair here 
     success: successHandler 
    }); 

    function successHandler(data, textStatus, jqXHR) { 
     alert(this.yourCustomData.param1); // shows "any value" 
     console.log(this.yourCustomData.time); 
    } 
+0

Dies ist ein netter, sauberer Weg, um neue Funktionen zu erstellen. Vielen Dank! – Acyra

Verwandte Themen