2012-06-24 167 views
0

我試圖根據用戶提供的數字添加輸入框。在我的addexercises()被調用之前,jquery函數可以正常工作,但是在它被調用後它不再有效。執行javascript函數後jquery不工作

編輯:基本上,addexercise()執行後,當我點擊「文本框」類的東西時,我的jquery函數不再起作用。在addexercise()執行之前,它工作正常。我不明白它爲什麼會突破。提前

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Insert title here</title> 
<link rel="stylesheet" href="/static/addworkout.css" type="text/css"> 
<script type="text/javascript" src="/static/jquery.js"> </script> 
<script type="text/javascript" src="/static/addworkout.js"></script> 



</head> 
{% extends "masterpage.html" %} 
{% block content %} 
<body> 

<div id="workoutentrycontainer"> 
<div id="exercisesthisworkout"> 
<p>How many unique exercises</p> 
<input type="text" class="textbox" id="numexercises"> 
<input type="button" class="button" onclick="addexercises()" value="Add" id="numexercisesbutton"> 


</div> 
</div> 
</body> 
{% endblock %} 
</html> 

感謝您的幫助:

這裏是我的addworkout.js文件

$(document).ready(function() { 

    $(".textbox").click (function() { 
     alert('working'); 
}); 

    }); 


    function addexercises() { 

     var numexercise = document.getElementById("numexercises"); 
     var totalexercise = 0 ; 
     document.getElementById("exercisesthisworkout").style.display = "none"; 
     if (parseInt(numexercise.value) && parseInt(numexercise.value) < 25 && totalexercise < 25) { 
      totalexercise += parseInt(numexercise.value); 
      for (var i = 0; i < parseInt(numexercise.value); i++) { 

       // alert("hello world"); 

       var subcontainer = '<div class="exercisecontainer">'; 
       var exercisename = '</br><input type="text" value="Enter Exercise Name" class="textbox" name="exercisename">'; 
       var numsets = '<br><input type="text" value="Number of Sets" class="numsets" name="numsets">'; 
       var endingdiv = "</div>"; 
       subcontainer += exercisename; 
       subcontainer += numsets; 
       subcontainer += endingdiv; 
       document.getElementById("workoutentrycontainer").innerHTML += subcontainer; 



       //document.getElementById("workoutentrycontainer").innerHTML += exercisename; 

       //document.getElementById("workoutentrycontainer").innerHTML += numsets 

       //document.getElementById("workoutentrycontainer").innerHTML += endingdiv; 

      } 

     } 

    } 

和我的HTML文件!

+0

是不是已經超出它了? –

回答

3

問題1:這個document.getElementById("workoutentrycontainer").innerHTML = ...導致#workoutentrycontainer的整個內容被重新創建。所以即使那些有事件依據的投入也會失去它。

問題2:新創建的元素不會神奇地結束與您在文檔加載時定義的事件綁定。你必須將事件處理程序沒有正在重建(#workoutentrycontainer是自然的選擇),然後通過.textbox

$("#workoutentrycontainer").on("click", ".textbox", function() { 
    alert('working'); 
}); 

過濾它這將解決問題1太最接近父綁定,但我還是建議你使用jQuery方法而不是innerHTML來追加新的內容。這將避免不必要的DOM操作。

+0

so + =在JavaScript中會導致一切被覆蓋? –

+0

@ Lilluda5您正在有效地說'x.innerHTML = x.innerHTML + y'。新內容的一部分與以前完全無關。所有'x'的孩子都將被清除並從新的HTML重新創建。 –

+0

謝謝。你的答案奏效,我感謝額外的解釋。 –

0

不確定您是否在頁面中重複呼叫addexercises,或只在頁面載入中呼叫。

如果只是在頁面加載時調用它,並且在添加點擊處理程序之前調用它,則所有對元素都是很好的綁定處理程序。

如果它將在頁面加載後使用,則需要將clcik處理程序委派給更高級別的html樹或文檔以考慮將來的元素。

如果運行代碼時存在元素,事件只能被直接綁定到元素上。

$(document).ready(function() { 

    $(document).on('click',".textbox").click (function() { 
     alert('working'); 
    }); 

});