2015-11-04 43 views
0

我試圖防止點擊時使用默認值,用ajax調用頁面並使用this answer觸發點擊完成。ajax調用後的jQuery rebind點擊事件

<a id="mylink" href="file.csv" download >Dowload</a> 

<script> 
var flag = false; 
$('#mylink').on('click',function(e) { 
// Result is the same with : 
//$(document).on("click","#mylink",function(e){ 

    if (flag === true) { 
     flag = false; 
     return; 
    } 
    e.preventDefault(); 

    $.ajax({ 
     url: "index.php?controller=admin&action=refreshFile", 
     complete: function() { 
     console.log('control'); // This is called 
     flag = true; 
     $('#mylink').trigger('click'); // This is not called 
     } 
    }); 
}); 
</script> 

該調用有效,但鏈接未被觸發。當ajax調用被設置在一個單獨的函數中時,結果是一樣的。

+0

而不是'preventDefault',使用你想成功執行的回調函數。 – Rajesh

+2

如果你不想讓用戶下載'文件。csv'沒有你的ajax函數被首先調用,你需要**不** **那裏的鏈接,句號,直到/除非你決定讓他們下載它。用戶可以使用該鏈接執行各種操作,而不會觸發您的ajax調用。您還需要實現下載塊**服務器端**。 –

+2

我甚至不明白你爲什麼想要這樣做。一旦文件被下載,你爲什麼要連續不斷地下載它?如果有更新的檢查我可以理解,但是這我沒有得到... –

回答

1

使用window.location調用鏈接的href

$('#mylink').on('click',function(e) { 
    e.preventDefault(); 

    $.ajax({ 
     url: "index.php?controller=admin&action=refreshFile", 
     complete: function() { 
      console.log('control'); // This is called 
      window.location = $('#mylink').attr("href"); 
     } 
    }); 
}); 

one事件偵聽器

var eventListener = function(e) { 
     e.preventDefault(); 

     $.ajax({ 
      url: "index.php?controller=admin&action=refreshFile", 
      complete: function() { 
       console.log('control'); // This is called 
       $('#mylink')[0].click(); 
       $('#mylink').one('click', eventListener); 
      } 
     }); 
    }; 
$('#mylink').one('click', eventListener); 

我不知道你的標誌應該這樣做。在您的示例中,這意味着該鏈接僅在每次第二次點擊時纔有效。

P.s.使用完成回調意味着它即使在ajax失敗時也可以工作。您可能需要將其更改爲成功

更新

@Racil Hilan有一個觀點:這個解決方案是有點矯枉過正時,你可以只直接調用鏈接和refreshFile動作被稱爲後返回正確的文件。

+0

感謝第一個解決方案完美的作品。至於國旗,請參閱問題中的關聯答案。 – kursus

+0

我明白了。您希望停止Ajax每次點擊多次觸發。 – Stevanicus

0

嘗試

var flag = false; 
$('#mylink').on('click',function(e) { 
// Result is the same with : 
//$(document).on("click","#mylink",function(e){ 

    if (flag === true) { 

     flag = false; 
     windows.location="file.csv"; 
    } 
    e.preventDefault(); 

    $.ajax({ 
     url: "index.php?controller=admin&action=fileDownload", 
     complete: function() { 
     console.log('control'); // This is called 
     flag = true; 
     $('#mylink').trigger('click'); // This is not called 
     } 
    }); 
}); 
0

在我的愚見,這不是正確的設計。觸發下載之前,您的Ajax正在調用服務器上的index.php。如果index.php在允許用戶下載文件之前必須完成一些安全性或關鍵性工作,那麼這種設計是絕對不安全的。您甚至不需要成爲黑客,只需複製鏈接file.csv並將其粘貼到瀏覽器的地址欄中,即可獲得沒有Ajax的文件。

您需要將file.csv文件放到您的網站文件夾之外(或者它可能是由服務器代碼實時生成的,所以'好'),然後PHP頁面必須運行所有檢查,如果全部運行OK,它讀取文件(或生成它)並將下載返回給瀏覽器(如果檢查失敗,則返回錯誤消息)。這是如何保護服務器上的文件下載。

做完所有這些之後,無論您是從鏈接直接調用PHP,還是鏈接調用Ajax函數,然後調用PHP頁面並解析下載(這是更多一點複雜,但可行)。這兩種方法唯一的區別在於當下載(或錯誤消息)從服務器返回時是否希望刷新頁面。

如果您想採納此建議,請更改您的問題並選擇您想要的方式(即直接鏈接或通過Ajax),以便我們可以爲您提供幫助。