Ошибка Javascript только в IE7 (jQuery / Cycle.js

Я использую jQuery и cycle.js, чтобы переходить через некоторые изображения на этом сайте.

На первом и последнем слайдах я поместил функцию обратного вызова для перехода на следующие / предыдущие страницы, однако в IE7 я получаю ошибку javascript во время выполнения (не в каких-либо других браузерах).

Вот ссылка на мой файл javascript: http://bit.ly/dAKEof

Ошибка, которую я получаю в IE7:

Строка: 126 символов: 4 Ошибка: объект Ожидаемый код: 0

Вот код в строке 126 файла functions.js:

window.location = $ ('# следующий'). find ("a"). attr ("href");

Любые идеи?


person Bill Addison    schedule 21.08.2010    source источник
comment
Если у вас есть отладчик javascript для IE (например, support.microsoft.com/kb/268445) пожалуйста, используйте его, чтобы узнать, что происходит. Если у вас есть Microsoft Office 2003 / Visual Studio, в комплекте идет отладчик, но во время установки вам нужно выбрать компонент для установки. Это позволит вам увидеть, что происходит при выполнении этой строки. Для получения дополнительных ссылок вы можете использовать следующие ссылки 1. блоги .msdn.com / b / ie / archive / 2004/10/26 / 247912.aspx   -  person Arun P Johny    schedule 21.08.2010


Ответы (1)


Я не увидел ссылку на сайт с ошибкой в ​​вашем вопросе, но увидел URL-адрес в вашем профиле и пошел туда, чтобы узнать, может ли это быть тот самый. Похоже, это ...

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");
    }
}

Функция end в объекте ops имеет значение NULL, и вот где ошибка. Интересно, что я также проверил FF, и это тоже верно, но, похоже, в этом случае он восстанавливается более изящно, чем IE.

Из остальной части кода не совсем понятно, как вызывается функция onBefore. Похоже, это может быть сам плагин цикла. В любом случае, где бы ни происходил этот вызов, кажется, что объект opts не заполняется всеми данными, которые необходимы вашей функции.

Обновление:

Я взглянул на код плагина цикла, и opts.end - это обратный вызов, который должен предоставить пользователь плагина. Таким образом, решение вашей проблемы состоит в том, чтобы либо предоставить свой собственный обратный вызов при создании объекта цикла (строка 101 в вашем js-файле), либо удалить строки в вашем коде, которые вызывают функцию end.

Обновление в ответ на комментарий OP ниже:

При более внимательном рассмотрении ваш код действительно будет делать именно то, что вы хотите, без необходимости вызывать end обратный вызов, поэтому вы можете безопасно удалить эти строки. Плагин запускает ваш onBefore обратный вызов до того, как выполнит какие-либо анимации. И поскольку вы перезагружаете новый URL-адрес в браузере при движении назад с 1-го слайда или вперед с последнего, он даже не дойдет до анимации затухания, что и является вашей целью.

Однако, чтобы ответить на ваш вопрос о том, как добавить обратный вызов end к исходному объекту цикла, вы должны сделать это точно так же, как и для onBefore и onAfter. Создайте функцию с любым кодом, который вы хотите выполнить, а затем включите end: yourFuncName в хэш объекта, переданный в плагин. Другой способ остановить плагин цикла - $(selector).cycle('stop');. Но опять же, в вашем случае ничего из этого не нужно. Просто удалите вызовы end, и все будет в порядке.

person Bryan    schedule 21.08.2010
comment
Спасибо, Брайан! Я понимаю, о чем вы говорите, извините, я очень новичок в JavaScript в целом. Вы очень помогли! В настоящее время конечная функция onBefore следит за тем, чтобы изображение не выцветало, если это первый или последний слайд на странице, хотя вызов этой функции неверен. Как я могу добавить это как функцию обратного вызова к исходному объекту цикла? Или есть лучший способ остановить затухание функции обратного вызова onBefore для цикла? Спасибо за вашу помощь, очень признателен! - person Bill Addison; 21.08.2010
comment
Сегодня я потратил на это еще немного времени. Проблема в том, что когда я удаляю opts.end (opts); из обратного вызова, даже если функция window.location находится в onBefore и, следовательно, должна запускаться до исчезновения, это не так. В любом случае начнется затухание, и вскоре после этого местоположение изменится. Странно то, что когда я ставлю opts.end (opts); в, этого не происходит. - person Bill Addison; 21.08.2010
comment
Интересный. В этом случае попробуйте заменить эти строки на $('#slider').cycle('stop');. Если это сработает, вы можете, если хотите, поместить эту новую строку в отдельную функцию и передать ее при создании плагина цикла, как описано в моем последнем обновлении. Затем вам нужно будет вернуть opts.end(opts);, который вызовет новый обратный вызов. - person Bryan; 21.08.2010
comment
Привет, Брайан, проблема заключалась в том, что обычно обратный вызов onBefore должен срабатывать до исчезновения анимации, однако, поскольку у меня были операторы if, содержащиеся в обратном вызове onBefore, часть анимации исчезла до вызова ссылки. Я обнаружил, что если установить цикл на nowrap, это решит проблему упреждающего затухания на первом и последнем слайдах. Но затем мне понадобился способ привязки события щелчка к кнопкам «предыдущий / следующий» и повторной привязки цикла, если пользователь меняет направление на слайде. Новый код здесь: bit.ly/dAKEof Решил это с вашей помощью и под вашим руководством, спасибо! - person Bill Addison; 21.08.2010