使用MVC5 C#和Razor在局部视图中运行javascript
我使用Razor引擎在MVC5和C#中有一个小型Web应用程序。 在我的代码中,我有一个主视图,它是一个表的索引,带有一些按钮。 当我单击其中一个按钮时,会出现一个Bootstrap模式。
到目前为止一直很好,但问题是我想在点击模态上的按钮时执行某些操作,但没有任何反应。
这是主要观点:
Package List
这是我通过使用jQuery显示模态的方式:
//Show Edit Package modal $(".btn.btn-default.editPackage").click(function () { $.ajax({ url: $(this).data('url'), type: 'GET', cache: false, success: function (result) { $('#editModal').html(result).find('.modal').modal({ show: true }); } }); return false; //prevent browser defualt behavior });
到现在为止还挺好。 一切正常。 问题来自模态……
这是模式:
这是我希望在单击模态中的按钮时运行的Javascript:
$(document).ready(function() { $("#savePackageChangesBtn").click(function() { $('.modal').modal({ show: true }); return false; //prevent browser defualt behavior }); });
主视图位于名为“Index.cshtml”的文件中。 模态视图是一个名为“_EditModal.cshtml”的文件(因为它是局部视图)。 javascript代码是一个名为“custom.js”的文件,在主视图中使用并运行完美。
为什么这不起作用?
你的模态是动态添加的,但你的$("#savePackageChangesBtn").click(function()
是在DOM就绪时间注册的(当目标元素不存在时要绑定)。
如果添加了alert($("#savePackageChangesBtn").length);
在单击处理程序之前它将返回0。
使用委托的事件处理程序,附加到不变的祖先元素。
例如
$(document).on('click', "#savePackageChangesBtn", function()
这通过监听事件冒泡到不变的祖先,然后在事件时间而不是事件注册时应用jQuery选择器。 这意味着只有在发生单击时才需要存在该元素。
您通常会选择一个靠近加载内容的不变元素,因此可能使用#editModal
而不是document
例如
$('#editModal').on('click', "#savePackageChangesBtn", function()
注意:如果没有其他方便的话, document
是最好的默认值,但不要使用'body'
作为样式可能导致它不响应冒泡的鼠标事件(例如,如果计算的body
高度为零)。
添加$("#savePackageChangesBtn").click(function() {});
显示模态后的代码
例如
//Show Edit Package modal $(".btn.btn-default.editPackage").click(function () { $.ajax({ url: $(this).data('url'), type: 'GET', cache: false, success: function (result) { $('#editModal').html(result).find('.modal').modal({ show: true }); $("#savePackageChangesBtn").click(function () { $('.modal').modal({ show: true }); return false; //prevent browser defualt behavior }); } }); return false; //prevent browser defualt behavior });
或者将以下内容添加到您的document.ready中
$(document).on("click", "#savePackageChangesBtn", doSomething);
这使您的文档可以侦听init之后创建的元素。
在doSomething中添加你想要的东西。