javascript之外观模式 -- 2022-11-20

/**
 * 概念:外观模式
 * 为一组复杂的子系统接口提供一个更高级的统一接口
 * 通过这个接口使得子系统接口的访问更容易。在Javascrip中有时也会用于对底层结构兼容性做统一封装来简化用户使用
 */

// 案例---使用外观封装一个点击事件,使其兼容IE浏览器和常用的浏览器,即兼容性封装
// 外观模式实现
function addEvent(dom, tyoe, fn) {
    // 对于支持DOM2级事件处理程序addEventListener 方法的浏览器
    if(dom.addEventListener) {
        dom.addEventListener(type, fn, false);
        // 对于不支持addEventListener方法但支持attachEvent 方法的浏览器
    } else if(dom.attachEvent) {
        dom.attachEvent('on' + type , fn);
        // 对于不支持addEventListener 方法也不支持attachEvent方法,但支持on + '事件名'的浏览器
    }else {
        dom['on' + type] = fn;
    }
}

// 通过上面的放我对于支持addEventListener 或者 attachEvent 方法的浏览器就可以放心地绑定多个事件了
// 用例
var myInput = document.getElementById('myinput')
addEvent(myInput, 'click', function() {
    console.log('绑定第一个事件')
})
addEvent(myInput, 'click', function() {
    console.log('绑定第二个事件')
})
addEvent(myInput, 'click', function() {
    console.log('绑定第三个事件')
})

// 使用外观模式解决IE 低版本浏览器不兼容e.preventDefault() 和 e.target 
// 获取事件对象
var getEvent = function(event) {
    // 标准浏览器返回event ,IE下 window.event
    return event || window.event;
}
// 获取元素
var getTarget = function (event) {
    var event = getEvent(event);
    // 标准浏览器下 event.target , IE 下event.scrElement 
    return event.target || event.srcElement;
} 

// 阻止默认行为
var preventDefault = function(event) {
    var event = getEvent(event);
    // 标准浏览器
    if(event.preventDefault) {
        event.preventDefault();
        // IE浏览器
    }else {
        event.returnValue = false
    }
}
// 用例
document.onclick = function (e) {
    // 阻止默认行为
    preventDefault(e);
    // 获取事件源目标对象
    if(getTarget(e) !== document.getElementById('myinput')) {
        // 
    }
}


// 简单实现获取元素的属性样式的简单方法库
var B = {
    // 通过ID获取元素
    g: function(id) {
        return document.getElementById(id);
    },
    // 设置元素css 属性
    css: function(id, key, value) {
        document.getElementById(id).style[key] = value;
    },
    // 设置元素的属性
    attr: function(id, key, value) {
        document.getElementById(id)[key] = value;
    },
    html: function(id, html){
        document.getElementById(id).innerHTML = html;
    },
    // 为元素绑定事件
    on: function(id, type, fn) {
        document.getElementById(id)['on' + type] = fn;
    }
}

// 上面封装了操作元素属性样式的代码库
// 用例如下
B.css('box', 'background', 'red'); // 设置css样式
B.attr('box', 'className', 'box') // 设置class 
B.html('box', '这是新添加的内容') // 设置内容
B.on('box', 'click', function() {
    B.css('box', 'width', '500px')
})


/**
 * 总结:
 * 外观模式是对接口方法的外层包装,以供上层代码调用
 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于ag-grid-vue,要实现单击编辑功能,您可以按照以下步骤进行操作: 1. 首先,确保您已经正确安装了ag-grid-vue和其相关的依赖。 2. 在您的Vue组件中,引入ag-grid-vue并初始化一个gridOptions对象,用于配置ag-grid的行为和外观: ```javascript import { AgGridVue } from 'ag-grid-vue'; export default { components: { AgGridVue }, data() { return { gridOptions: null, // 初始化gridOptions rowData: [], // 表格数据 columnDefs: [ // 列定义 { headerName: 'ID', field: 'id', editable: false }, { headerName: '名称', field: 'name', editable: true }, { headerName: '价格', field: 'price', editable: true } ] }; }, methods: { onGridReady(params) { this.gridOptions = params.api; this.gridOptions.sizeColumnsToFit(); // 根据容器自动调整列宽 }, onCellClicked(params) { if (params.column.colDef.editable) { this.gridOptions.startEditingCell({ rowIndex: params.rowIndex, colKey: params.column.colId }); } } } }; ``` 3. 在模板中使用`ag-grid-vue`组件,并绑定相应的数据和事件: ```html <template> <div style="height: 300px" class="ag-theme-alpine"> <ag-grid-vue :gridOptions="gridOptions" :rowData="rowData" :columnDefs="columnDefs" @gridReady="onGridReady" @cellClicked="onCellClicked" ></ag-grid-vue> </div> </template> ``` 在上述代码中,我们通过`onCellClicked`方法来处理单元格单击事件,并检查该列是否可编辑。如果是可编辑列,则调用`startEditingCell`方法来启动编辑模式。 请根据您的具体需求进行适当调整和扩展,希望对您有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值