【问题标题】:Javascript error in IE7 only (jQuery / Cycle.js仅在 IE7 中出现 Javascript 错误(jQuery / Cycle.js
【发布时间】:2011-04-01 22:27:51
【问题描述】:

我正在使用 jQuery 和 cycle.js 淡出这个网站上的一些图像。

在第一张和最后一张幻灯片上,我放置了一个回调函数以转到下一页/上一页,但是在 IE7 中,我收到了运行时 javascript 错误(在任何其他浏览器中都没有)。

这是我的 javascript 文件的链接:http://bit.ly/dAKEof

我在 IE7 中收到的错误是:

行:126 字符:4 错误:预期对象 代码:0

这是我在 functions.js 文件第 126 行的代码:

window.location = $('#next').find("a").attr("href");

有什么想法吗?

【问题讨论】:

  • 如果您有 IE 的 javascript 调试器(如 support.microsoft.com/kb/268445),请使用它来了解发生了什么。如果你有 microsoft office 2003/visual studio 自带的调试器,但是在安装过程中你必须选择要安装的组件。它将允许您查看执行此行时发生的情况。如需进一步参考,您可以使用以下链接 1. blogs.msdn.com/b/ie/archive/2004/10/26/247912.aspx

标签: javascript jquery internet-explorer-7 cycle


【解决方案1】:

我没有在您的问题中看到包含错误的网站链接,但在您的个人资料中看到了一个网址,并去那里查看是否可能是那个。好像是……

IE 因在其 javascript 错误中提供不正确的行号而臭名昭著。错误实际上在第 125 行:

function onBefore(curr, next, opts, fwd) {
    // If the page isn't loading or refreshing - initCycle == false (fixes auto unbinding of slide opts on load)
    // If is last slide and next slide is fwd direction go to next project instead of wrapping cycle
    if(opts.currSlide + 1 == opts.slideCount && fwd && !initCycle){
        opts.end(opts); // <-- this line is failing b/c the end function is null
        window.location = $('#next').find("a").attr("href");
    }
    // If is first slide, and next slide is bkwd direction go to prev project instead of wrapping cycle
    else if(opts.currSlide + 1 == 1 && !fwd){
        opts.end(opts); // <-- this also fails for the same reason
        window.location = $('#prev').find("a").attr("href");
    }
}

ops 对象中的end 函数为空,这就是错误所在。有趣的是,我也检查了 FF,那里也是如此,但在这种情况下,它似乎比 IE 恢复得更优雅。

从其余的代码中,我们并不完全清楚 onBefore 函数是如何被调用的。看起来它可能是循环插件本身。无论如何,无论调用发生在哪里,opts 对象似乎都没有填充您的函数所需的所有数据。

更新:

我查看了循环插件代码,opts.end 是插件用户必须提供的回调。因此,解决问题的方法是在创建循环对象时提供自己的回调(js 文件中的第 101 行)或删除代码中调用 end 函数的行。

针对 OP 的以下评论进行更新:

仔细检查后,您的代码实际上将完全按照您的要求执行,而无需调用 end 回调,因此您可以安全地删除这些行。该插件会在执行任何动画之前触发您的 onBefore 回调。而且由于您在从第一张幻灯片向后移动或从最后一张幻灯片向前移动时在浏览器中重新加载了一个新 url,它甚至永远不会到达淡入淡出动画,这是您的目标。

但是,要回答您关于如何将end 回调添加到原始循环对象的问题,您将完全按照为onBefore 和onAfter 所做的操作。使用您想要执行的任何代码创建一个函数,然后在传递给插件的对象哈希中包含end: yourFuncName。停止循环插件的另一种方法是$(selector).cycle('stop');。但同样,在您的情况下,这些都不需要。只需删除对end 的调用就可以了。

【讨论】:

  • 谢谢布莱恩!我确切地看到你在说什么,对不起,我对 JavaScript 非常初级。你帮了大忙!目前,结束函数 onBefore 确保图像在页面上的第一张或最后一张幻灯片时不会褪色,尽管对该函数的调用不正确。我怎样才能将它作为回调函数添加到原始循环对象上?或者有没有更好的方法来停止循环的 onBefore 回调函数上的淡入淡出?感谢您的帮助,非常感谢!
  • 我今天花了一些时间来研究这个。问题是当我删除 opts.end(opts);从回调中,即使 window.location 函数是 onBefore 并且因此应该在淡入淡出之前触发,它也没有。在任何情况下都会开始淡入淡出,然后位置很快就会改变。奇怪的是,当我把 opts.end(opts);在,这不会发生。
  • 有趣。在这种情况下,请尝试将这些行替换为 $('#slider').cycle('stop');。如果这可行,那么您可以根据需要将该新行放入其自己的函数中,并在创建循环插件时将其传入,如我上次更新中所述。然后,您需要放回opts.end(opts);,这将触发新的回调。
  • 嗨,布莱恩,问题是通常onBefore 回调应该在动画消失之前触发,但是因为我在onBefore 回调中包含“if 语句”,所以一些动画之前已经消失了该链接被调用。我发现如果我将循环设置为nowrap,这将解决第一张和最后一张幻灯片上先发制人的淡入淡出问题。但后来我需要一种将点击事件绑定到上一个/下一个按钮的方法,如果用户在幻灯片上改变方向,则重新绑定循环。此处的新代码:bit.ly/dAKEof 在您的帮助和指导下完成了,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 2013-07-20
  • 2014-06-12
  • 1970-01-01
  • 2011-06-25
  • 2013-07-15
  • 1970-01-01
相关资源
最近更新 更多