MVC部分视图Javascript

MVC部分视图Javascript,javascript,asp.net-mvc,partial-views,asp.net-mvc-partialview,partialviews,Javascript,Asp.net Mvc,Partial Views,Asp.net Mvc Partialview,Partialviews,我创建了一个局部视图以供重复使用。这个局部视图有一个dropdownlist,它使用所选的插件。因此,在部分视图中,我引用了所选的js/css文件以及一些javascript代码来准备文档 它按预期工作。然而,现在我有了一个页面,我在一个按钮点击事件中呈现部分视图。用户可以点击任意次数 我担心的是,重复的js会在每次单击按钮时加载。这也许就是为什么人们不建议直接将js添加到部分视图的原因。在我的例子中,它需要在局部视图本身中用于插件和操作。有没有一种好方法可以检查加载的js并防止它在随后的单击事

我创建了一个局部视图以供重复使用。这个局部视图有一个dropdownlist,它使用所选的插件。因此,在部分视图中,我引用了所选的js/css文件以及一些javascript代码来准备文档

它按预期工作。然而,现在我有了一个页面,我在一个按钮点击事件中呈现部分视图。用户可以点击任意次数


我担心的是,重复的js会在每次单击按钮时加载。这也许就是为什么人们不建议直接将js添加到部分视图的原因。在我的例子中,它需要在局部视图本身中用于插件和操作。有没有一种好方法可以检查加载的js并防止它在随后的单击事件中再次加载?

当页面首次加载时,所选的JavaScript和CSS文件应包含在页面上。当用户单击该按钮时,进行Ajax调用以包含部分内容。在AJAX请求的成功回调中,为刚刚注入页面的下拉列表初始化所选的插件代码

您的回答是正确的,重复的JS和CSS文件将被加载,这绝对是您不想要的

$.ajax(...)
    .done(function(data) {
        $("#foo")
            .html(data)
            .find("select")
            .each(function() {
                $(this).chosen({...});
            });
    });

用答案扩展我的评论

你可以留下多个css文件,我认为这不会造成任何伤害。至于JS文件,首先应该创建一个包装文件

wrapper.js

$(function() {
      if (!$().chosen) { //we do this only if chosen is not present
         var script = document.createElement('script');
         script.type = 'text/javascript';
         script.src = 'url to yor chosen library';

         $("body").append(script);
      }     
});

然后在您的视图中,您将引用此wrapper.js文件,而不是您选择的
库路径。

您可以创建库的包装器,当它将自己加载时,它将检查您需要的库是否已加载(库中可能有一些全局变量),如果它们不存在,您将动态地将脚本标记注入页面,否则not@VsevolodGoloviznin当前位置这是OP将得到的最佳答案。您应该继续并实际添加它作为答案。@NKD:要实现Vsevolod建议的功能,请查看诸如Require.js或Modernizr的
load
功能之类的库。@NKD事实上,我会去掉部分脚本,将它们放在包中,然后立即忘记这个问题all@VsevolodGoloviznin我喜欢你的建议和建议试图通过将其放在单独的js中并使用$.getScript动态加载来实现它。然后我意识到$.getScript没有按我预期的方式工作。做了一些谷歌搜索,这似乎是一个已知的问题。让我考虑一下捆绑销售。我的负担是页面上的插件。谢谢你的建议。我在部分页面上也有documentready代码来操作所选的下拉列表。如果我这样做,我将得到一个长回调函数(在所选初始化之后注入的代码),您不需要在回调函数之后注入代码。这段代码应该作为回调函数的一部分运行。我在回拨函数中引用的是在所选初始化行之后输入的代码。看起来您的方法是我选择工作的唯一方法。我想我最好使用一个长的.ajax回调代码,而不是多次加载一堆引用。我有一个简短的问题。我有一个$(“select[id^='MyDropdown']);在$(this.selected({..})之后添加;线当我把它放在$.ajax调用之外时,我不明白为什么它不起作用。