【发布时间】:2018-03-14 13:13:38
【问题描述】:
多年来,我一直在网站上同时使用 ScriptManager 和 jQuery 滑块小部件,但我最近遇到了一个问题,导致小部件无法正常工作。我设法解决了这个问题,但这更多的是运气而不是专业知识。我希望有人可以提供该问题背后的原因,并且该修复程序可能对遇到相同问题的其他人有用。
我使用了一个脚本聚合器,它将我的脚本组合在一起 - 这是它包含的内容 - 所有代码 sn-ps 都已配对为简洁起见:
vendor/Modernizr.min.js
vendor/jQuery.3.0.0.min.js
vendor/jQuery-UI.1.12.1.min.js
vendor/jQuery-UI.TouchPunch.min.js
propriertary/LoanSelector.js
DefaultInit.js
这是 DefaultInit.js 的内容:
$(document).ready(function () {
loanSelector.init();
});
这是 LoanSelector.js 的基本内容
var loanSelector = function () {
var pub = {}, $ctl = $("#loan-selector"),
$sliderAmount = $ctl.find(".slider-amount:first"),
$widgetAmount = $sliderAmount.find(".widget:first");
function initControl() {
initWidgetAmount(100, 2000, 100, $("#hfStartAmount").val());
}
function initWidgetAmount(min, max, step, initialVal) {
$widgetAmount.slider({
});
}
pub.init = function () {
initControl();
};
return pub;
} ();
现在这可以工作了 - 但只有页面上没有 ScriptManager。
添加脚本管理器后,滑块小部件不会加载 - 没有错误 - 没有。
缓存的元素是页面上的永久固定装置 - 因此这不是元素在某个时间点不存在的情况。
这是 ScriptManager 代码:
<asp:ScriptManager ID="SM" runat="server"
EnableCdn="true"
LoadScriptsBeforeUI="false"
EnablePageMethods="true">
</asp:ScriptManager>
如果我进行更改,我可以使用页面上的 ScriptManager 加载小部件 - 这是另一个有效的 LoanSelector.js 版本:
var loanSelector = function () {
var pub = {}, $ctl, $sliderAmount, $widgetAmount;
function cacheElements() {
$ctl = $("#loan-selector"),
$sliderAmount = $ctl.find(".slider-amount:first"),
$widgetAmount = $sliderAmount.find(".widget:first");
}
function initControl() {
// This is new
cacheElements();
initWidgetAmount(100, 2000, 100, $("#hfStartAmount").val());
}
function initWidgetAmount(min, max, step, initialVal) {
$widgetAmount.slider({
});
}
pub.init = function () {
initControl();
};
return pub;
} ();
那么,任何人都可以解释一下为什么它可能不起作用以及修复为什么起作用?
【问题讨论】:
-
几个问题,控制台有错误吗?你试过放调试器吗?进入你的函数的各个部分,看看命中了什么? LoanSelector 的 init() 函数是什么?我在pub对象上看到了,但是你调用了loanSelector.init(),你只需要调用loanSelector()吗?
-
我认为可能 ScriptManager 必须改变脚本的加载方式,如果您的脚本在加载 HTML 之前加载,那么它找不到元素。检查这一点的最简单方法是在调用 initWidgetAmount 方法之前立即为每个工作和非工作解决方案添加“conslole.log($ctl.length)。如果长度为 0,在非工作示例中,表示未加载 HTML 内容当方法被调用时。
-
@andrewf - 我在 Chrome 中检查了页面,看不到任何明显的错误 - pub 是公共接口 - 我在 document.ready 中调用 init。
-
你几乎可以看到模块模式了。检查 $(document).ready(function () { if(typeof(loanSelector) === "undefined") loanSelector.init(); });如果这是真的,你的脚本管理器需要被取出来。
-
会不会和scriptmanager的部分页面渲染有关?所以 document.ready() 没有被触发?
标签: javascript jquery asp.net webforms