我有关于在对话框中正确触发javascript的问题。
以下是我目前用于加载对话框的scripts.js中的代码
function LoadDialog(url, title) {
var DialogBox = $('<div class="dialog-container"></div>').dialog({ modal: true, autoOpen: false, resizeable: true }).dialog({ width: 500, height: 'auto' });
DialogBox.html('<div class="ajax-load"><img src="/Content/loading.gif" alt="loading"></div>').dialog({ buttons: null, title: 'Loading..' });
DialogBox.dialog('open').load(url, function () {
DialogBox.dialog({ title: title, Buttons: null, position: 'center', close: function (ev, ui) { $(this).dialog("destroy"); } });
});
}
$(function () {
$('.as-dialog').click(function (e) { LoadDialog($(this).attr('href'), $(this).attr('title')); return false; });
});
虽然在对话框中默认没有激活javascript代码。例如,我将一个带有不显眼验证的小表单加载到对话框中。没有身体,头等,只有一个容器div和形式本身。默认情况下验证不起作用,如果我在script.js $(function(){})下为表单添加事件处理程序,它就不会触发。如果我添加以下js引用和代码块以加载表单,它可以解决一个问题:
<script src="/Scripts/libs/jquery.validate.min.js"></script>
<script src="/Scripts/libs/jquery.validate.unobtrusive.js"></script>
<script type="text/javascript">
$(function () {
$('#form_Create').submit(function (e) {
e.preventDefault();
});
});
</script>
关于上述代码的不起作用是验证将始终有效但如果我打开对话框,关闭它,然后再次打开它,preventdefault将停止工作,表单将发布。这可能是一个多重脚本问题或什么?虽然因为没有'doc ready'代码在对话框中工作,如果放在scripts.js(标准javascript函数工作),我真的没有其他选择。 有没有更好的方法在动态加载的文件中使用javascript,还是我必须将整个表单放在父页面中才能可靠地对付它们? 有关如何处理此问题的任何意见?
答案 0 :(得分:0)
小提琴确实值得欢迎,但是为了开球:
DialogBox.dialog({ title: title, Buttons: null, position: 'center', close: function (ev, ui) { $(this).dialog("destroy"); } });
如果我们应用一些格式化并将其分解,则此行可能是个问题:
var obj = {};
obj.title = title;
obj.Buttons = null;
obj.position = 'center';
obj.close = function(ev,ui)
{
$(this).dialog("destroy");//-->this will point to obj!!
};
DialogBox.dialog(obj);
我认为您想要的是this
指向的内容,通常称为that
或_self
。
或者,您可以做的是创建一个闭包,以保留对创建对象的上下文的引用:
obj.close = (function(that)
{
return function(ev,ui)
{
that.dialog("destroy");
};
})($(this));
也许这与你的问题无关,只是为了安全起见:设置一个小提琴
答案 1 :(得分:0)
以下打开对话框的方法似乎解决了我的主要问题:
var Box = $('#dialog-container');
if (Box.length === 0) {
Box = $('<div id="dialog-container"></div>').appendTo('body');
} else { Box.empty(); }
不确定atm是否需要empty(),因为无论如何加载似乎都是这样。但是使用这段代码我可以打开对话框我喜欢多少次,代码块仍然会执行。
虽然我的问题/问题是关于我是否必须从加载的页面中调用一些脚本文件,或者有更好的方法从父级加载的文件启用脚本文件。但至少现在一切似乎都运作良好。