2015-06-04 136 views
0

我試圖通過ajax函數的參數傳遞4個變量,但由於某種原因它不接受它。我試圖傳遞的變量是url,action,id和以毫秒爲單位的超時。如果有人知道我做錯了什麼,請糾正我。謝謝。通過參數傳遞變量到AJAX函數PHP

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> 

<script type = "text/javascript"> 

function myAjax(url,action,id,timeout) { 
     $.ajax({ 
      type: "POST", 
      url: url, 
      data:{action: action}, 
      error: function(xhr,status,error){alert(error);}, 
      success:function(data) { 
      document.getElementById(id).innerHTML = data; 
      setTimeout(myAjax, timeout); 
      } 

     }); 

} 

</script> 

<body onload="myAjax('testing.php','call_this','my_div',2000)"> 

<div id="my_div"></div> 

</body> 

下面的代碼的工作版本,而無需通過參數傳遞變量,而不是他們本身的功能裏:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> 

<script type = "text/javascript"> 

function myAjax() { 
     $.ajax({ 
      type: "POST", 
      url: 'testing.php', 
      data:{action: 'call_this'}, 
      error: function(xhr,status,error){alert(error);}, 
      success:function(data) { 
      document.getElementById('my_div').innerHTML = data; 
      setTimeout(myAjax, 2000); 
      } 

     }); 

} 

</script> 

<body onload="myAjax()"> 

<div id="my_div"></div> 

</body> 
+0

@ jfriend00是的。它確實叫了。但只有一次。然後停止。期。即使超時只有2秒鐘。我等了幾分鐘。它沒有動。 – iscattered

+0

什麼是後續調用傳遞的參數值?你在ajax調用之前在函數中做了一個'console.log(url)'來查看第二個調用是否將任何值傳遞給該函數? – PeterKA

+2

我會重新寫這樣的setTimeout函數:'setTimeout(function(){myAjax(url,action,id,timeout);},timeout);' – PeterKA

回答

3

重新寫setTimeout()調用就像這樣:

setTimeout(function() { 
    myAjax(url,action,id,timeout); 
}, timeout); 
+0

好的。還有一個問題?如果我的服務器只有100GB的帶寬,我應該如何設置超時時間?我不希望超載我的服務器並使其崩潰,因爲它在過去發生過很多次,當時我不知道如何正確使用超時。 – iscattered

+0

也許一個策略,如果有的話,只有在服務器數據發生變化時纔會使Ajax調用更好。 – PeterKA

+0

但是,ajax如何知道服務器數據已經改變,除非他們先檢查它?我想知道這種策略是否存在。如果是這樣,我很想知道。我想很多人都想知道。 – iscattered

1

第二次調用它時(來自您的success處理程序),您沒有將任何參數傳遞給myAjax(),所以它不會有hav e第二次調用任何參數。

有幾種方法可以解決這個問題。其中它的方式,當你從內調用myAjax(...)把剛纔複製的參數:

function myAjax(url,action,id,timeout) { 
     $.ajax({ 
      type: "POST", 
      url: url, 
      data:{action: action}, 
      error: function(xhr,status,error){alert(error);}, 
      success:function(data) { 
      document.getElementById(id).innerHTML = data; 
      setTimeout(function() { 
       myAjax(url, action, id, timeout); 
      }, timeout); 
      } 
     }); 
} 

但是,你也可以做一個內部函數,然後剛纔提到的論點從封閉這樣的:

function myAjax(url,action,id,timeout) { 
     function run() { 
      $.ajax({ 
       type: "POST", 
       url: url, 
       data:{action: action}, 
       error: function(xhr,status,error){alert(error);}, 
       success:function(data) { 
       document.getElementById(id).innerHTML = data; 
       setTimeout(run, timeout); 
       } 
      }); 
     } 
     // run the ajax function the first time 
     run(); 
} 
+0

@iscattered - 查看這裏的第二個選項,它使用內部函數和閉包來保持對參數的訪問,而不必重複它們。 – jfriend00

+0

我有問題嗎?當我將參數名稱'action'更改爲任何其他文本時,由於某種原因它只執行一次函數。你有什麼想法,爲什麼?謝謝。 – iscattered

+0

@iscattered - 你必須準確地告訴我新代碼看起來沒有用。我無法從你的描述中知道。 – jfriend00