2014-11-17 42 views
-1

當我在第二個函數validateNumber()上調用頁面時,我得到一個「typeError:String不是函數」消息任何人都可以向我解釋爲什麼這個消息發生?我的代碼如下:JavaScript字符串不是函數

< script type = "text/javascript" > 
 
    /* <![CDATA[ */ 
 
    function validateLetter(dataEntry) { 
 
    try { 
 
     var textInput = dataEntry.value; 
 
     var replacedInput = textInput.replace(/[^A-Za-z]/g); 
 
     if (textInput != replacedInput) 
 
     throw "You can only enter letters into this field."; 
 

 
     dataEntry.value = replacedInput; 
 
    } catch (textInputError) { 
 
     window.alert(textInputError) 
 
     return false; 
 
    } 
 
    return true; 
 
    } 
 

 
function validateNumber(dataEntry) { 
 
    try { 
 
    var textInput = dataEntry.value; 
 
    var replacedInput = textInput(/[^0-9]/g); 
 
    if (textInput != replacedInput) 
 
     throw "You can only enter numbers into this field."; 
 
    } catch (numberInputError) { 
 
    window.alert(numberInputError) 
 
    return false; 
 
    } 
 
    return true; 
 
} 
 

 
function validateInput(dataEntry) { 
 
    if (navigator.appName == "Microsoft INternet Explorer") 
 
     var enteredKey = dataEntry.keyCode; 
 
    else if (navigator.appName == "Netscape") 
 
     var eneteredKey = dataEntry.charCode; 
 
    } 
 
    /* ]] */ 
 
    < /script>
<form action="validateTheCharacters" enctype="application/x-www-form-urlencoded" name="dataEntry"> 
 
    <p>Enter your mother's maiden name: 
 
    <input type="text" id="letter1" name="letter1" onkeypress="validateLetter(this)"> 
 
    </p> 
 
    <p>Enter the city you were born in: 
 
    <input type="text" id="letter2" name="letter2" onkeypress="validateLetter(this)"> 
 
    </p> 
 
    <p>Enter the street you grew up on: 
 
    <input type="text" id="letter3" name="letter3" onkeypress="validateLetter(this)"> 
 
    </p> 
 

 
    <p>Enter your phone number: 
 
    <input type="text" id="number1" name="number1" onkeypress="validateNumber(this)"> 
 
    </p> 
 
    <p>Enter the year you were born: 
 
    <input type="text" id="number2" name="number2" onkeypress="validateNumber(this)"> 
 
    </p> 
 
    <p>Enter the number of siblings you have: 
 
    <input type="text" id="number3" name="number3" onkeypress="validateNumber(this)"> 
 
    </p> 
 

 
    <p> 
 
    <button type="reset" value="Reset Form">Reset Form</button> 
 
    </p> 
 
</form>

+0

這是* try..catch *的不恰當用法。如果你想看看這個值是否全是數字,那麼:如果* string *只包含數字,'/^\ d + $ /。test(string)'將返回true。 – RobG

回答

2

我幾乎可以肯定這就是問題所在:

var textInput = dataEntry.value; 
var replacedInput = textInput(/[^0-9]/g); 

如果textInput是一個字符串,你不能傳遞參數給它,彷彿它是一個函數,而不是:

var replacedInput = textInput.replace(/[^0-9]/g, ""); // dependening in what you are trying to achieve of course 
+0

感謝您在我回顧代碼之後指出了這一點,並且我意識到.replace被用在前一個函數中,這就是爲什麼第一個工作,第二個沒有。 – Zack

2
var replacedInput = textInput(/[^0-9]/g); 

這不是你如何搜索和Javascript中更換。

這不是很清楚你打算什麼在這裏,但如果你想從字符串中刪除非數字字符,你會怎麼做,使用String.replace()

var replacedInput = textInput.replace(/[^0-9]/g, ""); 

話雖這麼說,實現更簡單的方法這一檢查將是完全跳過替換,只是使用String.match()代替:

var textInput = dataEntry.value; 
if (textInput.match(/[^0-9]/)) 
    throw "You can only enter letters into this field."; 
dataEntry.value = textInput; 
1

你可能會考慮隔離功能,這樣的功能,如validateLetter簡單地驗證字符串他們傳遞的信件只包含字母,然後讓調用者函數計算出如果返回值爲true或不真實時該怎麼做。

在這種情況下,你最終很簡單的功能:

function validateLetters(s) { 
    return /^[a-z]+$/i.test(s); 
} 

function validateNumbers(s) { 
    return /^\d+$/.test(s); 
} 

要驗證輸入,你可以添加一個類地說應該有什麼類型的驗證,如

<input name="letter3" class="letter" onkeypress="validateLetter(this)"> 

然後validateInput功能,可確定要調用基於種類,其驗證功能:

function validateInput(element) { 

    var value = element.value; 

    // If has class letter, validate is only letters 
    if (/(\s|^)letter(\s|$)/i.test(element.className)) { 

    // validate only if there is a value other than empty string 
    if (!validateLetters(value) && value != '') { 
     alert('Please enter only letters'); 
    } 
    } 

    // If has class number, validate is only numbers 
    if (/(\s|^)number(\s|$)/i.test(element.className)) { 

    // validate only if there is a value other than empty string 
    if (!validateNumbers(element.value) && value != '') { 
     alert('Please enter only numbers'); 
    } 
    } 
} 

注意,按鍵不進行驗證使用的數據可以不輸入一個好的活動按任意鍵(例如從上下文菜單粘貼或拖放)。另外,監聽器看不到按鍵產生的值,它會看到以前的值。

您確實只需要在提交表單時執行驗證。在那之前,你爲什麼關心這些價值是什麼?允許用戶犯錯並自己修復而不會被警報所煩擾(屏幕提示非常有用)。花一些時間用你的表格來增強他們的可用性(我知道這可能不是一種製作形式,但是名字可以具有除字母a到z以外的字符,例如von BraunO'Reilly)。

最後,表單控件很少需要一個ID,如果需要,名稱通常足以標識它們(並且它們必須有一個名稱才能成功,因此大多數名稱已經有了)。來自OP的一點點HTML:

<form> 
    <p>Enter your mother's maiden name: 
    <input name="letter1" class="letter" onkeypress="validateInput(this)"> 
    </p> 
    <p>Enter the number of siblings you have: 
    <input name="number3" class="number" onkeypress="validateInput(this)"> 
    </p> 
    <p> 
    <input type="reset"> 
    </p> 
</form>