1

我有以下脚本,并试图在幻灯片上添加鼠标进入和离开事件,这样当鼠标悬停在图像上时它不会切换到下一个,一旦移除它就会继续。

当鼠标悬停时,我可以让幻灯片停止,但是一旦鼠标移出,幻灯片将不会继续。

我不确定这两条线是否在正确的位置:

   ---> jQuery('#slider-holder').mouseenter(function(){MOUSE_IN = true;});
   ---> jQuery('#slider-holder').mouseleave(function(){MOUSE_IN = false;});
jQuery(function () {
jQuery('a').focus(function () {
    this.blur();
});
SI.Files.stylizeAll();
slider.init();

});

---> var MOUSE_IN = false;

var slider = {
num: -1,
cur: 0,
cr: [],
al: null,
at: 10 * 1000,  /* change 1000 to control speed*/
ar: true,
anim:'slide',
fade_speed:600,
init: function () {
    if (!slider.data || !slider.data.length) return false;

    var d = slider.data;
    slider.num = d.length;
    var pos = Math.floor(Math.random() * 1);
    for (var i = 0; i < slider.num; i++) {
        if(slider.anim == 'fade')
        {
          jQuery('#' + d[i].id).hide();
        }
        else{
            jQuery('#' + d[i].id).css({
                left: ((i - pos) * 1000)
            });
        }
        jQuery('#slide-nav').append('<a id="slide-link-' + i + '" href="#" onclick="slider.slide(' + i + ');return false;" onfocus="this.blur();">' + (i + 1) + '</a>');
    }
    jQuery('img,div#slide-controls', jQuery('div#slide-holder')).fadeIn();
   ---> jQuery('#slider-holder').mouseenter(function(){MOUSE_IN = true;});
   ---> jQuery('#slider-holder').mouseleave(function(){MOUSE_IN = false;});
    slider.text(d[pos]);
    slider.on(pos);
    if(slider.anim == 'fade')
    {
      slider.cur = -1;
      slider.slide(0);
    }
    else{
    slider.cur = pos;
    window.setTimeout('slider.auto();', slider.at);
    }
},
auto: function () {
    if (!slider.ar) return false;
    if(MOUSE_IN) return false;
    var next = slider.cur + 1;
    if (next >= slider.num) next = 0;
    slider.slide(next);
},
slide: function (pos) {
    if (pos < 0 || pos >= slider.num || pos == slider.cur) return;

    window.clearTimeout(slider.al);
    slider.al = window.setTimeout('slider.auto();', slider.at);

    var d = slider.data;
    if(slider.anim == 'fade')
    {
      for (var i = 0; i < slider.num; i++) {
         if(i == slider.cur || i == pos) continue;
         jQuery('#' + d[i].id).hide();
      }

      if(slider.cur != -1){
        jQuery('#' + d[slider.cur].id).stop(false,true); 
        jQuery('#' + d[slider.cur].id).fadeOut(slider.fade_speed); 
        jQuery('#' + d[pos].id).fadeIn(slider.fade_speed); 

      }
      else
      {
        jQuery('#' + d[pos].id).fadeIn(slider.fade_speed);
      }
    }
    else
    {
        for (var i = 0; i < slider.num; i++)
        jQuery('#' + d[i].id).stop().animate({
            left: ((i - pos) * 1000)
        },
        1000, 'swing');
    }
    slider.on(pos);
    slider.text(d[pos]);
    slider.cur = pos;
},
on: function (pos) {
    jQuery('#slide-nav a').removeClass('on');
    jQuery('#slide-nav a#slide-link-' + pos).addClass('on');
},
text: function (di) {
    slider.cr['a'] = di.client;
    slider.cr['b'] = di.desc;
    slider.ticker('#slide-client span', di.client, 0, 'a');
    slider.ticker('#slide-desc', di.desc, 0, 'b');
},
ticker: function (el, text, pos, unique) {
    if (slider.cr[unique] != text) return false;

    ctext = text.substring(0, pos) + (pos % 2 ? '-' : '_');
    jQuery(el).html(ctext);

    if (pos == text.length) jQuery(el).html(text);
    else window.setTimeout('slider.ticker("' + el + '","' + text + '",' + (pos + 1) + ',"' + unique + '");', 30);
}
};

if (!window.SI) {
var SI = {};
};
SI.Files = {
htmlClass: 'SI-FILES-STYLIZED',
fileClass: 'file',
wrapClass: 'cabinet',

fini: false,
able: false,
init: function () {
    this.fini = true;

    var ie = 0
    if (window.opera || (ie && ie < 5.5) || !document.getElementsByTagName) {
        return;
    }
    this.able = true;

    var html = document.getElementsByTagName('html')[0];
    html.className += (html.className != '' ? ' ' : '') + this.htmlClass;
},
stylize: function (elem) {
    if (!this.fini) {
        this.init();
    };
    if (!this.able) {
        return;
    };

    elem.parentNode.file = elem;
    elem.parentNode.onmousemove = function (e) {
        if (typeof e == 'undefined') e = window.event;
        if (typeof e.pageY == 'undefined' && typeof e.clientX == 'number' && document.documentElement) {
            e.pageX = e.clientX + document.documentElement.scrollLeft;
            e.pageY = e.clientY + document.documentElement.scrollTop;
        };
        var ox = oy = 0;
        var elem = this;
        if (elem.offsetParent) {
            ox = elem.offsetLeft;
            oy = elem.offsetTop;
            while (elem = elem.offsetParent) {
                ox += elem.offsetLeft;
                oy += elem.offsetTop;
            };
        };
        var x = e.pageX - ox;
        var y = e.pageY - oy;
        var w = this.file.offsetWidth;
        var h = this.file.offsetHeight;
        this.file.style.top = y - (h / 2) + 'px';
        this.file.style.left = x - (w - 30) + 'px';
    };
},
stylizeById: function (id) {
    this.stylize(document.getElementById(id));
},
stylizeAll: function () {
    if (!this.fini) {
        this.init();
    };
    if (!this.able) {
        return;
    };

    var inputs = document.getElementsByTagName('input');
    for (var i = 0; i < inputs.length; i++) {
        var input = inputs[i];
        if (input.type == 'file' && input.className.indexOf(this.fileClass) != -1 && input.parentNode.className.indexOf(this.wrapClass) != -1) this.stylize(input);
    };
}
};

(function (jQuery) {
jQuery.fn.pngFix = function (settings) {
    settings = jQuery.extend({
        blankgif: 'blank.gif'
    },
    settings);
    var ie55 = (navigator.appName == 'Microsoft Internet Explorer' && parseInt(navigator.appVersion) == 4 && navigator.appVersion.indexOf('MSIE 5.5') != -1);
    var ie6 = (navigator.appName == 'Microsoft Internet Explorer' && parseInt(navigator.appVersion) == 4 && navigator.appVersion.indexOf('MSIE 6.0') != -1);

    if (jQuery.browser.msie && (ie55 || ie6)) {

        jQuery(this).each(function () {
            var bgIMG = jQuery(this).css('background-image');
            if (bgIMG.indexOf(".png") != -1) {
                var iebg = bgIMG.split('url("')[1].split('")')[0];
                jQuery(this).css('background-image', 'none');
                jQuery(this).get(0).runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + iebg + "',sizingMethod='" + settings.sizingMethod + "')";
            }
        });

    }
    return jQuery;
};
})(jQuery);
jQuery(function () {
if (jQuery.browser.msie && jQuery.browser.version < 7) {

}
});
4

2 回答 2

1

两条线的位置都很好,它们只是为鼠标输入/输出事件添加了一个事件处理程序。您遇到的问题实际上是在 tha auto 函数中,如果您注意到,在 init 函数的末尾,您有:

window.setTimeout('slider.auto();', slider.at)

此行在滑块之后调用自动函数。在时间(在您的示例中为 10 秒),自动函数检查 MOUSE_IN 是否设置为 true,如果不是,则调用幻灯片函数,然后在幻灯片中函数你有另一个调用 auto 函数:

slider.al = window.setTimeout('slider.auto();', slider.at);

但是,一旦您将 MOUSE_IN 变量设置为 true,auto 函数就会简单地返回并停止执行进一步的滑动函数,为了解决这个问题,您可能需要在滑动函数中处理 MOUSE_IN 逻辑,或者在 auto 函数中返回 false 之前,再次调用超时自动功能。

于 2013-03-11T20:36:10.273 回答
0

认为这会起作用,但它没有,mouseleave 事件似乎没有触发。

jQuery('#slider-holder').mouseenter(function(){MOUSE_IN = true;});
jQuery('#slider-holder').mouseleave(function(){MOUSE_IN = false;});
while(MOUSE_IN==true)
{
jQuery('#slider-holder').mouseenter(function(){MOUSE_IN = true;});
jQuery('#slider-holder').mouseleave(function(){MOUSE_IN = false;});
}
于 2013-03-12T16:31:47.257 回答