अजाक्स प्रतिक्रिया कॉलबैक पर json हो रही है

वोट
7

मैं (बस की बिल्ली के लिए) एक छोटे से ajax चैट प्रणाली बनाने के लिए कोशिश कर रहा हूँ और मैं ajax भाग का प्रबंध करने prototype.js उपयोग कर रहा हूँ।

एक बात मैं मदद में पढ़ा है कि यदि आप json डेटा वापस, कॉलबैक फ़ंक्शन दूसरा पैरामीटर में है कि json डेटा को भरने जाएगा।

कहा जाता हो जाता है कि मेरे php फ़ाइल में तो मेरे पास है:

header('Content-type: application/json');

if (($response = $acs_ajch_sql->postmsg($acs_ajch_msg,$acs_ajch_username,$acs_ajch_channel,$acs_ajch_ts_client)) === true)
    echo json_encode(array('lastid' => $acs_ajch_sql->msgid));
else
    echo json_encode(array('error' => $response));

ajax अनुरोध पर मेरे पास है:

onSuccess: function (response,json) {
                alert(response.responseText);
                alert(json);    
            }

लेकिन json मुझे अशक्त देता है: response.responseText की चेतावनी मुझे {8 lastid} देता है।

किसी को भी पता है कि मैं इस काम कर सकते हैं?

17/05/2009 को 21:17
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


4 जवाब

वोट
22

यह पुन: प्राप्त करने के लिए सही सिंटैक्स है प्रोटोटाइप के साथ JSON

onSuccess: function(response){
   var json = response.responseText.evalJSON();
}
17/05/2009 को 21:24
का स्रोत उपयोगकर्ता

वोट
1

तुम भी बस ढांचे को छोड़ सकता है। यहाँ ajax करने के लिए एक पार ब्राउज़र संगत भी तरह से, एक टिप्पणी विजेट में इस्तेमाल किया गया है:

// सर्वर से टिप्पणी को हासिल करेगा
CommentWidget.prototype.getComments = function () {
  वर commentURL = this.getCommentsURL + this.obj.type + '/' + this.obj.id; 
  this.asyncRequest ( 'प्राप्त', commentURL, नल);
}


// एक XHR अनुरोध शुरू की
CommentWidget.prototype.asyncRequest = समारोह (विधि, uri, फार्म) {
  वर ओ = createXhrObject ()
  अगर (ओ!) {वापसी अशक्त; }
  o.open (विधि, uri, सच);
  o.setRequestHeader ( 'एक्स-अनुरोधित-साथ', 'XMLHttpRequest');
  वर स्वयं = इस;
  o.onreadystatechange = function () {self.callback (ओ)};
  अगर (फार्म) { 
    o.setRequestHeader ( 'सामग्री-प्रकार', 'आवेदन / x-www फार्म-urlencoded; charset = UTF-8');
    o.send (makePostData (फार्म)); 
  } अन्य {
    o.send ( ''); 
  }  
}

// के बाद एक टिप्पणी पोस्ट किया जाता है, इस पृष्ठ पर टिप्पणी का पुनर्लेखन
CommentWidget.prototype.callback = समारोह (ओ) {                  
  अगर (o.readyState! = 4) {} वापसी
  // JavaScript ऑब्जेक्ट में JSON स्ट्रिंग बदल जाता है।
  वर response_obj = eval ( '(' + o.responseText + ')');
  this.comments = response_obj.comments;
  this.refresh ()
}

मैं इस कोड यहाँ के सहयोग से खुला http://www.trailbehind.com/comment_widget

17/05/2009 को 21:55
का स्रोत उपयोगकर्ता

वोट
2

इस प्रोटोटाइप अधिकारी से आता है:

एक जावास्क्रिप्ट प्रतिक्रिया कभी कभी आवेदन एक प्रतिक्रिया के रूप जावा स्क्रिप्ट कोड भेजने के लिए डिज़ाइन किया गया है का मूल्यांकन। प्रतिक्रिया की सामग्री प्रकार से मेल खाता है जावास्क्रिप्ट का MIME प्रकार तो यह सच है और प्रोटोटाइप जाएगा स्वचालित रूप से eval () कोड वापस लौटाया। आप स्पष्ट रूप से प्रतिक्रिया को संभालने के लिए अगर आप की जरूरत नहीं है की जरूरत नहीं है।

वैकल्पिक रूप से, अगर प्रतिक्रिया एक एक्स-JSON हैडर रखती है, इसकी सामग्री पार्स किया जाएगा, एक वस्तु के रूप में सहेजा और दूसरा तर्क के रूप में कॉलबैक करने के लिए भेजा:

नई Ajax.Request ( '/ SOME_URL', {विधि: 'प्राप्त', onSuccess: समारोह (परिवहन, json) {

  alert(json ? Object.inspect(json) : "no JSON object");

}   

});

इस कार्यक्षमता का उपयोग जब आप अजाक्स के साथ गैर तुच्छ डेटा लाने चाहते हैं, लेकिन एक्सएमएल प्रतिक्रियाओं को पार्स की भूमि के ऊपर से बचना चाहते हैं। JSON बहुत तेजी से (और हल्का) एक्सएमएल से है।

03/02/2011 को 14:21
का स्रोत उपयोगकर्ता

वोट
3

वहाँ प्रतिक्रिया की संपत्ति है: Response.responseJSON जो एक JSON वस्तुओं को केवल तभी बैकएंड रिटर्न सामग्री प्रकार से भर जाता है: आवेदन / json, यानी आप अपने बैकएंड कोड में कुछ इस तरह करते हैं:

$this->output->set_content_type('application/json');
$this->output->set_output(json_encode($answer));
//this is within a Codeigniter controller

इस मामले में Response.responseJSON = अपरिभाषित जो आप अपने onSuccess (टी) हैंडलर में प्राप्त अंत पर जांच कर सकते हैं,:

onSuccess:function(t) {
  if (t.responseJSON != undefined) 
  {
    // backend sent some JSON content (maybe with error messages?)
  }
  else 
  {
    // backend sent some text/html, let's say content for my target DIV
  }
}

मैं वास्तव में हैंडलर की दूसरा पैरामीटर के बारे में सवाल नहीं का उत्तर देते, लेकिन अगर यह मौजूद है, यकीन है कि प्रोटोटाइप के लिए केवल प्रतिक्रिया के समुचित सामग्री प्रकार के मामले में यह प्रदान करेगा।

10/06/2012 को 21:16
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more