2014-08-30 68 views
1

我有幾種不同的形式,每種都會返回不同的東西。我需要檢測它是否是一個簡單的字符串(所以我可以把它放在錯誤/狀態區域),或者如果它的JavaScript我什麼也不做,讓它執行。如何檢查ajax響應是否爲javascript內容類型?

這是目前我如何做我的檢查,但我想確保這是100%堅固和可靠......我想不出任何其他方式。

另一種選擇是總是使用JSON,但後來我需要一個JSON墊片,以及嘗試將JavaScript序列化爲JSON。

$.ajax({ 
    type: 'POST', 
    url: form.attr('action'), 
    data: form.serialize() 
    }) 
    .done(function(data, textStatus, xhr) { 
    if (!xhr.getResponseHeader('Content-Type').match(/text\/javascript/i)) { 
     form.find('.status').text(data).removeClass().addClass('status status-done').slideDown(200); 
    } else { 
     // this is where i do nothing and let JS run 
    } 
    }) 

下工作,但恐怕會有它不是去上班了一些邊緣的情況下(不知道是什麼,可能是,但重要的是這部分工程100%)

+2

爲什麼你需要一個JSON墊片?您需要支持哪些古老的瀏覽器?我認爲你在這裏面臨XY問題...... – elclanrs 2014-08-30 23:32:50

+0

我建議你閱讀ajax dataType,因爲它似乎有一些不好的信息。 http://api.jquery.com/jquery.ajax/ – 2014-08-30 23:38:34

+0

那麼我應該如何區分JSON和application/javascript呢? – Tallboy 2014-08-30 23:53:35

回答

0

注,對需求細節不確定。如果正確解釋問題,在不同的form元素中,來自$.ajax()的不同響應類型請求? a)檢查響應類型string? b)什麼都不做?

能可能json響應中檢查響應類型string

if (typeof data.data === "string") { 
    // do stuff , with `string` 
} 

如果$.ajax()期待json響應,收到JS,可能會立即運行件。在下面,第一個響應是string,通過if.done()過濾。第二個響應json具有js函數表達式作爲屬性的對象,該對象似乎立即運行,位於$.ajax()successtextStatus。儘管如此,仍然能夠檢查typeobjectelse,作爲script運行。看空xhr.repsonseTextxhr.reponseJSONconsole

嘗試

var urls = [["/echo/json/","abc"] 
      , ["/echo/json/", 
       {"abc": 
       (function() { 
        setTimeout(function() { 
         $("body").append("<div id=data>" 
         + "object" + "</div>"); 
         $("#data") 
         .hide(0) 
         .fadeIn(1200)},1200) 
       }()) 
       }] 
      ]; 


    var request = function(url, _data) { 
    $.ajax({ 
     type: 'POST', 
     url: url, 
     data: {json : JSON.stringify({"data":_data})} 
     }) 
     .done(function(data, textStatus, xhr) { 
     if (typeof data.data === "string") { 
      $("body").append("<div>" + data.data + "</div>") 
     } else { 
      console.log(typeof data.data 
         , data 
         , xhr.responseText 
         , xhr.responseJSON); 
      // this is where i do nothing and let JS run 
     } 
     }) 
    }; 

    $.each(urls, function(k, v) { 
     request(v[0], v[1]) 
    }); 

的jsfiddle http://jsfiddle.net/guest271314/y9b7t740/

jQuery getScript() vs document.createElement('script')script.js

Calling a JavaScript function returned from an Ajax response

jQuery: Evaluate script in ajax response

What is JSONP all about?