自定义广播模式

在android程序中通过注册广播接收者,当系统中发出相应广播后,如果程序中注册了相应的广播接收者,那么就可以进行相应的后续处理操作,例如当系统接收到短信之后,如果注册了与之对应的广播接收者,应用程序就可以接收到这个广播,并进行相应处理,例如保存短信到云上
其实javascript端通过事件同样可以实现这样的功能,简单来说,当我们点击一个绑定了点击事件的按钮之后,就会触发这个按钮的点击事件,进行相应的处理
通过jQuery可以方便的实现自定义事件的事件绑定与触发,进行简单的封装就可以实现简单的类似广播功能

示例Html代码

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>测试自定义广播机制</title>
    <script type="text/javascript" src="./js/jquery.min.js"></script>
    <script type="text/javascript" src="./js/modules.js"></script>
    <script type="text/javascript" src="./js/test1.js"></script>
    <style type="text/css">
        .test-list{
            max-width: 400px;
        }
        .test-list li{
            padding:10px;
            list-style: none;
            border: solid 1px red;
        }
    </style>
</head>
<body>
    <div class="test-list">
        <ul>
            <li conversationId=1 data-target="conversation">你好</li>
            <li conversationId=2 data-target="conversation">你好</li>
            <li conversationId=3 data-target="conversation">你好</li>
            <li conversationId=4 data-target="conversation">你好</li>
        </ul>
    </div>
</body>
</html>

javascript代码

modules.js

function BroadCastReceiver(selector){
    var that=this;
    this.registerReceiver=function(action,callback){
        $(document).on(action,selector,callback);
    }
    this.unregisterReceiver=function(action){
        $(document).off(action,selector);
    }
}

function BroadCaster(selector){
    var that=this;
    this.sendBroadCast=function(intent){
        if(!intent instanceof Intent){
            throw new Error("not Intent instanceof object");
        }
        var action=intent.getAction();
        var data=intent.getExtras();
        var filter=intent.getFilter();
        var _targetSelector=(selector!==filter && filter)?
            filter:selector;
        $(_targetSelector).trigger(action,data);
        return that;
    }
}

function Intent(){
    var that=this;
    var _action=null;
    var _filter=null;
    var _data={};
    this.setAction=function(action){
        _action=action;
        return that;
    }
    this.getAction=function(){
        return _action;
    }
    this.setFilter=function(filter){
        _filter=filter;
        return that;
    }
    this.getFilter=function(){
        return _filter;
    }
    this.putExtra=function(name,value){
        _data[name]=value;
        return that;
    }
    this.getExtras=function(){
        return _data;
    }
}

function Shelf(selector,options){
    var that=this;
    var _selector=options.hasOwnProperty("itemSelector")?
        options.itemSelector:null;
    BroadCastReceiver.apply(this,[_selector])
    BroadCaster.apply(this,[_selector]);
}

(function($){
    $.fn.shelf=function(options){
        var DEFAULT={},
            _config=$.extend({},DEFAULT,options),
            _selector=$(this)._selector;
        var _shelf=new Shelf(_selector,_config);
        console.log(_shelf);
        return _shelf;
    }   
})(jQuery);

test1.js

var shelf=$(".test-list").shelf({
    "itemSelector":"[data-target='conversation']"
})
shelf.registerReceiver("attribute-update",function(event,attrs){
    var conversationId=attrs.conversationId;
    $('[conversationId="'+conversationId+'"]').attr({
        "style":"background:red"
    });
})

$(document).on("click","[data-target='conversation']",function(){
    var conversationId=$(this).attr("conversationId");
    var intent=new Intent();
    intent.setAction("attribute-update").putExtra("conversationId",conversationId)
        .setFilter("[conversationId='"+conversationId+"']");
    console.log(intent);
    shelf.sendBroadCast(intent);
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值