/* * description: 漂浮广告 * author: jjc * date: 2012.07.04 */ ;(function ($, window, document, undefined) { var pluginname = 'floatingad'; var adclass = "floatingad"; var defaults = { adclass: "floatingad", step: 1, delay: 50, islinkclosed: false, onclose: function (elem) { } }; var ads = { linkurl: '#', 'z-index': '100', 'closed-icon': '', 'closed-title': 'x', imgheight: '', imgwidth: '', title: '', img: '#', linkwindow: '_blank', headfilter: 0.2 }; function plugin(element, options) { this.element = element; this.options = $.extend( {}, defaults, options, { width: $(window).width(), height: $(window).height(), xpos: this.getrandomnum(0, $(window).width() - $(element).innerwidth()), ypos: this.getrandomnum(0, 300), yon: this.getrandomnum(0, 1), xon: this.getrandomnum(0, 1), ypath: this.getrandomnum(0, 1), xpath: this.getrandomnum(0, 1), hoffset: $(element).innerheight(), woffset: $(element).innerwidth(), fn: function () { }, interval: 0 } ); this._defaults = defaults; //this._name = pluginname; this.init(); } plugin.prototype = { init: function () { var elem = $(this.element); var defaults = this.options; var p = this; var xflag = 0; var yflag = 0; elem.css({"left": defaults.xpos + p.scrollx(), "top": defaults.ypos + p.scrolly()}); defaults.fn = function () { defaults.width = $(window).width(); defaults.height = $(window).height(); defaults.hoffset = elem.height(); defaults.woffset = elem.width(); if (xflag == p.scrollx() && yflag == p.scrolly()) { elem.css({"left": defaults.xpos + p.scrollx(), "top": defaults.ypos + p.scrolly()}); if (defaults.yon) defaults.ypos = defaults.ypos + defaults.step; else defaults.ypos = defaults.ypos - defaults.step; if (defaults.ypos <= 0) { defaults.yon = 1; defaults.ypos = 0; } if (defaults.ypos >= (defaults.height - defaults.hoffset)) { defaults.yon = 0; defaults.ypos = (defaults.height - defaults.hoffset); } if (defaults.xon) defaults.xpos = defaults.xpos + defaults.step; else defaults.xpos = defaults.xpos - defaults.step; if (defaults.xpos <= 0) { defaults.xon = 1; defaults.xpos = 0; } if (defaults.xpos >= (defaults.width - defaults.woffset)) { defaults.xon = 0; defaults.xpos = (defaults.width - defaults.woffset); } } yflag = $(window).scrolltop(); xflag = $(window).scrollleft(); }; this.run(elem, defaults); }, run: function (elem, defaults) { this.start(elem, defaults); this.adevent(elem, defaults); }, start: function (elem, defaults) { elem.find('div.ad_close').hide(); defaults.interval = window.setinterval(defaults.fn, defaults.delay); window.settimeout(function () { elem.show(); }, defaults.delay); }, getrandomnum: function (min, max) { var range = max - min; var rand = math.random(); return (min + math.round(rand * range)); }, getpath: function (on) { return on ? 0 : 1; }, clear: function (elem, defaults) { elem.find('div.ad_close').show(); window.clearinterval(defaults.interval); }, close: function (elem, defaults, isclose) { elem.unbind('hover'); elem.remove(); if (isclose) defaults.onclose.call(elem); }, adevent: function (elem, defaults) { var obj = { elem: this, fn_close: function () { this.elem.close(elem, defaults, true); }, fn_clear: function () { if (this.elem.options.islinkclosed) this.elem.close(elem, defaults, false); } }; elem.find('div.ad_button').bind('click', jquery.proxy(obj, "fn_close")); elem.find('a').bind('click', jquery.proxy(obj, "fn_clear")); var stop = { elem: this, over: function () { this.elem.clear(elem, defaults); }, out: function () { this.elem.start(elem, defaults); } }; elem.hover( jquery.proxy(stop, "over"), jquery.proxy(stop, "out") ); }, scrollx: function () { var de = document.documentelement; return self.pagexoffset || (de && de.scrollleft) || document.body.scrollleft; }, scrolly: function () { var de = document.documentelement; return self.pageyoffset || (de && de.scrolltop) || document.body.scrolltop; } }; $.fn.floatingad = function (options) { if (options) { if (options.ad) { var addiv = $(this); addiv.addclass(options.adclass || adclass); //for (var i in options.ad) { //此写法存在bug,for..in循环会把某个类型的原型(prototype)中方法与属性给遍历出来,所以这可能会导致代码中出现意外的错误 var len = options.ad.length; for (var i = 0; i < len; i++) { var ad = options.ad[i]; ad = $.extend({}, ads, ad); //漂浮层 var div = $('
', { 'class': 'ad' }); div.css("z-index", ad['z-index']); //关闭层 var closediv = $('
', { 'class': 'ad_close' }); $('
', { 'class': 'ad_opacity', 'style': 'opacity: ' + ad.headfilter + ';filter: alpha(opacity = ' + ad.headfilter * 100 + ');' }).appendto(closediv); $('
', { 'class': 'ad_text' }).append( $('
', { 'class': 'ad_title', 'text': ad.title, 'style': 'width: ' +(ad.imgwidth-30) + 'px;' }) ).append( $('
', { 'class': 'ad_button', //'text': ad['closed-title'] ? ad['closed-title'] : '', 'style': ad['closed-icon'] ? 'background:url("' + ad['closed-icon'] + '") no-repeat;' : '' }) ).appendto(closediv); closediv.appendto(div); //内容层 var content = $('