将一段JS代码封装成一个方法

}).mouseout(function(){
    $("#plate-3hover").removeClass("plate-3after")
});

$("#plate-4").mouseenter(function() {
    $("#plate-4hover").addClass("plate-4after")
}).mouseout(function(){
    $("#plate-4hover").removeClass("plate-4after")
});

$("#plate-5").mouseenter(function() {
    $("#plate-5hover").addClass("plate-5after")
}).mouseout(function(){
    $("#plate-5hover").removeClass("plate-5after")
});

$("#plate-6").mouseenter(function() {
    $("#plate-6hover").addClass("plate-6after")
}).mouseout(function(){
    $("#plate-6hover").removeClass("plate-6after")
});

$("#plate-7").mouseenter(function() {
    $("#plate-7hover").addClass("plate-7after")
}).mouseout(function(){
    $("#plate-7hover").removeClass("plate-7after")
});

如上面所示,小弟想将上面的JS代码封装成一个JS方法。但是没有思路,不知道该怎么下手,请大神们指点一下。能有范例最好。

注:这段JS代码是一段特效代码,效果是鼠标移入移出的动画效果。原理是移除dom上的class样式

10个回答



鉴于楼主欠缺编程经验,我就先不说封装成jQuery插件等高大上的做法了。单就论封装成方法而言。

方法,也就是函数。是面向过程式语言一种代码复用的初级手段,简而言之,就是把重复的部分用函数封装起来。

例如猫叫多遍,cat.meow(), 你总不可能写对应次数的代码,一般会写成:

function meow(num){
    for(var i=0;i<num;i++){
        cat.meow()
    }
}

meow(1000)

这就是一种最基础的代码复用。
当然,面向对象的语言也许有更简单的 cat.meow(1000)

那么,针对楼主的情况。逐步讲一下各层次的方法。最简单的用函数封装一下就是:

function effect(srcDom,destDom,className){
    $(srcDom).mouseenter(function(){
        $(destDom).addClass(className)
    }).mouseout(function(){
        $(destDom).removeClass(className)
    })
}

然后调用

effect('#plate-1','#plate-1hover','plate-1after')
effect('#plate-2','#plate-2hover','plate-2after')
effect('#plate-3','#plate-3hover','plate-3after')

鉴于楼主的DOM的ID和Class命名比较有规律,可以写成这样

function effect(name){
    $('#'+name).mouseenter(function(){
        $('#'+name+'hover').addClass(name+'after')
    }).mouseout(function(){
        $('#'+name+'hover').removeClass(name+'after')
    })
}

然后调用

effect('plate-1')
effect('plate-2')
effect('plate-3')

但是这样还是不够通用,楼主应该看看事件方面有关事件委托的知识

事件委托

事件委托要结合具体的DOM结构来看。假设有这样的一个结构:

<div class="wrap">
    <div class="box1">
        <span class="trigger">trigger</span>
        <div class="effect"></div>
    </div>
    <div class="box2">
        <span class="trigger">trigger</span>
        <div class="effect"></div>
    </div>
    <div class="box3">
        <span class="trigger">trigger</span>
        <div class="effect"></div>
    </div>
</div>
function effect(node){
    $(node).on('mouseenter','.trigger',function(){
        var $this=$(this);
        $this.parent().find('.effect').addClass('after')
    })
    $(node).on('mouseout','.trigger',function(){
        var $this=$(this);
        $this.parent().find('.effect').removeClass('after')
    })
}

这样,调用时就只需要调用一次。

effect('.wrap')

当然,这里假设是每组控件的效果都相似,如果不同,有两种解决方案:1.利用box父级class从样式层面解决。2.js层面多加一个配置项参数




按你的思路可以这样写:

function addEvent(selector,n){
    for (var i=1;i<=n;i++){
        (function(){
                $(selector +"-"+i).mouseenter(function() {
                    $(selector +"-"+i+"hover").addClass(selector +"-"+i+"after")
                }).mouseout(function(){
                    $(selector +"-"+i+"hover").removeClass(selector +"-"+i+"after")
                });
            }
        })(i);        
}

addEvent('#plate',7);

思路是循环所有要绑定事件的元素,为他们添加相应的事件。注意这里使用了在每次循环中使用了闭包以确保i的指向正确。
但是不建议这样做,因为如果plate元素比较多的话将会绑定很多事件。

建议通过事件代理的方式:

$(document).on('mouseover',function(e){
    if ($(e.target).hasClass('plate')){
        //为鼠标移入的plate添加class
        //例如:$("#plate-"+$(e.target).index()+"hover").addClass("#plate-"+$(e.target).index()+"after")
    }
});
$(document).on('mouseout',function(e){
    if ($(e.target).removeClass('plate')){
        //为鼠标移出的plate移除class
    }
});

这种方式只需要绑定两个事件处理函数。
触发时判断鼠标是否移入了目标块(因为不知道你的dom结构,所以这里没有详细写。建议为他们加上统一的class方便判断)。当然此处事件应该绑定到plate元素的父元素上面而不是document,以减少不必要事件的触发
然后通过$(e.target)可以选取到触发的dom,然后加上相应的class。

这里要注意mouseenter和mouseover,mouseleave和mouseout的区别。




建议把dom一起贴出来








提供思路:

for (var i = 1; i <= 6; i++) {
    (function(j) {
        $("#plate-" + j).mouseenter(function() {
            $("#plate-" + j + "hover").addClass("#plate-" + j + "after")
        }).mouseout(function() {
            $("#plate-" + j + "hover").removeClass("#plate-" + j + "after")
        });
    })(i)
}

封装程度浅(面向过程):

function f( ele ) {
    //第一个是要操作的dom元素
    
    $(ele).mouseenter(function() {
        $(ele+"hover").addClass(ele+"after")
    }).mouseout(function(){
        $(ele+"hover").removeClass(ele+"after")
    });
}
//然后用循环进行绑定事件

封装程度深(面向对象):

function Binde( ele, length ) {
    this.f = function( ele ) {
        $(ele).mouseenter(function() {
            $(ele+"hover").addClass(ele+"after")
        }).mouseout(function(){
            $(ele+"hover").removeClass(ele+"after")
        });
    };
    
    for( var i = 0; i < length; i ++ ) {
        this.f( ele + i );
    }
}

$("selector[id|='plate']").mouseenter(function(){

  $("#"+$(this).attr("id")+"hover").addClass("")
}).mouseout(function(){
  $("#"+$(this).attr('id')+"hover").removeClass("")
})

selector是你标签名,我不知你的标签
不封装也是可以解决的。。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想将这段代码封装一个方法,可以将它定义在一个合适的类中,并根据需要添加参数和返回类型。以下是一个简单的示例: ```java import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class StateCodeEvaluator { public static int evaluate(String condition, AutoChangeStateInfo autoChangeStateInfo) { try { ScriptEngine engine = new ScriptEngineManager().getEngineByName("js"); engine.put("OldState", autoChangeStateInfo.OldState); engine.put("Speed", autoChangeStateInfo.Speed); engine.put("LocalAddressDistance", autoChangeStateInfo.LocalAddressDistance); engine.put("SendAddressDistance", autoChangeStateInfo.SendAddressDistance); engine.put("StationDistance", autoChangeStateInfo.StationDistance); engine.put("StateDuration", autoChangeStateInfo.StateDuration); double result = (double) engine.eval(condition); return (int) result; } catch (ScriptException e) { System.err.println("解析自动改状态表达式异常:" + e.getMessage()); return -1; } } } ``` 在上述示例中,我们创建了一个名为 `StateCodeEvaluator` 的类,并在其中定义了一个名为 `evaluate` 的静态方法。这个方法接受一个表示条件的字符串 `condition` 和一个 `AutoChangeStateInfo` 对象,并返回一个整数值。 在方法内部,我们使用与之前相同的逻辑来执行 JavaScript 表达式并返回结果。如果出现异常,我们将在控制台打印错误信息并返回 `-1`。 你可以根据你的需求和项目结构来调整这个示例代码,并使用合适的异常处理和日志记录方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值