我正在使用JQuery UI對話框(在模式模式下)顯示使用Django動態生成的窗體的網頁上工作。基本流程是:動態加載的JavaScript不會工作第二次加載
- 用戶點擊一個按鈕
- 的jQuery(使用AJAX)發出返回的HTML,然後用來填充對話框
- HTML中包含表單的GET請求一個腳本標記,處理一些用戶界面的表格加載罰款和按預期工作
- 用戶比填寫表格,並單擊「完成」,並提交表單。
問題出現在用戶在表單上發生錯誤時。服務器響應發佈的請求(提交表單),並修改原始表單(包括腳本)以顯示錯誤。這第二次腳本加載它得到一個「未捕獲ReferenceError:$未定義(匿名函數)」該腳本是完全一樣的,因爲它以前工作正常。在整個過程中要清楚,頁面永遠不會刷新。
這裏是JavaScript的要點是需要照顧的模態:
var add_container = $("#add_container");
add_container.dialog({...})
function show_form(form,response_func) {
add_container.html(form);
add_container.dialog("open");
$("#add_form").submit(function (event) {
return submit_form($(this),response_func);
});
}
function submit_form(form,response_func) {
add_container.append('<p>Adding...</p>');
//this is a trick to upload a file without reloading the page
form.attr('target','upload_target');
$('#upload_target').load(function() {
var response = $('#upload_target').contents().find('body').html();
add_container.dialog("close");
resp_obj = $(response)
if (resp_obj.is('form')) {
//***this is what reloads the form when there is an error
show_form(response,response_func);
} else {
response_func(resp_obj);
}
});
}
$('#add_link').click(add_link);
function add_link() {
$.get('/add_link', function(data) {
function add_response(response) {
//handle successful submission
}
show_form(data,add_response);
});
}
//...more stuff that is not important
這是HTML的要點從/ add_link返回
<script type="text/javascript" src="/scripts/add_form.js" ></script>
<form id="add_form" enctype="multipart/form-data" action="/add_link/" method="post">
<!-- Dynamically generated form here !-->
</form>
的add_form.js是一個漂亮的標準的JavaScript文件,使用jQuery。它以$(document).ready(function(){...})開頭,第一個$是ReferenceError發生的地方
表單需要根據點擊的內容動態生成,所以我不能將所有內容靜態放在頁面上。該腳本不是動態生成的,因此它不一定需要動態加載,但我不確定如何將它保留在自己的文件中,並且只有在加載表單時纔會運行它。我願意提供替代方法來達到同樣的效果。
我重複檢查和表單提交後,jQuery腳本肯定仍然存在。我看到了這些腳本,我也可以在控制檯中鍵入'$'並且不會給出錯誤。這是有道理的,因爲沒有頁面刷新。 – techwes 2013-03-23 19:21:31
但是,您的回覆讓我想到了一個想法。該腳本是否可以在表單提交給的iFrame內部執行,因爲響應會返回到iFrame,然後主javascript抓住它?如果是這樣,我會如何防止呢? – techwes 2013-03-23 19:22:44