2016-03-30 25 views
1

我想在我的函數之前聲明一個或多個變量,但是當我執行該函數時失敗。我明白,在函數內聲明的變量是局部變量,只能在函數的作用域中起作用。爲什麼我的變量不能在我的函數之外/之前作爲「全局」變量工作?JavaScript函數不適用於函數之前聲明的變量

<script type="text/javascript"> 
    var visitors = document.getElementById('tb254597').value; 
    function limitVisitors() { 
     if (visitors > 60) { 
      alert("We can only accommodate 60 people on a group visit. You entered " + visitors + " visitors."); 
     } 
    } 
</script> 
+2

發生什麼錯誤? –

+3

你有這個ID的元素?它有價值嗎?你在控制檯遇到什麼錯誤? – ochi

+2

您需要在'body'結束之前放置該腳本,並且確保您有該元素的一個元素 –

回答

0

您在頁面加載後立即抓取tb254597的值。這將是一個空字符串('')。您需要每次獲取的值要檢查它。

想想你寫下朋友的地址。你在寫下它的時候已經得到了他們的地址。但是如果他們移動會發生什麼?如果你去舊地址,你不會找到你的朋友。總是檢查你有你的朋友的最新地址。

4
  1. 將變量聲明和initalization移動到函數中,因爲您在開始時獲取初始值而不是實際值。

    如果您需要的變量不在函數之外,最好將它保存在函數中。

  2. 將值更改爲parseInt(),因爲您從輸入中獲取字符串。

  3. 調用函數limitVisitors()某處,可能在提交。


function limitVisitors() { 
    var visitors = parseInt(document.getElementById('tb254597').value, 10); 
    if (visitors > 60) { 
     alert("We can only accommodate 60 people on a group visit. You entered " + visitors + " visitors."); 
    } 
} 

limitVisitors(); 
+1

謝謝@Nina Scholz。我是一個完全新手,我感謝你的幫助。我將使用'parseInt()' - 甚至沒有想到這一點。關於你的第三點,我在調用'' – jimw

+0

事實上,'parseInt()'部分並不是真的必要,因爲JavaScript的工作方式,[字符串和非字符串值之間的關係比較會先轉換爲數字](http:// www.ecma-international.org/ecma-262/6.0/#sec-abstract-relational-comparison)。如果該字符串恰好強制爲'NaN',[該操作將導致'false'](http://www.ecma-international.org/ecma-262/6.0/#sec-relational-operators-runtime-semantics - 評價)。無論如何,更有用的方法是限制用戶輸入或通知用戶錯誤的輸入。 – rhino

+0

@rhino,爲了「限制用戶輸入」,你會建議在輸入元素上設置一個max屬性,並將type屬性改爲「number?」。 – jimw

0

這取決於你如何調用該函數。無論採用哪種方式,您都必須將該變量傳遞給函數,以便函數知道您的值。

有點類似於此:

<script type="text/javascript"> 
    // this parameter can be named whatever 
    function limitVisitors(param1) { 
    if (param1 > 60) { 
     alert("We can only accommodate 60 people on a group visit. You entered " + param1 + " visitors."); 
    } 
    } 

    // Just make sure that this value gets passed to the function like this 
    var visitors = document.getElementById('tb254597').value; 
    limitVisitors(visitors); 
</script> 

而且你可能要考慮jQuery的,這樣就可以使用$(document).ready()功能,以當DOM實際負荷運行。如果你打算允許用戶輸入,你可能想要一個事件綁定就像點擊按鈕。

編輯: 由於您在HTML元素中使用onchange,這應該是你所需要的。請注意,在函數調用的變化:

<input type="text" name="Field_Number_of_visitors" size="20" id="tb254597" onchange="limitVisitors(this.value);" /> 

<script type="text/javascript"> 
    // this parameter can be named whatever 
    function limitVisitors(param1) { 
    if (param1 > 60) { 
     alert("We can only accommodate 60 people on a group visit. You entered " + param1 + " visitors."); 
    } 
    } 
</script> 
+0

謝謝,@ Minnow990。不知道爲什麼函數調用中的參數需要添加'.value'。 – jimw

+0

@jimw通常情況下,對'this'的調用只會選擇元素本身,而不是它的任何屬性。既然你只想把它的值調用到函數中的參數中,你可以用'this.value'運行它。就像我說的,我強烈推薦jQuery,因爲它有非常有用的快捷功能。 – Minnow990

0

我認爲你應該這樣做:

 function limitVisitors() { 
      var visitors = parseInt(document.getElementById('tb254597').value); 
      if (visitors > 60) { 
       alert("We can only accommodate 60 people on a group visit. You entered " + visitors + " visitors."); 
      } 
     } 

每次通話時間limitVisitors您將得到的價值和比較。