13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

JQuery插件的开发真的有那么难吗

【前言】
jQuery已经被广泛使用,凭借其简洁的API,对DOM强大的操控性,易扩展性越来越受到web开发人员的喜爱,我在社区也发布了很多的jQuery插件,经常有人询问一些技巧,因此干脆写这么一篇文章给各位jQuery爱好者,算是抛砖引玉吧。

创新互联专注于南木林网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供南木林营销型网站建设,南木林网站制作、南木林网页设计、南木林网站官网定制、小程序定制开发服务,打造南木林网络公司原创品牌,更为您提供南木林网站排名全网营销落地服务。

【基础】
a)样式
很多人会认为样式是个很复杂的东西,需要沉着冷静的心态加上非凡的审美观才能设计出赏心悦目的UI,抛开图片设计不说,其实css也就是那么些属性:position,margin,padding,width,height,left,top,float,border,background...

UI设计的漂亮与否在很大程度上依赖于设计人员对配色的把握和整体效果的协调。举个简单的例子,一个简单的页面,马虎的人:  

 
 
 
 
  1.  
  2.  
  3.     Test Pagetitle> </li> <li>head> </li> <li><body> </li> <li>    jQuery是一个框架!压缩后有30多k吧。  </li> <li>body> </li> <li>html> </li> </ol></pre><p>细心的人:</p><pre> <ol> <li><html xmlns="http://www.w3.org/1999/xhtml"> </li> <li><head> </li> <li>    <title>Test Pagetitle> </li> <li>    <style type="text/css"> </li> <li>        body  </li> <li>        {  </li> <li>            font-family:'宋体';  </li> <li>            font-size:12px;  </li> <li>            }  </li> <li>    style> </li> <li>head> </li> <li><body> </li> <li>    jQuery是一个框架!压缩后有30多k吧。  </li> <li>body> </li> <li>html> </li> </ol></pre><p>专心的人:</p><pre> <ol> <li><html xmlns="http://www.w3.org/1999/xhtml"> </li> <li><head> </li> <li>    <title>Test Pagetitle> </li> <li>    <style type="text/css"> </li> <li>        body  </li> <li>        {  </li> <li>            font-family:'Verdana','宋体';  </li> <li>            font-size:12px;  </li> <li>            }  </li> <li>    style> </li> <li>head> </li> <li><body> </li> <li>    jQuery是一个框架!压缩后有30多k吧。  </li> <li>body> </li> <li>html> </li> </ol></pre><p>我们对比一下三者的UI效果:</p><p> 一目了然,或许很多的站点失去关注正是因为这不起眼的font-family,font-size。当然这还只是个简单的例子,掌握css应该从简单做起,从基本入手,在实践中运用并不断深入。</p><p>b)脚本 <br /> 我们同样需要对javascript有着深刻的理解,对dom, xhr, Regex, call-apply, prototype等都应该有一定的了解。</p><p>有人会说要这些有啥用啊,对dom的操作其实通过getElementById, getElementsByTagName以及其他的API都可以轻松的完成,这话是没错,当思路确定后,思想才是重点,一段代码是精华还是糟粕很容易就可以区分出来,究其原因还是取决你自己,举个简单的例子,大量的html组装,</p><p>路人甲:</p><pre> <ol> <li>var a = new Array(10);  </li> <li>var menu = '';     </li> <li>for (var i = 0; i < a.length; i++) {  </li> <li>  menu += '' + a[i] + '" >' + a[i] + '';  </li> <li>}  </li> </ol></pre><p>路人乙:</p><pre> <ol> <li>String.prototype.format = function() {  </li> <li>    var args = arguments;  </li> <li>    return this.replace(/{(\d{1})}/g, function() {  </li> <li>        return args[arguments[1]];  </li> <li>    });  </li> <li>};  </li> <li> </li> <li>var a = new Array(1,2,3,4,5,6,7,8,9,0);  </li> <li>var m = '{0}';  </li> <li> </li> <li>for (var i = 0; i < a.length; i++) {  </li> <li>    menu += m.format(a[i]);  </li> <li>}  </li> </ol></pre><p>在实现方式明确的情况下,优雅高效的代码显然更具吸引力。</p><p>【实践】<br /> jQuery开发或使用,更多的灵感是来自实践,而不是copy||paste(奉行拿来主义的同学可以离开了)。</p><p>那么在这里我会用一个简单的例子来阐述jQuery插件开发的流程,能否举一反三就看各位看官了。</p><p>【目的】</p><p>开发一个插件之前我们需要对自己的目的有一个清醒的认识,有很明确的方向感,那么此次我作为示例插件的目的,就是呈现一个用于UI的Slider - 滑动条,常年从事于或暂时专注于win32开发的同学应该比较了解。</p><p>草图</p><p>真正动手编码之前我们还需要有一个草图来描述自己插件的“长相”(事件驱动或API封装的可以忽略)。<br /> 很多的同学在做UI开发前往往会忙于搜集各种小图片(非精通ps或iconworkshop人士),其实漂亮的图标的确可以美化我们的UI,不过我一般的处理方式是编写易于扩展的css,前期的UI呈现尽量少使用图片,多用线条完成。</p><p>  ok,言归正卷,那么我的slider设计草图是:</p><p>解释下下文将用到的几个词:<br /> slider: 此部分是作为拖拽手柄来使用,用户可以通过拖拽此部分来更新completed bar的位置。<br /> completed: 此部分作为bar的内嵌元素,作为特殊效果来显示slider与起始点的距离,亦即与slider的value值关联。<br /> bar: slider的载体,completed的满值。</p><p>思路:<br /> slider作为手柄提供拖拽功能,作用区域为bar,拖拽过程中completed条必须实时更新(长度),影响区域为slider至bar左端的距离。</p><p>【编码】</p><p>开发jQuery UI/Effect 插件在很多时候都需要与UI交互,因此在呈现上需要提供Html tree来绘制我们的插件,最终通过js dom来输出,那么在绘制简单的dom结构的时候我会直接用js来完成,不过如果嵌套比较复杂的话,我们还是应该先用html来完成,然后转变成js输出。</p><p>html tree:</p><pre> <ol> <li><div class="defaultbar"> </li> <li>  <div class="jquery-completed"> div> </li> <li>  <div class="jquery-jslider"> div> </li> <li>div> </li> </ol></pre><p>  deafultbar -> bar<br />   jquery-completed -> completed<br />   jquery-jslider -> slider</p><p>  前期UI呈现上我们不使用图片,尽量用线条、颜色来完成:</p><pre> <ol> <li>/*----default skin----*/  </li> <li>.defaultbar  </li> <li>{  </li> <li>    margin-top: 10px;  </li> <li>    height: 5px;  </li> <li>    background-color: #FFFFE0;  </li> <li>    border: 1px solid #A9C9E2;  </li> <li>    position: relative;  </li> <li>    }  </li> <li>.defaultbar .jquery-completed  </li> <li>{  </li> <li>    height: 3px;  </li> <li>    background-color: #7d9edb;  </li> <li>    top: 1px;  </li> <li>    left:1px;  </li> <li>    position: absolute;  </li> <li>    }  </li> <li>.defaultbar .jquery-jslider  </li> <li>{  </li> <li>    height: 15px;  </li> <li>    background-color: #E6E6FA;  </li> <li>    border: 1px solid #A5B6C8;  </li> <li>    top: -6px;  </li> <li>    display: block;  </li> <li>    cursor: pointer;  </li> <li>    position: absolute;  </li> <li>    }  </li> </ol></pre><p>将bar的position属性设置成relative,以方便子节点的浮动(子节点使用position:absolute来获得内联浮动效果)。</p><p>那么我们可以看下这个css和html tree产生的UI效果: </p><p>ok,具备了所需的元素 - slider, completed, bar.</p><p>一些规范:</p><p>当我们画出了UI之后就可以正式编写jQuery插件代码了,不过在着之前我们还需要对jQuery插件开发的一些规范性有一些了解。</p><p><strong>1. 使用闭包:</strong></p><pre> <ol> <li>(function($) {  </li> <li>  // Code goes here  </li> <li>})(jQuery);  </li> </ol></pre><p>这是来自jQuery官方的插件开发规范要求,使用这种编写方式有什么好处呢?</p><p>a) 避免全局依赖。</p><p>b) 避免第三方破坏。</p><p>c) 兼容jQuery操作符'$'和'jQuery '</p><p>我们知道这段代码在被解析时会形同如下代码:</p><pre> <ol> <li>var jq = function($) {  </li> <li>  // Code goes here  </li> <li>};   </li> <li>jq(jQuery);  </li> </ol></pre><p>这样效果就一目了然了。</p><p><strong>2. 扩展</strong></p><p>jQuery提供了2个供用户扩展的‘基类’ - $.extend和$.fn.extend.</p><p>$.extend 用于扩展自身方法,如$.ajax, $.getJSON等,$.fn.extend则是用于扩展jQuery类,包括方法和对jQuery对象的操作。为了保持jQuery的完整性,我比较趋向于使用$.fn.extend进行插件开发而尽量少使用$.extend.</p><p><strong>3. 选择器</strong></p><p>jQuery提供了功能强大,并兼容多种css版本的选择器,不过发现很多同学在使用选择器时并未注重效率的问题。 </p><p> a) 尽量使用Id选择器,jQuery的选择器使用的API都是基于getElementById或getElementsByTagName,因此可以知道效率***的是Id选择器,因为jQuery会直接调用getElementById去获取dom,而通过样式选择器获取jQuery对象时往往会使用 getElementsByTagName去获取然后筛选。</p><p> b) 样式选择器应该尽量明确指定tagName, 如果开发人员使用样式选择器来获取dom,且这些dom属于同一类型,例如获取所有className为jquery的div,那么我们应该使用的写法是$('div.jquery')而不是$('.jquery'),这样写的好处非常明显,在获取dom时jQuery会获取div然后进行筛选,而不是获取所有dom再筛选。</p><p>c) 避免迭代,很多同学在使用jQuery获取指定上下文中的dom时喜欢使用迭代方式,如$('.jquery .child'),获取className为jquery的dom下的所有className为child的节点,其实这样编写代码付出的代价是非常大的,jQuery会不断的进行深层遍历来获取需要的元素,即使确实需要,我们也应该使用诸如$(selector,context), $('selector1>selector2'), $(selector1).children(selector2), $(selctor1).find(selector2)之类的方式。</p><p>开始编码</p><p>话题有点扯远,ok,在对UI有了清晰的认识后我们就可以使用js来输出html了。</p><p>我们使用jSlider来命名这个slider插件(为了避免插件冲突,插件命名时也应十分考究,这里我就俗一回)。</p><pre> <ol> <li>$.extend($.fn, {  </li> <li>        ///  </li> <li>        /// apply a slider UI  </li> <li>        ///  </li> <li>        jSlider: function(setting) {  </li> <li>        }  </li> <li>});  </li> </ol></pre><p>在插件开发中比较标准的方式是将元数据独立出来并开放API,比如这里的setting参数传入值,有时候为了减少代码编写量,我习惯于直接在插件内赋值:</p><pre> <ol> <li>var ps = $.extend({  </li> <li>    renderTo: $(document.body),  </li> <li>    enable: true,  </li> <li>    initPosition: 'max',  </li> <li>    size: { barWidth: 200, sliderWidth: 5 },  </li> <li>    barCssName: 'defaultbar',  </li> <li>    completedCssName: 'jquery-completed',  </li> <li>    sliderCssName: 'jquery-jslider',  </li> <li>    sliderHover: 'jquery-jslider-hover',  </li> <li>    onChanging: function() { },  </li> <li>    onChanged: function() { }  </li> <li>}, setting);  </li> </ol></pre><p>规范的做法:</p><pre> <ol> <li>$.fn.jSlider.default = {  </li> <li>    renderTo: $(document.body),  </li> <li>    enable: true,  </li> <li>    initPosition: 'max',  </li> <li>    size: { barWidth: 200, sliderWidth: 5 },  </li> <li>    barCssName: 'defaultbar',  </li> <li>    completedCssName: 'jquery-completed',  </li> <li>    sliderCssName: 'jquery-jslider',  </li> <li>    sliderHover: 'jquery-jslider-hover',  </li> <li>    onChanging: function() { },  </li> <li>    onChanged: function() { }  </li> <li>    };  </li> <li> </li> <li>$.extend({},$.fn.jSlider.default,setting);  </li> </ol></pre><p>ok, 下面描述下我所定义的这些API的作用:<br /> renderTo: jSlider的载体、容器,可以是一个jQuery对象,也可以是选择器。  <br /> enable: jSlider插件是否可用,true时end-user可拖拽,否则禁止。<br /> initPosition: jSlider的初始值,‘max’或者‘min’,亦即 slider的value值,1或者0。<br /> size: jSlider的参数,包括2个值barWidth - bar的长度, sliderWidth - slider的长度。<br /> barCssName: bar的样式名称,便于end-user自行扩展样式。<br /> completedCssName: completed的样式名称。<br /> sliderCssName: slider的样式名称。<br /> sliderHover: slider聚焦时的样式名称。<br /> onChanging: slider被拖拽时触发的事件。<br /> onChanged: slider拖拽结束时触发的事件。</p><p>此时我们需要将renderTo强制转换成jQuery对象(兼容使用selector的情况):</p><pre> <ol> <li>ps.renderTo = (typeof ps.renderTo == 'string' ?  </li> <li>                 $(ps.renderTo) : ps.renderTo);  </li> </ol></pre><p>然后将html tree输出到render:</p><pre> <ol> <li>/* ----------> </li> <li>html tree:  </li> <li> </li> <li> ---->sliderbar  </li> <li>    ----> completed bar  </li> <li>   ----> slider                    </li> <li><-----------*/  </li> <li>var sliderbar = $('')  </li> <li>                    .attr('class', ps.barCssName)  </li> <li>                        .css('width', ps.size.barWidth)  </li> <li>                            .appendTo(ps.renderTo);  </li> <li> </li> <li>var completedbar = sliderbar.find('div:eq(0)')  </li> <li>                        .attr('class', ps.completedCssName);  </li> <li> </li> <li>var slider = sliderbar.find('div:eq(1)')  </li> <li>                .attr('class', ps.sliderCssName)  </li> <li>                    .css('width', ps.size.sliderWidth);  </li> </ol></pre><p>这样我们就在UI上直接呈现了Html并且用定制的css进行渲染,分别用sliderbar, completedbar, slider对我们需要的三个对象进行缓存。</p><p>ok, 在呈现了UI后我们就需要提供方法来实现slider的拖拽,在这之前我们还需要实现一个方法,就是completedbar的实时更新,即在拖动slider的时候让completedbar始终填充左侧区域:</p><pre> <ol> <li>var bw = sliderbar.width(), sw = slider.width();  </li> <li>//make sure that the slider was displayed in the bar(make a limited)  </li> <li>ps.limited = { min: 0, max: bw - sw };  </li> <li> </li> <li>if (typeof window.$sliderProcess == 'undefined') {  </li> <li>    window.$sliderProcess = new Function('obj1', 'obj2', 'left',  </li> <li>                                     'obj1.css(\'left\',left);obj2.css(\'width\',left);');  </li> <li>}  </li> <li>$sliderProcess(slider, completedbar, eval('ps.limited.' + ps.initPosition));  </li> </ol></pre><p>bw,sw用来存储sliderbar和slider的长度,此处没有直接使用ps.size里的值是为了防止样式里的border-width对width造成破坏。</p><p>定义一个私用成员limited来存储slider[left]的***值和最小值,并在后面直接使用eval('ps.limited.' + ps.initPosition)来获取,从而避免switch操作。</p><p>同时还需定义一个全局Function用来定位completedbar的填充长度以及slider左侧距离,我给其命名为$sliderProcess。</p><p>那么我们接下来剩下的工作就是slider的拖拽功能了,那么在这里我会用到之前发布的一款jQuery拖拽插件,并做适量的订制:</p><pre> <ol> <li>//drag and drop  </li> <li>var slide = {  </li> <li>    drag: function(e) {  </li> <li>        var d = e.data;  </li> <li>        var l = Math.min(Math.max(e.pageX - d.pageX + d.left, ps.limited.min), ps.limited.max);  </li> <li> </li> <li>        $sliderProcess(slider, completedbar, l);  </li> <li>        //push two parameters: 1st:percentage, 2nd: event  </li> <li>        ps.onChanging(l / ps.limited.max, e);  </li> <li>    },  </li> <li>    drop: function(e) {  </li> <li>        slider.removeClass(ps.sliderHover);  </li> <li>        //push two parameters: 1st:percentage, 2nd: event  </li> <li>        ps.onChanged(parseInt(slider.css('left')) / ps.limited.max, e);  </li> <li> </li> <li>        $().unbind('mousemove', slide.drag).unbind('mouseup', slide.drop);  </li> <li>    }  </li> <li>};  </li> <li> </li> <li>if (ps.enable) {  </li> <li>    //bind events  </li> <li>    slider.bind('mousedown', function(e) {  </li> <li>        var d = {  </li> <li>            left: parseInt(slider.css('left')),  </li> <li>            pageX: e.pageX  </li> <li>        };  </li> <li>        $(this).addClass(ps.sliderHover);  </li> <li>        $().bind('mousemove', d, slide.drag).bind('mouseup', d, slide.drop);  </li> <li>    });  </li> <li>}  </li> </ol></pre><p>这样当jSlider enable属性为true时,在end-user按下鼠标时绑定mousemove事件,在鼠标弹起时移除,我们只需要同步更新slider的left 属性和completedbar的width即可,同时在drag中绑定onChanging方法,在drop中绑定onChanged方法,向这两个方法推送的参数相同,1>百分比,即value值,介于0~1,2>event。</p><p>那么至此我们的jSlider插件就基本成型,向用户提供了一个可拖拽的slider。</p><p>【扩展】 <br /> 有的时候用户却不是那么容易满足,于是有人高呼:“我要自己设置value,为什么不提供这个功能?”。</p><p>那么这时我们就需要为用户公开一个方法,用于设置jSlider的value,首先考虑的是作为方法需要一个作用对象(jSlider),那么此时我又不想将作用对象作为参数传入,那么我们还是将这个方法作为插件来开发,我们将方法命名为setSliderValue,开放2个参数,v(value值)和 callback(设置完成后的回调函数)。</p><p>即:$.fn.setSliderValue(v,callback);</p><p>ok,那么剩下的就是作用对象了,由之前的设计可知,在slider拖动时主要作用于2个对象,slider和completedbar,那么我们在jSlider插件末尾加上一段代码来返回slider对象:</p><pre> <ol> <li>slider.data = { bar: sliderbar, completed: completedbar };  </li> <li>return slider;  </li> </ol></pre><p>这样我们在初始化jSlider的时候就可以直接用一个变量来获取jSlider对象,然后调用setSliderValue方法了,伪码:</p><pre> <ol> <li>var slider = $.fn.jSlider({});  </li> <li>slider.setSliderValue(v,function(){});  </li> </ol></pre><p>setSliderValue代码:</p><pre> <ol> <li>try {  </li> <li>    //validate  </li> <li>    if (typeof v == 'undefined' || v < 0 || v > 1) {  </li> <li>        throw new Error('\'v\' must be a Float variable between 0 and 1.');  </li> <li>    }  </li> <li> </li> <li>    var s = this;  </li> <li> </li> <li>    //validate   </li> <li>    if (typeof s == 'undefined' ||  </li> <li>        typeof s.data == 'undefined' ||  </li> <li>            typeof s.data.bar == 'undefined') {  </li> <li>        throw new Error('You bound the method to an object that is not a slider!');  </li> <li>    }  </li> <li> </li> <li>    $sliderProcess(s, s.data.completed, v * s.data.bar.width());  </li> <li> </li> <li>    if (typeof callback != 'undefined') { callback(v); }  </li> <li>}  </li> <li>catch (e) {  </li> <li>    alert(e.message);  </li> <li>}  </li> </ol></pre><p>这里同样调用了全局Function $sliderProcess在设置slider的value值时进行completedbar[width]和slider[left]的更新。由于此处进行了异常处理,所以如果end-user在确保setSliderValue被作用于jSlider对象的时候可以删除此异常处理代码。</p><p>【皮肤】<br /> 根据jSlider的API我们可以更加方便的为其设定皮肤,为了让jSlider更加专业,我们需要2张图片:</p><p> 用来作为completedbar背景的'bar'和用来作为slider背景的'slider',ok,我们更新下样式:</p><pre> <ol> <li> /*----blue skin----*/  </li> <li>.bluebar  </li> <li>{  </li> <li>    margin-top: 10px;  </li> <li>    height: 4px;  </li> <li>    background:#F7F7F7;  </li> <li>    border:solid 1px #3e3e3e;  </li> <li>    position: relative;  </li> <li>    }  </li> <li>.bluebar .jquery-completed  </li> <li>{  </li> <li>    height: 4px;  </li> <li>    background:url(../images/slider/blue/bar.gif) left center no-repeat;  </li> <li>    top: 0;  </li> <li>    left:0;  </li> <li>    position: absolute;  </li> <li>    }  </li> <li>.bluebar .jquery-jslider  </li> <li>{  </li> <li>    height: 17px;  </li> <li>    background:url(../images/slider/blue/slider.gif) center 0 no-repeat;  </li> <li>    top: -4px;  </li> <li>    display: block;  </li> <li>    cursor: pointer;  </li> <li>    position: absolute;  </li> <li>    }  </li> <li>.bluebar .jquery-jslider-hover  </li> <li>{  </li> <li>    background-position:center -17px;  </li> <li>    }  </li> </ol></pre><p>由于在设置样式时我仍然让子节点样式使用了API的默认值,因此在创建jSlider时我们只需要设置barCssName就行了:</p><pre> <ol> <li>var blue = $.fn.jSlider({  </li> <li>    renderTo: '#slidercontainer',  </li> <li>    size: { barWidth: 500, sliderWidth: 10 },  </li> <li>    barCssName: 'bluebar',  </li> <li>    onChanging: function(percentage, e) {  </li> <li>        // code goes here  </li> <li>    }  </li> <li>});  </li> </ol></pre><p>呈现出来的UI:</p><p> 我们这样来设置其值:</p><pre> <ol> <li>//set percentage with a callback function  </li> <li>blue.setSliderValue(0.65, function(percentage) {  </li> <li>    // code goes here  </li> <li>});  </li> </ol></pre><p>【通用性】<br /> 当然,我们不仅可以将jSlider作为slider使用,有时候它也是一个progressbar: </p><p>(代码我就不贴了,直接在demo里查看 ???? )</p><p>【小结】 <br /> 通篇到这里就结束了,简单的介绍了一款jQuery插件的开发流程,以及开发中应该注意的细节,那么在下一篇的文章中我会向大家介绍如何打造一个通用型的 自动完成 插件。</p><p>live demo</p><p>source[google code]</p> <br> 当前名称:JQuery插件的开发真的有那么难吗 <br> 标题URL:<a href="http://cdbrznjsb.com/article/coheoii.html">http://cdbrznjsb.com/article/coheoii.html</a> </div> <div class="other"> <h3>其他资讯</h3> <ul> <li><a href="/article/cdpgdhc.html">2u设备安装尺寸?服务器配置2u</a></li><li><a href="/article/cdpgcoo.html">如何清理手机无效文件夹</a></li><li><a href="/article/cdpgdhs.html">网站定制企业靠什么吸引客户,浅谈网站定制企业的发展历程</a></li><li><a href="/article/cdpgdje.html">名字的读音是什么?(名字的拼音怎么写)</a></li><li><a href="/article/cdpgdhg.html">oracle的循环</a></li> </ul> </div> </div> <div class="oneE"> <div class="oneEa container wow fadeInUp"> <ul> <li> <dd><img src="/Public/Home/img/oe1.png" alt=""></dd> <h3>网站建设专属方案</h3> </li> <li> <dd><img src="/Public/Home/img/oe2.png" alt=""></dd> <h3>网站定制化设计</h3> </li> <li> <dd><img src="/Public/Home/img/oe3.png" alt=""></dd> <h3>7X24小时服务</h3> </li> <li> <dd><img src="/Public/Home/img/oe4.png" alt=""></dd> <h3>N对管家服务</h3> </li> </ul> </div> <div class="oneEb container wow fadeInUp"> <h2>让你的专属顾问为你服务</h2> <form action=""> <input type="text" placeholder="需求"> <input type="text" placeholder="输入你的联系方式(微信或电话号码)"> <button>立即联系</button> </form> </div> </div> <footer> <div class="foot container"> <div class="footl"> <img src="/Public/Home/img/logo.png" alt=""> <p>用前卫的视觉</p> <p>把握好每一个细节</p> </div> <div class="footc"> <dl> <dt>服务项目</dt> <dd><a href="">网站建设</a></dd> <dd><a href="">网站优化</a></dd> <dd><a href="">网站设计</a></dd> <dd><a href="">小程序开发</a></dd> <dd><a href="">电商平台</a></dd> </dl> <dl> <dt>客户案例</dt> <dd><a href="">网站案例</a></dd> <dd><a href="">优化案例</a></dd> <dd><a href="">外贸网站案例</a></dd> </dl> <dl> <dt>资讯中心</dt> <dd><a href="">建站动态</a></dd> <dd><a href="">网站知识</a></dd> <dd><a href="">网站运营</a></dd> </dl> <dl> <dt>快捷导航</dt> <dd><a href="">关于澄梦希喜</a></dd> <dd><a href="">联系方式</a></dd> </dl> </div> <div class="footr"> <h3>联系方式</h3> <p>地址:成都市太升南路288号锦天国际A幢1002号</p> <div class="tel"> <i><img src="/Public/Home/img/ftel.png" alt=""></i><a href="tel:13518219792">电话:13518219792</a> </div> </div> </div> <div class="yqlink container"> 标签: <a href="http://www.zsjierui.cn/" target="_blank">资阳</a> <a href="http://www.wzjierui.cn/" target="_blank">温江</a> <a href="http://www.ndjierui.cn/" target="_blank">南部</a> <a href="http://www.ptjierui.cn/" target="_blank">郫县</a> <a href="http://www.hzjierui.cn/" target="_blank">彭州</a> <a href="http://www.ncjierui.cn/" target="_blank">彭山</a> <a href="http://www.whjierui.cn/" target="_blank">乐山</a> <a href="http://www.ahjierui.cn/" target="_blank">简阳</a> <a href="http://www.csjierui.cn/" target="_blank">绵阳</a> <a href="http://www.qhjierui.cn/" target="_blank">德阳</a> <a href="http://www.scjierui.cn/" target="_blank">四川</a> <a href="http://www.tjjierui.cn/" target="_blank">什邡</a> <a href="http://www.tyjierui.cn/" target="_blank">绵竹</a> <a href="http://www.xzjierui.cn/" target="_blank">眉山</a> <a href="http://www.sxjierui.cn/" target="_blank">双流</a> <a href="http://www.ptruijie.cn/" target="_blank">新都</a> <a href="http://www.xjjierui.cn/" target="_blank">新津</a> <a href="http://www.jljierui.cn/" target="_blank">龙泉</a> <a href="http://www.gyruijie.cn/" target="_blank">广汉</a> <a href="http://www.csruizhi.cn/" target="_blank">崇州</a> <a href="http://www.zjjierui.cn/" target="_blank">广元</a> <a href="http://www.zzjierui.cn/" target="_blank">广安</a> <a href="http://www.hnjierui.cn/" target="_blank">巴中</a> <a href="http://www.fjjierui.cn/" target="_blank">达州</a> <a href="http://www.gyjierui.cn/" target="_blank">南充</a> <a href="http://www.fzjierui.cn/" target="_blank">遂宁</a> <a href="http://www.cdjierui.cn/" target="_blank">广安</a> <a href="http://www.jxjierui.cn/" target="_blank">内江</a> <a href="http://www.jxruijie.cn/" target="_blank">自贡</a> <a href="http://www.hyruijie.cn/" target="_blank">泸州</a> <a href="http://www.gzruizhi.cn/" target="_blank">宜宾</a> </div> <div class="copy container"> <div class="copyl"> © Copyright 2013-2026 四川澄梦希喜广告有限公司 <a href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow" style="color:#FFFFFF">蜀ICP备2025175960号</a> 版权所有 <a href="https://www.cdcxhl.com/menu.html">网站地图</a> <a href="https://www.cdcxhl.com/articles/" rel="nofollow">其他文章分类</a> <a href="http://www.cdbrznjsb.com">成都澄梦希喜</a> </div> <div class="copyr"> <i><img src="/Public/Home/img/foot1.png" alt=""></i> <i><img src="/Public/Home/img/foot2.png" alt=""></i> <i><img src="/Public/Home/img/foot3.png" alt=""></i> <i><img src="/Public/Home/img/foot4.png" alt=""></i> </div> </div> <div class="bq_tag container"> 热门推荐: <a href="http://www.cxjianzhan.com/" target="_blank">成都app软件开发</a><a href="https://www.cdxwcx.com/city/chongzhou/" target="_blank">崇州做网站</a><a href="http://www.dianliazgc.com/" target="_blank">成都电力安装公司</a><a href="http://www.cdxwcx.cn/tuoguan/mianyang.html" target="_blank">绵阳机房托管</a><a href="http://www.cdxwcx.cn/" target="_blank">做网站</a><a href="http://www.msbanjia.com.cn/" target="_blank">眉山柴油发电机</a><a href="http://www.wtcwzsj.com/" target="_blank">wtcwzsj.com</a><a href="http://www.kswcd.com/solution/" target="_blank">网站方案</a><a href="http://www.cdkmsfdj.com/" target="_blank">成都康明斯发电机公司</a><a href="http://www.sslhqy.com/" target="_blank">sslhqy.com</a><a href="http://www.qlfdjwb.com/" target="_blank">邛崃柴油发电机维修</a><a href="http://www.cdxwcx.cn/tuoguan/zigong.html" target="_blank">自贡托管服务器</a> </div> </footer> <div class="footbarline"></div> <div id="footbar" class="uin0"> <ul> <li class="on" data-href="/"><a><i><svg t="1638436981291" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2991" width="48" height="48"><path d="M958.400956 451.54921c-0.058328-5.760191-2.597151-11.215436-6.965645-14.97097L524.345166 69.511143c-7.498788-6.445806-18.581194-6.445806-26.079982 0L309.582871 231.6755l0-102.017488c0-11.04966-8.901741-19.532869-19.951401-19.532869l-88.034009 0c-11.048637 0-19.928888 8.482185-19.928888 19.532869l0 211.954343L71.176063 436.57824c-4.423753 3.800559-6.967692 9.341762-6.967692 15.173584l0 105.500822c0 7.819083 4.554736 14.921851 11.660574 18.183128 2.670829 1.226944 5.51562 1.824555 8.343015 1.824555 4.699022 0 9.346879-1.654686 13.048177-4.836145l53.29788-45.825698 0 324.100516c0 60.677964 49.364291 110.042255 110.042255 110.042255L764.792447 960.741257c60.677964 0 110.042255-49.364291 110.042255-110.042255L874.834702 527.026228l51.585889 44.335764c5.955642 5.119601 14.356986 6.282077 21.481244 2.965541 7.122211-3.313465 11.645225-10.488889 11.565407-18.342764L958.400956 451.54921zM221.578538 150.034085l48.095391 0 0 115.941616-48.095391 41.336454L221.578538 150.034085zM570.718333 920.725892 436.666244 920.725892 436.666244 700.642404c0-11.031241 8.976442-20.007683 20.007683-20.007683l94.0357 0c11.031241 0 20.007683 8.976442 20.007683 20.007683L570.71731 920.725892zM834.818313 495.895207l0 354.803795c0 38.612413-31.414477 70.02689-70.02689 70.02689l-154.058748 0L610.732675 700.642404c0-33.096792-26.926256-60.023048-60.023048-60.023048l-94.0357 0c-33.096792 0-60.023048 26.926256-60.023048 60.023048l0 220.084511L260.59925 920.726915c-38.612413 0-70.02689-31.414477-70.02689-70.02689L190.57236 495.895207c0-1.172709-0.121773-2.314719-0.315178-3.432169l322.113255-276.958846 322.70268 277.348726C834.921667 493.848595 834.818313 494.858598 834.818313 495.895207zM525.411451 173.947727c-7.502881-6.445806-18.587334-6.446829-26.086122 0.00307L104.223736 513.663896l0-52.726875 407.081439-349.870436 407.176606 349.9523 0.521886 51.205219L525.411451 173.947727z" p-id="2992" fill="#2c2c2c"></path></svg><p>首页</p></i></a></li> <li><a href="tel:13518219792"><i><svg t="1638437906526" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4519" width="48" height="48"><path d="M705.74 604.873333a53.4 53.4 0 0 0-75.426667 0l-37.713333 37.713334c-21.333333 21.333333-90.413333 0.1-150.846667-60.34S360.046667 452.76 381.413333 431.4l0.046667-0.046667 37.666667-37.666666a53.4 53.4 0 0 0 0-75.426667l-165.94-165.933333a53.393333 53.393333 0 0 0-75.42 0l-37.713334 37.713333c-27.866667 27.866667-44.84 64.52-50.46 108.946667-5.213333 41.206667-0.406667 87.42 14.28 137.333333C133.333333 536.586667 199.773333 642 290.9 733.1S487.42 890.666667 587.653333 920.126667c36.926667 10.86 71.813333 16.32 104.146667 16.32a264.333333 264.333333 0 0 0 33.213333-2.04c44.426667-5.62 81.08-22.593333 108.946667-50.46l37.713333-37.713334a53.393333 53.393333 0 0 0 0-75.42z m135.76 211.193334l-37.706667 37.713333c-42.58 42.573333-115.06 51.6-204.1 25.413333-93.506667-27.5-192.453333-90.1-278.62-176.266666s-148.766667-185.113333-176.266666-278.62c-26.186667-89.033333-17.16-161.52 25.413333-204.1l37.713333-37.706667a10.666667 10.666667 0 0 1 15.086667 0l165.933333 165.933333a10.666667 10.666667 0 0 1 0 15.086667l-37.713333 37.706667C329.113333 423.333333 324.666667 458.82 338.766667 501.073333c12.426667 37.273333 38.286667 76.813333 72.813333 111.333334s74.073333 60.386667 111.333333 72.813333c16.213333 5.406667 31.42 8.08 45.26 8.08 22.233333 0 40.946667-6.913333 54.586667-20.553333l37.706667-37.713334a10.666667 10.666667 0 0 1 15.086666 0l165.933334 165.933334a10.666667 10.666667 0 0 1 0.013333 15.1zM576 234.666667a21.333333 21.333333 0 0 1 21.333333-21.333334 213.333333 213.333333 0 0 1 213.333334 213.333334 21.333333 21.333333 0 0 1-42.666667 0c0-94.106667-76.56-170.666667-170.666667-170.666667a21.333333 21.333333 0 0 1-21.333333-21.333333z m0 128a21.333333 21.333333 0 0 1 21.333333-21.333334 85.426667 85.426667 0 0 1 85.333334 85.333334 21.333333 21.333333 0 0 1-42.666667 0 42.713333 42.713333 0 0 0-42.666667-42.666667 21.333333 21.333333 0 0 1-21.333333-21.333333z m362.666667 64a21.333333 21.333333 0 0 1-42.666667 0c0-164.666667-134-298.666667-298.666667-298.666667a21.333333 21.333333 0 0 1 0-42.666667 341.073333 341.073333 0 0 1 341.333334 341.333334z" fill="#2c2c2c" p-id="4520"></path></svg><p>电话</p></i></a></li> <li><a class="opwx"><i><svg t="1638438138558" class="icon" viewBox="0 0 1025 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10851" width="48" height="48"><path d="M498.816 345.056c26.336 0 43.936-17.632 43.936-43.904 0-26.56-17.568-43.744-43.936-43.744s-52.832 17.184-52.832 43.744C446.016 327.424 472.48 345.056 498.816 345.056zM253.088 257.408c-26.336 0-52.96 17.184-52.96 43.744 0 26.272 26.624 43.904 52.96 43.904 26.24 0 43.808-17.632 43.808-43.904C296.864 274.592 279.328 257.408 253.088 257.408zM1024 626.112c0-138.88-128.832-257.216-286.976-269.536 0.224-1.728 0.32-3.52-0.064-5.312-31.712-147.84-190.688-259.296-369.824-259.296C164.704 91.968 0 233.12 0 406.624c0 93.088 47.52 176.96 137.568 243.104l-31.392 94.368c-2.016 6.144-0.192 12.896 4.704 17.152 2.976 2.56 6.72 3.904 10.496 3.904 2.432 0 4.896-0.576 7.168-1.696L246.4 704.48l14.528 2.944c36.288 7.456 67.616 13.92 106.208 13.92 11.36 0 22.88-0.512 34.176-1.472 4.576-0.384 8.448-2.688 11.072-6.016 42.496 106.336 159.616 183.104 297.44 183.104 35.296 0 71.04-8.512 103.104-16.544l90.848 49.664c2.4 1.312 5.056 1.984 7.68 1.984 3.584 0 7.168-1.216 10.048-3.552 5.056-4.096 7.136-10.848 5.248-17.024l-23.2-77.152C981.344 772.864 1024 699.328 1024 626.112zM398.592 687.968c-10.4 0.896-20.96 1.344-31.424 1.344-35.328 0-65.216-6.112-99.776-13.248L247.296 672c-3.456-0.736-7.104-0.256-10.272 1.376l-88.288 44.192 22.944-68.928c2.24-6.752-0.224-14.112-6.016-18.176C76.96 568.64 32 493.312 32 406.624c0-155.84 150.336-282.656 335.136-282.656 163.36 0 308 99.392 337.856 231.584-171.296 2.24-309.888 122.656-309.888 270.56 0 21.504 3.264 42.336 8.768 62.432C402.208 688.128 400.448 687.808 398.592 687.968zM875.456 815.552c-5.344 4.032-7.616 10.976-5.696 17.376l15.136 50.336-62.112-33.984c-2.368-1.312-5.024-1.984-7.68-1.984-1.312 0-2.624 0.16-3.904 0.512-33.312 8.416-67.776 17.088-101.344 17.088-155.904 0-282.72-107.136-282.72-238.816 0-131.68 126.816-238.784 282.72-238.784 152.928 0 282.144 109.344 282.144 238.784C992 691.744 950.624 759.04 875.456 815.552zM612.992 511.968c-17.568 0-35.136 17.696-35.136 35.232 0 17.664 17.568 35.104 35.136 35.104 26.4 0 43.84-17.44 43.84-35.104C656.832 529.632 639.392 511.968 612.992 511.968zM806.016 511.968c-17.312 0-34.88 17.696-34.88 35.232 0 17.664 17.568 35.104 34.88 35.104 26.304 0 44.064-17.44 44.064-35.104C850.08 529.632 832.352 511.968 806.016 511.968z" p-id="10852" fill="#2c2c2c"></path></svg><p>微信</p></i></a></li> <li data-href="/about/"><a><i><svg t="1638438056011" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9170" width="48" height="48"><path d="M896 405.333333v128c0 34.133333-29.866667 64-64 64S768 567.466667 768 533.333333v-128c0-17.066667 8.533333-34.133333 17.066667-42.666666C733.866667 251.733333 640 170.666667 516.266667 170.666667H512c-128 0-221.866667 81.066667-273.066667 192 8.533333 8.533333 17.066667 25.6 17.066667 42.666666v128c0 34.133333-29.866667 64-64 64S128 567.466667 128 533.333333v-128C128 371.2 157.866667 341.333333 192 341.333333h4.266667c51.2-123.733333 174.933333-213.333333 315.733333-213.333333s264.533333 89.6 315.733333 213.333333h4.266667c34.133333 0 64 29.866667 64 64zM896 896H128c0-98.133333 170.666667-213.333333 384-213.333333s384 115.2 384 213.333333z m-59.733333-42.666667c-42.666667-59.733333-170.666667-128-324.266667-128s-281.6 68.266667-324.266667 128h648.533334zM512 682.666667c-119.466667 0-213.333333-93.866667-213.333333-213.333334s93.866667-213.333333 213.333333-213.333333 213.333333 93.866667 213.333333 213.333333-93.866667 213.333333-213.333333 213.333334z m170.666667-213.333334c0-93.866667-76.8-170.666667-170.666667-170.666666s-170.666667 76.8-170.666667 170.666666 76.8 170.666667 170.666667 170.666667 170.666667-76.8 170.666667-170.666667z" fill="#2c2c2c" p-id="9171"></path></svg><p>联系</p></i></a></li> </ul> <div class="fbrbg"><img src="/Public/Home/img/fbarbg.png"></div> </div> </body> </html> <script src="/Public/Home/js/jquery.min.js"></script> <script src="/Public/Home/js/wow.min.js"></script> <script src="/Public/Home/js/common.js"></script> <script> $(".ny_con img").each(function(){ var src = $(this).attr("src"); //获取图片地址 var str=new RegExp("http"); var result=str.test(src); if(result==false){ var url = "https://www.cdcxhl.com"+src; //绝对路径 $(this).attr("src",url); } }); </script>