【发布时间】:2012-01-24 15:35:14
【问题描述】:
我编写的一个简单滑块脚本中的变量范围存在问题(由于带宽低,我不想使用现成的解决方案)。在静态加载的页面 (http) 以及通过 AJAX 加载的内容上调用滑块脚本。在静态加载的页面(所以没有 AJAX)上,脚本似乎运行良好。但是,当通过 AJAX 调用时,调用的方法找不到 DOM 的元素,这会停止滑块所需的必要动画。
所有事件都通过偶数委托处理(使用 jQuery 的 on() 函数),但这并没有提供任何解决方案。我很确定它与脚本的结构和变量范围有关,但无法确定如何更改结构。所以我正在寻找一种适用于两种情况的解决方案(称为正常或通过 AJAX)。
我尝试在每个函数中声明所需的变量,但这导致了一些错误的错误,例如我为动画设置的间隔的乘积,因为函数范围。希望有人可以在正确的方向上帮助我。
// Slider function
(function (window, undefined) {
var console = window.console || undefined, // Prevent a JSLint complaint
doc = window.document,
Slider = window.Slider = window.Slider || {},
$doc = $(doc),
sliderContainer = doc.getElementById('slider_container'),
$sliderContainer = $(sliderContainer),
$sliderContainerWidth = $sliderContainer.width(),
slider = doc.getElementById('slider'),
$slider = $(slider),
$sliderChildren = $slider.children(),
$slideCount = $sliderChildren.size(),
$sliderWidth = $sliderContainerWidth * $slideCount;
$sliderControl = $(doc.getElementById('slider_control')),
$prevButton = $(doc.getElementById('prev')),
$nextButton = $(doc.getElementById('next')),
speed = 2000,
interval,
intervalSpeed = 5000,
throttle = true,
throttleSpeed = 2000;
if (sliderContainer == null) return; // If slider is not found on page return
// Set widths according to the container and amount of children
Slider.setSliderWidth = function () {
$slider.width($sliderWidth);
$sliderChildren.width($sliderContainerWidth);
};
// Does the animation
Slider.move = function (dir) {
// Makes use of variables such as $sliderContainer, $sliderContainer width, etc.
};
// On ajax call
$doc.on('ajaxComplete', document, function () {
Slider.setSliderWidth();
});
// On doc ready
$(document).ready(function () {
Slider.setSliderWidth();
interval = window.setInterval('Slider.move("right")', intervalSpeed);
});
// Handler for previous button
$doc.on('click', '#prev', function (e) {
e.preventDefault();
Slider.move('left');
});
// Handler for next button
$doc.on('click', '#next', function (e) {
e.preventDefault();
Slider.move('right');
});
// Handler for clearing the interval on hover and showing next and pervious button
$doc.on('hover', '#slider_container', function (e) {
if (e.type === 'mouseenter') {
window.clearInterval(interval);
$sliderControl.children().fadeIn(400);
}
});
// Handler for resuming the interval and fading out the controls
$doc.on('hover', '#slider_control', function (e) {
if (e.type !== 'mouseenter') {
interval = window.setInterval('Slider.move("right")', intervalSpeed);
$sliderControl.children().fadeOut(400);
}
});
})(window);
HTML 示例结构:
<div id="slider_control">
<a id="next" href="#next"></a>
<a id="prev" href="#prev"></a>
</div>
<div id="slider_container">
<ul id="slider">
<li style="background-color:#f00;">1</li>
<li style="background-color:#282">2</li>
<li style="background-color:#ff0">3</li>
</ul>
</div>
【问题讨论】:
-
看到这么多行代码很难理解。您应该尝试仅将代码放在最有可能出现问题的地方。
-
我认为问题出在结构上,所以我认为最好显示所有内容。我会尽量缩短
标签: javascript jquery ajax variables scope