2014-01-13 51 views
1

我正在編寫自己的小型庫,因爲jQuery並沒有爲我剪切它,而且老實說我寧願不要,因爲我寧願知道我的代碼到底發生了什麼!無論如何,我正在嘗試編寫一個ajax函數,它的寫法像這樣_$.ajax()但問題是我沒有得到我需要的功能,因爲它說CORS是無效的,但我知道它應該是當我使用$.get || $.post它工作正常...使用我自己的庫的Ajax功能

功能:

var ajax = { 
    url: null, 
    type: "GET", 
    cache: null, 
    data: null, 
    content: null, 
    state: 0, 
    xhr: null, 
    timeout:0, 
    responseType: "", 
    done:function(data){ 
    //not sure on here 
    }, 
    init: function() { 
     var ids = ['MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP']; 
     if (window.XMLHttpRequest) { 
     ajax.xhr = new XMLHttpRequest(); 
     } else { 
     for (var i = 0; i < ids.length; i++) { 
      try { 
       ajax.xhr = new ActiveXObject(ids[i]); 
       break; 
      } catch (e) { 
       throw e; 
      } 
     } 
    } 
    ajax.xhr.open(ajax.type, ajax.url, true); 
    ajax.xhr.setRequestHeader("Content-type", ajax.content !== null ? ajax.content : "application/x-www-form-urlencoded"); 
    if(ajax.cache !== null){ 
    ajax.xhr.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2005 00:00:00 GMT"); 
    } 
    ajax.process(); 
}, 
process: function() { 
    ajax.xhr.onreadystatechange = function() { 
     if (ajax.xhr.readyState == 4) { 
      if(ajax.xhr.status == 200){ 
      if(typeof ajax.done != 'undefined'){ 
       ajax.done(ajax.xhr.responseText); 
         //old way was ajax.completion = ajax.xhr.responseText 
         //then in the ajax.ajax it would return(ajax.completion); 
      }else{ 
      return false; 
      } 
      } 
     } 
    }; 
    if (ajax.type.toUpperCase() === 'GET') { 
     ajax.xhr.send(); 
     ajax.state = 1; 
    } else if (ajax.type.toUpperCase() === 'POST') { 
     ajax.xhr.send(data); 
     ajax.state = 1; 
     } 
     return (ajax.response); 
}, 
ajax: function (opts) { 
    ajax.url = opts.url, 
    ajax.type = opts.type !== undefined ? opts.type : ajax.type, 
    ajax.cache = opts.cache, 
    ajax.content = opts.content, 
    ajax.data = opts.data; 
    ajax.responseType = opts.responseType ? opts.responseType : ajax.responseType; 
    ajax.timeout = opts.timeout ? opts.timeout : ajax.timeout; 
    opts.done(ajax.done); 
    ajax.init(); 
     } 
    }; 

編輯 我已經更新了我的代碼,以user3165879答案提供的功能。我得到了xhr.response文本,但由於某種原因,每當我嘗試使用alert``consolereturn時,它只是說未定義。

我希望能夠給我寫的代碼像這樣:

var content; 
_$.ajax({ 
    type:"GET", 
    url:"whatever.url.com", 
    done:function(data){ 
    content+= data; 
    } 
}); 

正如你可以看到我沒有一個真正的done我的代碼裏面,因爲我還不能肯定從哪裏開始,從來沒有真正完全瞭解ajax的過程。找不到任何明確的文檔。

+1

你是什麼意思與CORS錯誤?確切的錯誤信息總是更有幫助。是否像'否'Access-Control-Allow-Origin'標題出現在請求的資源上。原因'http://example.tld'因此不被允許訪問。 ' –

+0

是的,我很抱歉沒有指定。 – EasyBB

回答

1

我認爲你應該呼籲的readyState = 4和狀態進行選擇= 200

xhr.onreadystatechange = function() { 
if(xhr.readyState== 4){ 
    if(xhr.status==200){ 
    if(typeof opts.done != 'undefined'){ 
     opts.done(xhr.responseText); 
    } 
    } else { 
    return false; 
    } 
    } 

};

希望它有幫助

+0

正如你所看到的,我用更新的代碼更新了我的問題,因爲我改變了很多。我現在有三個不同的函數'ajax.ajax',這是我們將用作'_ $。ajax'和'ajax.init'以及'ajax.process'我添加了代碼,你只是沒有返回任何東西確定如何進一步進行。 – EasyBB