2015-01-06 47 views
0

我在這個問題上讀過的所有帖子都是因爲傳遞的對象包含其他對象而不是原始值。jQuery ajax未捕獲TypeError:非法調用

我的數據對象是所有原始值,但它仍然不起作用。

下面的代碼:

function ImageUploader(imgEl, params) { 
    this.imgEl = imgEl; 
    this.params = params; 
    this.params["Function"] = "saveImage"; 
} 

// send data from asynchronously uploaded image (as image URI) 
// to PHP script which will write data to file 
ImageUploader.prototype.uploadImage = function() { 
    var iu = this; 
    var fileReader = new FileReader(); 

    fileReader.onload = function (e) { 
     iu.params["Image"] = e.target.result; 
     console.log(iu.params); 
     $.ajax({ 
      type: "POST", 
      url: "/scripts/php/Form.php", 
      data: iu.params, 
      success: alert, 
      error: function (jqXHR, status, error) { 
       console.log(error, this); 
      } 
     }); 
    }; 

    this.params["FileName"] = this.imgEl.files[0].fileName || this.imgEl.files[0].name; 
    fileReader.readAsDataURL(this.imgEl.files[0]); 
}; 

下面是一個例子對象,它拒絕:

{ 
    FileName: "Matrix.jpg", 
    Function: "saveImage", 
    ID: 10, 
    Image: "data:image/jpeg;base64,...", 
    Line: 1, 
    Name: "Test Form" 
} 
+1

你的問題可能是'成功:警報'行。你爲什麼這樣做?嘗試做成功:功能(數據){警報(數據); }' –

+0

@RocketHazmat你是對的,但那有點奇怪,因爲它以前很好。它們應該是等價的。無論如何,謝謝。 – KthProg

+1

@KthProg:主機提供的功能不一定是真正的功能,跨瀏覽器。一般最好把它們包起來。 –

回答

3

此錯誤無關,與你的iu.params對象。該錯誤是與此行:

success: alert, 

window.alert()(或只是alert())功能需要在所述window對象的「上下文」被調用。

當你做success: alert時,jQuery在運行AJAX請求的jqXHR對象的節點中調用成功回調。事情是這樣的:

success.call(jqXHR, data) 

我不知道確切的代碼 jQuery使用

所以,你alert被稱爲在錯誤的「語境」,所以它拋出一個錯誤。爲了解決這個問題,只是傳遞一個匿名函數來success

success: function(data){ 
    alert(data); 
} 

或者,如果你真的想,你可以使用.bind()確保alert()被稱爲在正確的上下文:

success: alert.bind(window) 

如果你真的真的想保持success: alert,那麼你可以告訴jQuery調用它在正確的上下文中,通過添加context: window到您的$.ajax電話。

被警告alert.bind()(和,反過來context: window)可能無法在所有的瀏覽器,因此是不建議。我建議你使用如圖所示的匿名函數。

+0

*「或者,如果你真的想,你可以使用'。bind()'確保在正確的上下文中調用alert()'*這不一定能正常工作跨瀏覽器:主機提供的函數不需要支持'bind'(或'call',''應用程序和其他'Function.prototype'東西) –

+0

@TJCrowder:真的嗎?我知道宿主對象很奇怪,但我認爲它是可行的,我的意思是,* correct *解決方案是將它包裝進一個匿名函數,但我試圖添加替代方法:-) –

+0

$ Rocket:是的,真的。例如,'alert.call(window,「foo」);'在IE8中失敗,因爲'alert'沒有'call'或'apply'(如果你填充了'Function.prototype.bind',alert'仍然不會有它,因爲它不是一個真正的函數,並且不會從'Function.prototype'繼承。) –

相關問題