2010-05-04 100 views
0

我遇到了一個基於Webkit的瀏覽器(包括Safari和Chrome - 我正在Mac上測試)的奇怪問題,我不確定是什麼導致它。下面是我創建了一個小腳本複製問題:jQuery AJAX調用不在Webkit中工作

<html> 
<head> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
<script type="text/javascript" language="javascript"> 
function doRequest() { 
    document.test.submit(); 
    $.ajax({ 
    type: "GET", 
    cache: false, 
    url: 'ajax.php?tmp=1', 
    success: doSuccess 
    }); 
} 
function doSuccess(t_data,t_status,req) { 
    alert('Data is: '+ t_data +', XMLHTTPRequest status is: '+ req.status); 
} 
</script> 
</head> 

<body> 
<form name="test" method="post" action="ajax.html" enctype="multipart/form-data"> 
<input type="file" name="file_1"> 
<br><input type="button" value="upload" onclick="doRequest();"> 
</form> 
</body> 
</html> 

ajax.php是:

<?php 
echo $_REQUEST['tmp']; 
?> 

這個工作過程是在Firefox,但XMLHttpRequest對象的狀態始終是「0」都Safari和Chrome。如果我刪除此行:

document.test.submit(); 

然後它的工作,但當然表單沒有提交。我嘗試將表單提交按鈕從「按鈕」更改爲「提交」,但這也阻止了它在Safari或Chrome上的工作。

我試圖做到的是:

  • 提交表單
  • 調用另一個腳本,以獲取有關文件的狀態通過形式(它是一個小上傳進度表)被上傳。

任何幫助真的很感謝 - 我希望這只是一個我不熟悉的怪癖。

謝謝!

  • 布賴恩

回答

0

簡單地說:你不能上傳文件使用AJAX。

有很好的插件,如jquery form,將自動處理(通過創建一個隱藏的iframe和執行真正的文件上傳)。

我認爲FireFox有一個native file upload API但如果你想要一個跨瀏覽器的解決方案,你將需要看看一些插件。使用flash upload是另一種解決方案。

+0

我沒有通過AJAX上傳文件 - 文件上傳正在HTML表單中處理 - AJAX調用是一個單獨的PHP腳本調用,它將監視上傳。我已經簡化了上面的例子來說明這個問題 - 在'真實世界'中這個表單提交給perl CGI腳本,並且AJAX調用發送給PHP腳本,而PHP腳本隨着監視perl腳本處理文件上傳。 謝謝! - Brian – Brian 2010-05-04 17:29:31

+0

提交表單後,瀏覽器將重定向到ajax.html,並且腳本可能會停止執行,因此在提交表單後嘗試執行ajax調用將毫無用處。 – 2010-05-04 17:32:48

+0

文件上傳後會發生重定向 - 這是正確的,但是當表單被提交(並且因此文件被上傳)時,它不會被重定向。例如,上傳一個100MB文件可能需要幾分鐘時間 - 那時候我想通過AJAX查詢一個PHP腳本並獲取進度。這適用於Firefox和IE,所以我想知道爲什麼AJAX調用僅在基於Webkit的瀏覽器中失敗。據我所知,document.form.submit沒有被阻塞,因爲如果你上傳一個足夠大的文件需要10秒左右的時間來提交,你會看到AJAX調用是立即的。 – Brian 2010-05-04 17:40:19

0

我在開發類似上傳檢查工具1時的經驗是,您應該同時使用success: ..complete: ..。他們可能會在代碼中執行完全相同的操作,並且可以讓他們調用相同的函數。 complete:在請求結束時被調用,success:在請求成功時被調用。因此可能是:

function doRequest() { 
    document.test.submit(); 
    $.ajax({ 
    type: "GET", 
    cache: false, 
    url: 'ajax.php?tmp=1', 
    complete: doSuccess, 
    success: doSuccess 
    }); 
}