2017-02-25 56 views
1
$(document).on('click', '[data-toggle="if-exist"]', function (e, options) { 
    options = options || {}; 

    if (options.fileExist) { 
     return true; 
    } 

    var target = e.currentTarget; 
    var fileId = $(this).data('file'); 
    e.preventDefault(); 

    $.ajax({ 
     url: Routing.generate('checkFile', {file: fileId }), 
     type: 'HEAD', 
     statusCode: { 
      404: function() { 
       alert('File does not exist'); 
      }, 
      200: function() { 
       $(target).trigger('click', { 'fileExist': true }); 
      } 
     } 
    }); 
}); 

當點擊按鈕的HEAD請求發送時,我已經得到了比click事件200響應再次被觸發,但這次fileExist選項不起作用。監聽器再次被調用(我檢查了這個)但沒有任何反應,就像e.preventDefault()仍然可以工作。有任何想法嗎?觸發事件()如預期

解決方案

觸發()方法會觸發jQuery的事件,但不會觸發默認行爲的瀏覽器,這在我的情況被重定向到另一個頁面。此代碼的工作:

$(document).on('click', '[data-toggle="if-exist"]', function (e) { 
    var target = this; 
    var fileId = $(this).data('file'); 
    e.preventDefault(); 

    $.ajax({ 
     url: Routing.generate('checkFile', { file: fileId }), 
     type: 'HEAD', 
     statusCode: { 
      404: function() { 
       alert('File does not exist'); 
      }, 
      200: function() { 
       var event = document.createEvent('MouseEvents'); 
       event.initEvent('click', false, false); 
       target.dispatchEvent(event); 
      } 
     } 
    }); 
}); 
+0

而不是重新觸發事件,爲什麼你不交換一個聲明的函數的匿名函數,然後只是重新調用它,可能通過preventDefault減輕問題? – Zze

+0

我不認爲我理解你在這裏的意思......在200響應後,我只想要點擊鏈接的默認行爲。我已經更新了片段,也許現在它會更易讀 - 如果使用fileExist選項觸發匿名函數,則不會執行任何操作。 – tommy

回答

0

使用e.stopImmediatePropagation();停止多次調用ajax。

+0

是的,但這不是我想要達到的。我沒有多個Ajax調用的問題;) – tommy