【问题标题】:My first jQuery-based slider, needs some error handling我的第一个基于 jQuery 的滑块,需要一些错误处理
【发布时间】:2013-03-27 07:54:49
【问题描述】:

我是一个新手 JS 程序员,我自己制作基于 jQuery 的滑块。这是我到目前为止所做的:

HTML:

<div id="keyVisual">

<p id="loading"><span>Loading Content...</span></p>

<ul id="keySlide">
<li id="slideSplash">SPLASH: no pager control on this slide</li>
<li id="slide01"><a href="http://yahoo.com/"></a></li>
<li id="slide02">
<div class="gchild">
    <p>grand child content, feedly is a google reader alternative you might want to think.    
</p>
    <a href="http://feedly.com/" class="link">feedly</a>
</div>
</li>
<li id="slide03">
<div class="gchild">
<p>some grand child content3</p>
<a href="http://yahoo.com" class="link" target="_blank">Yahoo</a>
</div>
</li>
<li id="slide04">
<div class="gchild">
<p>some grand child content4</p>
<a href="http://google.com" class="link" target="_blank">Google</a>
</div>
</li>
</ul>

<div id="btnMoveNext" class="btnSlide"><a href="#">&raquo;</a></div>
<div id="btnMovePrev" class="btnSlide"><a href="#">&laquo;</a></div>
</div><!-- /#keyVisual -->

<!-- pager -->
<ul id="listTopKey" class="cf">
<li><a href="#slide01" class="no1">No.1</a></li>
<li><a href="#slide02" class="no2">No.2</a></li>
<li><a href="#slide03" class="no3">No.3</a></li>
<li><a href="#slide04" class="no4">No.4</a></li>
</ul>

JS请参考JSFiddle

我还有一个希望解决的最后一个问题。在脚本的最后,我制作了一个函数来监视每张幻灯片的背景图像的加载状态。加载完所有 BG 图像后,滑块启动。

这在我第一次访问该页面时看起来不错,但是如果我单击一个链接去某个地方,然后返回此滑块页面(例如使用浏览器后退按钮),似乎滑块无法继续(只是加载场景中的堆栈)。大多数情况下,这在 Google Chrome 和 Firefox 中都可以正常工作,但在 IE 中则不行。

我认为我需要针对这种情况进行一些错误处理。我可以想到在大约 15 秒后创建一个 setTimeout 函数来触发 loader();。有什么建议吗?

谢谢。

附:随意自定义或实现代码并将其用于您自己的代码。

【问题讨论】:

  • 你在绑定加载事件之前检查了图片的complete属性吗?因为如果您的图像已经加载,它们将被缓存并且您的事件不会触发
  • @ant_Ti 我已经在第 380 行使用了complete,请看看我的 JSFiddle。这难道不是诀窍吗?
  • 那里有错误。将在几分钟内发布修复

标签: javascript jquery slider


【解决方案1】:

这里对您的代码进行了一些小修复。我还添加了错误处理程序。

$.each(_imgURLArr, function(i, val) {
    var _tempImg = $('<img/>').attr('src', val),
        handler = function(event) {
            var img = $(this).off('.preloader');

            console.log(val + 'is loaded!', img);
            _imgCounter++;
            console.log('counter is ' + _imgCounter);
            if (_imgCounter == _childL) {
                loader();
            }
        };

    if (_tempImg[0].complete) {
        handler.call(_tempImg[0], {});
    } else {
        _tempImg
            .on('load.preloader', handler)
            .on('error.preloader', function() {
                var img = $(this).off('.preloader');

                console.log('Error loading img', img);
            });
    }
});

【讨论】:

  • 感谢您纠正我的错误。但我对call 方法完全陌生。需要一些时间来理解。
  • @norixxx 用两个词传递给call 的第一个参数将是执行函数中的this
  • 现在我慢慢明白了这个想法,但只有一件事。你为什么把 [0] 放到 _tempImg 中,为什么不只是 _tempImg?
  • @norixxx 因为_tempImgjQuery 对象,而事件处理程序中的this 是DOM 对象。这是为了代码的一致性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多