अजाक्स सफलता की घटना काम नहीं कर रही है


194

मेरे पास एक पंजीकरण फॉर्म है और $.ajaxइसे जमा करने के लिए उपयोग कर रहा हूं ।

यह मेरा AJAX अनुरोध है:

$(document).ready(function() {
    $("form#regist").submit(function() {
        var str = $("#regist").serialize();
        $.ajax({
            type: 'POST',
            url: 'submit1.php',
            data: $("#regist").serialize(),
            dataType: 'json',
            success: function() {
                $("#loading").append("<h2>you are here</h2>");
            }        
        });
        return false;        
    });
});

मेरे submit1.php फ़ाइल में मैं डेटाबेस में फ़ील्ड ईमेल पते और उपयोगकर्ता नाम के अस्तित्व की जांच करता हूं । मैं एक त्रुटि संदेश प्रदर्शित करना चाहता हूं यदि वे मान बिना पृष्ठ ताज़ा किए मौजूद हैं ।

मैं इसे अपने AJAX अनुरोध के सफलता कॉलबैक में कैसे जोड़ सकता हूं ?


2
क्या आप सुनिश्चित हैं कि सफलता कॉलबैक का आह्वान है?
राहुल

आपको अपनी दूसरी समस्या के लिए एक नया प्रश्न पूछना होगा।
माइक ल्योन

जवाबों:


387

इसका परिणाम संभवतः JSON प्रारूप में नहीं है, इसलिए जब jQuery इसे इस तरह पार्स करने का प्रयास करता है, तो यह विफल हो जाता है। आप error:कॉलबैक फ़ंक्शन के साथ त्रुटि को पकड़ सकते हैं ।

आपको उस फ़ंक्शन में JSON की आवश्यकता नहीं लगती है, इसलिए आप dataType: 'json'पंक्ति को भी निकाल सकते हैं ।


14
मैंने डेटाटाइप को टेक्स्ट में बदल दिया और इसे काम कर रहा हूं। इस तरहdataType:'text'
Magesh

+1 भी मेरा, लेकिन कोड पर जो मेरा नहीं था, मैंने सर्वर से json डेटा लौटाकर हल किया
अल्बानैक्स

4
यदि dataType:निर्दिष्ट नहीं है, तो भी यह हो सकता है , लेकिन इसमें url:समाप्त होता है .json
davetapley

1
सर्वर से आने वाले वास्तविक $.postjsonsuccess
जोंस के

यदि आप json ajax अनुरोध करना चाहते हैं, तो सुनिश्चित करें कि यह माइम-प्रकार अनुप्रयोग / json पर सेट है। जिससे मुझे कुछ परेशानी हुई।
गेलवेइलर

19

यद्यपि समस्या पहले से ही हल है, मैं इसे इस उम्मीद में जोड़ता हूं कि यह दूसरों की मदद करेगा।

मैंने गलती को सीधे इस तरह से एक फ़ंक्शन का उपयोग करने की कोशिश की (सफलता: ऑनस्क्यू (उत्पाद))। लेकिन आपको पहले एक अनाम फ़ंक्शन पास करना होगा:

  function callWebService(cartObject) {

    $.ajax({
      type: "POST",
      url: "http://localhost/AspNetWebService.asmx/YourMethodName",
      data: cartObject,
      contentType: "application/x-www-form-urlencoded",
      dataType: "html",
      success: function () {
        OnSuccess(cartObject.productID)
      },
      error: function () {
        OnError(cartObject.productID)
      },
      complete: function () {
        // Handle the complete event
        alert("ajax completed " + cartObject.productID);
      }
    });  // end Ajax        
    return false;
  }

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


5
इसका अजाक्स से कोई लेना-देना नहीं है, न ही jquery, और न ही हैंडलर। हम बस एक टिप्पणी याद दिला सकते हैं कि "पूरे कोड को स्क्रिप्ट टैग में लपेटा जाए"। स्पष्टीकरण गलत है: आपको अनाम कार्यों में कुछ भी लपेटने की ज़रूरत नहीं है, एक नामित फ़ंक्शन करेगा, जब तक आप इसे कॉल करने के बजाय इसे पास करते हैं। इसके अलावा यह भ्रामक है: OnSuccess को अनुरोध भेजे जाने से पहले ही कॉल किया जाता है, इसलिए इसका कोई मतलब नहीं है कि इसे कुछ भी लौटाने वाले वेबसेवा से संबंधित नहीं है।
fdreger 14

इस उत्तर ने मेरी मदद की, लेकिन मैंने नहीं किया, आपको अपना उत्तर @fdreger टिप्पणी के अनुसार अपडेट करना चाहिए।
ओजैर काफरे

15

मैंने डेटा टाइप पंक्ति को हटाने की कोशिश की और यह मेरे लिए काम नहीं किया। मुझे कॉलबैक के रूप में "सफलता" के बजाय "पूर्ण" का उपयोग करके समस्या के आसपास मिला। सफलता कॉलबैक अभी भी IE में विफल रहता है, लेकिन चूंकि मेरी स्क्रिप्ट चलती है और वैसे भी पूरी होती है जिसकी मुझे परवाह है।

$.ajax({
    type: 'POST',
    url: 'somescript.php',
    data: someData,
    complete: function(jqXHR) {
       if(jqXHR.readyState === 4) {
          ... run some code ... 
       }   
    }        
 });

jQuery 1.5 में आप इसे इस तरह भी कर सकते हैं।

var ajax = $.ajax({
    type: 'POST',
    url: 'somescript.php',
    data: 'someData'
});
ajax.complete(function(jqXHR){
    if(jqXHR.readyState === 4) {
        ... run some code ... 
    }
});

9
बस इस पर ध्यान दें। completeअगर अजाक्स कॉल सफल रही या नहीं, जबकि successकेवल यह कहा जाता है कि क्या वेब सर्वर 200 OKHTTP हेडर (सब कुछ ठीक है) के साथ प्रतिक्रिया करता है, तो हमेशा कॉल किया जाएगा।
katalin_2003

10

सुनिश्चित करें कि आप अपनी PHP फ़ाइल में JSON तैयार किए गए डेटा को उत्पन्न करने से पहले किसी भी पाठ / डेटा को प्रिंट (इको या प्रिंट) नहीं कर रहे हैं। यह समझा सकता है कि आपको एक 200-200 का ओके मिल सकता है- लेकिन आपकी सक्सेज घटना अभी भी आपकी जावास्क्रिप्ट में विफल है। आप POST submit1.php के लिए फायरबग में अनुभाग "नेटवर्क - उत्तर" की जांच करके अपनी स्क्रिप्ट को प्राप्त कर सकते हैं।


इससे वास्तव में मुझे मदद मिली। मुझे पता है कि यह एक पुराना जवाब है, लेकिन यह पूरी तरह से समस्या है जो मैं कर रहा था। डिबगिंग के दौरान इको या प्रिंट_आर का उपयोग करना और यह पता लगाना कि वास्तव में बग का कारण बनता है ... :) धन्यवाद!
लेनिक्लब

6 साल बाद और अभी भी इस जवाब के साथ लोगों की मदद कर रहा है! मुझे नहीं पता था कि अन्यथा कहां देखना है।
तानिया रास्किया

5

यह सुनिश्चित करने के लिए alert()अपने successकॉलबैक में रखें कि यह बिल्कुल कहा जा रहा है।

यदि ऐसा नहीं है, तो यह केवल इसलिए है क्योंकि सर्वर हिट करने के लिए अनुरोध करने के बावजूद अनुरोध बिल्कुल भी सफल नहीं था। उचित कारण यह हो सकता है कि एक समय समाप्त हो, या आपके php कोड में कुछ अपवाद फेंकता है।

यदि आप पहले से ही नहीं है, तो फ़ायरफ़ॉक्स के लिए फ़ायरबग एडऑन स्थापित करें, और AJAX कॉलबैक का निरीक्षण करें। आप प्रतिक्रिया देख पाएंगे, और यह एक सफल (200 ओके) प्रतिक्रिया प्राप्त करता है या नहीं। आप कॉलबैक alert()में एक और भी डाल सकते हैं complete, जिसे निश्चित रूप से लागू किया जाना चाहिए।


आपके जवाब के लिए धन्यवाद। सफलता की घटना में सतर्क रहने की कोशिश की लेकिन यह काम नहीं किया। मेरे पास फ़ायरफ़ॉक्स के लिए फ़ायरबग एडऑन है और यह एक सफल (200 ओके) प्रतिक्रिया प्राप्त करता है, इसलिए इसमें कोई समस्या नहीं है .. मेरे पास किसी भी त्रुटि के लिए मेरी php फ़ाइल में एक डाई फ़ंक्शन है और जब मैं इसे फायरबग में जांचता हूं, तो यह उचित प्रतिक्रिया दिखाता है। आपको क्या मतलब है "आप पूरी कॉलबैक में एक और चेतावनी () भी डाल सकते हैं, जिसे निश्चित रूप से लागू किया जाना चाहिए।" ?? एक त्वरित उत्तर के लिए बहुत बहुत धन्यवाद
कोडिंगबक

2
यदि आप अपने में अलर्ट नहीं देखते हैं success, तो यह एक सफलता नहीं है। चूंकि प्रतिक्रिया 200 ओके है, इसलिए तातु का जवाब उचित लगता है, लेकिन आगे की समस्या निवारण के लिए, आप एक अन्य ईवेंट का उपयोग कर सकते हैं, जिसे completeहमेशा आमंत्रित किया जाता है, भले ही कोई अनुरोध सफल हो या नहीं ( successकेवल अनुरोध सफल होने पर ही होता है)। complete: function (xhr, status) { alert('complete: '+status); }
डेविड हेडलंड

3

मुझे भी यही समस्या थी। ऐसा इसलिए होता है क्योंकि डेटा लौटने में डेटा प्रकार की javascriptअपेक्षा होती है json। लेकिन अगर आप अपने php में इको या प्रिंट का उपयोग करते हैं तो यह स्थिति होती है। यदि आप डेटा वापस करने के लिए echoफ़ंक्शन का उपयोग करते हैं php, तो बस dataType : "json"बहुत अच्छी तरह से काम करना हटा दें ।


2

मैं वैध JSON लौटा रहा था, मेरे "पूर्ण" कॉलबैक में 200 की प्रतिक्रिया प्राप्त कर रहा था, और इसे क्रोम नेटवर्क कंसोल में देख सकता था ... लेकिन मैंने निर्दिष्ट नहीं किया था

dataType: "json"

एक बार मैंने किया, "स्वीकार किए गए उत्तर" के विपरीत, जिसने वास्तव में समस्या को ठीक किया।


1

मैं परिणाम को सर्वर से वेबपेज पर वापस लाने के लिए एक्सएमएल का उपयोग कर रहा हूं और मेरा भी यही व्यवहार रहा है।

मेरे मामले में कारण यह था, कि समापन टैग उद्घाटन टैग से मेल नहीं खाता था।

<?php
....
header("Content-Type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>
    <result>
        <status>$status</status>
        <OPENING_TAG>$message</CLOSING_TAG>
    </result>";
?>

1

मैजेंटो से उपयोगकर्ता पासवर्ड को पुनर्प्राप्त करने के लिए मुझे एक अजाक्स फ़ंक्शन का उपयोग करने में यह समस्या थी। सफलता की घटना को निकाल नहीं दिया गया था, तब मुझे महसूस हुआ कि दो त्रुटियां थीं:

  1. परिणाम JSON प्रारूप में वापस नहीं किया जा रहा था
  2. मैं एक सरणी को JSON प्रारूप में बदलने की कोशिश कर रहा था, लेकिन इस सरणी में गैर-utf अक्षर थे

इसलिए हर बार जब मैंने रिटर्निंग ऐरे को एन्कोड करने के लिए json_eoncde () का उपयोग करने की कोशिश की, तो फंक्शन काम नहीं कर रहा था, क्योंकि इसके एक इंडेक्स में नॉन यूटीएफ कैरेक्टर होते थे, उनमें से ज्यादातर ब्रेज़लियन पुर्तगाली शब्दों में उच्चारण थे।


1

मैंने कंट्रोलर से स्ट्रिंग वापस करने की कोशिश की, लेकिन एज़ैक्स की सफलता में त्रुटि ब्लॉक पर नियंत्रण क्यों नहीं

var sownum="aa";
$.ajax({
    type : "POST",
    contentType : 'application/json; charset=utf-8',
    dataType : "JSON",
    url : 'updateSowDetails.html?sownum=' + sownum,
    success : function() {
        alert("Wrong username");
    },
    error : function(request, status, error) {

        var val = request.responseText;
        alert("error"+val);
    }
});

1

नियंत्रक को क्वेरी करते समय मुझे उसी समस्या का सामना करना पड़ा, जो सफलता की प्रतिक्रिया नहीं देता है, जब सफलता संदेश समस्या को वापस करने के लिए मेरे नियंत्रक को संशोधित किया गया था। Lavalite ढांचे का उपयोग कर ध्यान दें। इससे पहले:

public function Activity($id)
    {
        $data=getData();
        return
            $this->response->title('title')
                ->layout('layout')
                ->data(compact('data'))
                ->view('view')
                ->output();
    }
after code looks like:
    try {
            $attributes = $request->all();
            //do something
            return $this->response->message('')
                ->code(204)
                ->status('success')
                ->url('url'. $data->id)
                ->redirect();
        } catch (Exception $e) {
            return $this->response->message($e->getMessage())
                ->code(400)
                ->status('error')
                ->url('nothing Wrong')
                ->redirect()
        }

यह मेरे लिए काम किया


1

मेरे पास एक ही समस्या थी जिसे मैंने इसे इस तरह हल किया: मेरा अजाक्स:

event.preventDefault();
$.ajax('file.php', {
method: 'POST',
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify({tab}), 
success: function(php_response){
            if (php_response == 'item') 
                {
                    console.log('it works');
                }
            }
        })

ठीक। समस्या केवल जुबान से नहीं बल्कि केवल php प्रतिक्रिया से है। पहले: मेरी php प्रतिक्रिया थी:

echo 'item';

अभी:

$variable = 'item';
 echo json.encode($variable);

अब मेरी सफलता काम कर रही है। पुनश्च। क्षमा करें अगर कुछ गलत है, लेकिन यह इस मंच पर मेरी पहली टिप्पणी है :)



0

इस तरह 'त्रुटि' कॉलबैक (जैसे 'सफलता') जोड़ें:

$.ajax({
   type: 'POST',
   url: 'submit1.php',
   data: $("#regist").serialize(),
   dataType: 'json',
   success: function() {
      $("#loading").append("<h2>you are here</h2>");
   },
   error: function(jqXhr, textStatus, errorMessage){
      console.log("Error: ", errorMessage);
   }
});

इसलिए, मेरे मामले में मैंने सांत्वना में देखा:

Error:  SyntaxError: Unexpected end of JSON input
  at parse (<anonymous>), ..., etc.

0

आपको सफलता और त्रुटि कॉलबैक दोनों की घोषणा करनी चाहिए। जोड़ा जा रहा है

error: function(err) {...} 

समस्या को ठीक करना चाहिए


-4

सफलता कॉलबैक दो तर्क लेता है:

success: function (data, textStatus) { }

यह भी सुनिश्चित करें कि submit1.phpउचित सामग्री प्रकार हेडर सेट करता है:application/json


आपके जवाब के लिए धन्यवाद। मैं इस बारे में jquery ajax documentaion पर पढ़ता हूं, लेकिन मैं यह पता नहीं लगा सकता कि इसे प्राप्त करने के लिए मेरा अगला कदम क्या होना चाहिए ... अगर आप मुझे सही दिशा की ओर संकेत कर सकते हैं तो सराहना करेंगे। इसका यह भी मतलब है कि मेरी php फाइल में कुछ विशिष्ट कोड होना चाहिए ?? बहुत बहुत धन्यवाद
कोडिंगबक

7
तथ्य यह है कि successदो तर्क लेता है सवाल के लिए पूरी तरह से अप्रासंगिक लगता है। आप किसी भी प्रकार के पैरामीटर्स को एक जावास्क्रिप्ट फंक्शन में पास कर सकते हैं, चाहे वह अपने घोषणापत्र में कितने भी स्वीकार कर ले, इसलिए यह निश्चित रूप से इन मुद्दों का कारण नहीं है, और चूंकि कोई भी मूल्य dataया textStatusसफलता कॉलबैक में उपयोग नहीं की जा रही है, ऐसा लगता है समारोह में उन्हें घोषित करने का कोई अच्छा कारण नहीं है।
डेविड हेडलंड

और JSON डेटा में सही सामग्री-प्रकार हेडर होना आवश्यक नहीं है, यह सिर्फ JSON प्रारूप में होना चाहिए।
तातु उलमन ने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.