2013-07-15 22 views
0

我只是想完全理解一個錯誤,因爲有時我可以繞過它,而其他時候我不能。我試過只寫一個函數:JavaScript'function undefined'error with jsfiddle

function toggleButton() { 
} 

但是我得到了同樣的錯誤。這是.js樣本。

var checkBox = document.getElementById("chkMyBox"); 

checkBox.onclick = function toggleButton(e, obj1) 
{  
var btnElement = document.getElementById("btnMyButton"); 
    if(btnElement != null) { 
     alert("Element not null"); 
    if(e.target.checked && obj1 != null) { 
     alert("Checking check " + obj1.checked); 
     if(obj1.checked == true && btnElement.getAttribute('disabled') == false){ 
      btnElement.getAttribute('disabled') = false; 
     } else { 
       btnElement.getAttribute('disabled') = true; 
     } 
    } 
    } 
} 

這裏的HTML:

<form id="frmCheckBox"> 
    <input type="checkbox" id="chkMyBox" />  
    <button id="btnMyButton" disabled>I'm a Button</button> 
</form> 

http://jsfiddle.net/Arandolph0/h8Re6/3/

+3

首先,您的HTML錯誤。您嘗試按ID引用複選框,但您從未給它一個ID。 –

+1

您沒有通過ID獲取元素。你試圖通過它的名字來獲取元素。 –

+0

有些人發帖後請不要更正代碼,這使得很難跟蹤。 – David

回答

5

改變這一行,它使用name

<input type="checkbox" name="chkMyBox" />  

到使用id代替:

<input type="checkbox" id="chkMyBox" />  

另外,您可以使用:

var elements = document.getElementsByName('chkMyBox'); 
var element = elements[0]; //first element with that name in the array 

var element = document.getElementsByName('chkMyBox')[0]; 

更新(如OP從原來的問題改變了代碼)

function toggleButton(e, obj1) 

此次榮獲」因爲CallBac只有一個參數k功能(e)。 使用e.target來獲取元素。

+0

他應該保留它的名字。刪除名稱可能會導致意外的結果。 –

1

您試圖通過名稱獲取元素。你必須這樣做:

var checkBox = document.getElementsByName('chkMyBox')[0]; 

或者,如果你更喜歡id。只需將id="chkMyBox"添加到您的複選框輸入。

+0

Got it!謝謝。 –

1

這裏有幾個問題。

1)您嘗試使用getElementById獲取按鈕,但您的元素沒有ID。最簡單的解決方法是修復你的標記。

<input type="checkbox" name="chkMyBox" id="chkMyBox" />

2)你的事件處理程序需要兩個參數。當通過DOM附加處理程序時,只有事件傳遞給您的處理程序。因此obj1將始終爲undefined。您需要從e參數中獲取複選框元素。

checkBox.onclick = function(e) { 
    var obj1 = e.target; 
    // rest of handler 
} 

3)您不應該使用getAttribute來檢查被禁用/啓用的元素。它會給你屬性的文本值,它是一個空字符串。相反,請使用DOM爲您提供的布爾屬性:

// toggle the disabled attribute 
obj1.disabled = !obj1.disabled;