非常简单的事件驱动 jQuery 插件设计模式

Posted

技术标签:

【中文标题】非常简单的事件驱动 jQuery 插件设计模式【英文标题】:Very simple event driven jQuery plugin design pattern 【发布时间】:2018-09-01 00:16:59 【问题描述】:

有时我有多个元素需要 click 回调函数和一些通用功能,并已实现如下:

function deleteRecord(elem, url, type) 
    if (confirm("Are you sure you wish to delete this "+type+"?")) 
        $.ajax(
            type:'DELETE',
            url: url,
            dataType: 'json',
            success: function (rsp)
                $(elem).closest('tr').remove();
            ,
            error: function (xhr) 
                alert('Error: '+xhr.responseJSON.message);
            
        );
    


$("#manual-list img.delete").click(function()  deleteRecord(this, '/1.0/manuals/'+$(this).closest('tr').data('id'),'manual'));

我一直在尝试创建一个非常简单的插件,而不是使用函数。 我已经成功地创建了https://learn.jquery.com/plugins/advanced-plugin-concepts/ 所描述的灵活的 jQuery 插件,但是,我认为对这些类型的应用程序这样做是矫枉过正的,并且希望使用一个死插件设计模式。我最近的尝试如下,但是,我没有成功地将url 参数传递给它,该参数是由应用插件的元素派生的。

一个非常简单简洁的 jQuery 事件驱动插件有哪些可用选项?

(function( $ )
    $.fn.deleteRecord = function(url, type) 
        console.log('init', url, type, this, url.call(this, url, type));
        this.click(function()
            //Confirm that this.each(function()...) is not required
            console.log('onClick', url, type, this, url.call(this, url, type))
            if (confirm("Are you sure you wish to delete this "+type+"?")) 
                console.log('onConfirm', url, type, this, url.call(this, url, type))
                var e=this;
                $.ajax(
                    type:'DELETE',
                    url: url.call(this, url, type),
                    dataType: 'json',
                    success: function (rsp)
                        $(e).closest('tr').remove();
                    ,
                    error: function (xhr) 
                        alert('Error: '+xhr.responseJSON.message);
                    
                );
            
        )
        return this;
    ;
)( jQuery );


$("#manual-list img.delete").deleteRecord(function()'/1.0/manuals/'+$(this).closest('tr').data('id'),'manual');

【问题讨论】:

【参考方案1】:

你忘记了返回语句:

function()'/1.0/manuals/'+$(this).closest('tr').data('id')

改成:

function()return '/1.0/manuals/'+$(this).closest('tr').data('id');

(function ($) 
    $.fn.deleteRecord = function (url, type) 
        console.log('init', url, type, url.call(this, url, type));
        console.log('----')
        this.click(function () 
            //Confirm that this.each(function()...) is not required
            console.log('onClick', url, type, this, url.call(this, url, type))
            if (confirm("Are you sure you wish to delete this " + type + "?")) 
                console.log('onConfirm', url, type, this, url.call(this, url, type))
                var e = this;
                $.ajax(
                    type: 'DELETE',
                    url: url.call(this, url, type),
                    dataType: 'json',
                    success: function (rsp) 
                        $(e).closest('tr').remove();
                    ,
                    error: function (xhr) 
                        alert('Error: ' + xhr.responseJSON.message);
                    
                );
            
        )
        return this;
    ;
)(jQuery);


            $("#manual-list img.delete").deleteRecord(function()return '/1.0/manuals/'+$(this).closest('tr').data('id');,'manual');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<table id="manual-list">
    <tr data-id="1">
        <td>
            <img class="delete" src="https://dummyimage.com/200x200/000/fff&text=1">
        </td>
    </tr>
</table>

【讨论】:

乌格!有时,一个人会因为看同一件事太久而失明。除此之外,我的方法看起来还好吗?有更好的方法吗?谢谢! @user1032531 是的,看起来没问题。

以上是关于非常简单的事件驱动 jQuery 插件设计模式的主要内容,如果未能解决你的问题,请参考以下文章

12.手机端如何拖动组件--WEB设计器JQUERY插件讲解(含源码)

领域驱动设计系列贫血模型和充血模型

jQuery.touchswipe插件

jQuery.NiceScroll简单的API

jQuery 基础学习笔记总结

div拖拽缩放jquery插件编写——带8个控制点