表格行添加双击事件

需求:  文件管理功能, 类似与windows 的文件及文件夹操作

如下图:

 

双击是实现:

  1、主要依靠 mounted() 中 this.$nextTick, 渲染后挂载事件

  2、其中 addEventListener('dblclick', function () {}) 为主要功能实现

 

 

前端vue代码:

<template>
    <div class="log_manage">
        <div class="head">
            <div class="step">
                <span><i class="step-i el-icon-back" title="上一层" @click="onStep"></i></span>
                <span><i class="step-i el-icon-right" title="下一层" @click="underStep"></i></span>
            </div>
            <div class="path path_display" v-if="is_path" tabindex="-1" @focus="focus_path">
                <i slot="prefix" class="el-input__icon el-icon-folder-opened"
                   style="color: #ff9b11; font-size: 22px; margin: 0 5px"></i>
                <span v-for="(value, index) in display_path" :key="index">
                    <i class="el-icon-arrow-right"></i>
                    {{ value }}
                </span>
            </div>
            <el-input class="path path-input" v-model="log_path" placeholder="请输入内容" v-else
                      tabindex="-1" @blur="blur_path" ref="input" @keyup.enter.native="onSubmit">
                <i slot="prefix" class="el-input__icon el-icon-folder-opened"
                   style="color: #ff9b11; font-size: 22px; margin: 0 5px"></i>
            </el-input>
            <div class="refresh">
                <el-button icon="el-icon-refresh" @click="refresh_content" title="刷新"></el-button>
            </div>
            <div class="search-box">
                <el-input v-model="search_path" placeholder="请输入内容">
                    <i slot="prefix" class="el-input__icon el-icon-search" style="padding-left: 6px"></i>
                </el-input>
            </div>
            <div class="search">
                <el-button @click="execute_search">搜索</el-button>
            </div>
        </div>
        <div class="content-box">
            <el-table
                    :data="dir_list"
                    :default-sort="{prop: 'type', order: 'ascending'}"
                    style="width: 100%">
                <el-table-column
                        prop="name"
                        label="名称"
                        sortable
                        width="260">
                    <template slot-scope="scope">
                        <span v-if="scope.row.type === '文件夹'">
                            <i class="el-icon-folder" style="color: #ff9b11;"></i>
                            {{ scope.row.name }}
                        </span>
                        <span v-else>
                            <i class="el-icon-tickets"></i>
                            {{ scope.row.name }}
                        </span>
                    </template>
                </el-table-column>
                <el-table-column
                        prop="time"
                        sortable
                        label="修改日期"
                        width="220">
                </el-table-column>
                <el-table-column
                        class="file-type"
                        prop="type"
                        sortable
                        label="类型"
                        width="200">
                </el-table-column>
                <el-table-column
                        prop="size"
                        label="大小"
                        width="460">
                </el-table-column>
                <el-table-column fixed="right" label="操作" width="200">
                    <template slot-scope="scope">
                        <el-button @click="my_modify(scope.row)" type="text" size="small">修改</el-button>
                        <el-button @click="my_delete(scope.row)" type="text" size="small">删除</el-button>
                    </template>
                </el-table-column>
            </el-table>
        </div>
    </div>
</template>

 

js:

<script>
    import {check, open_file} from "@/js/log_manage"

    export default {
        name: "LogManage",
        mounted() {
            this.$nextTick(() => {
                setTimeout(this.bindEvent, 500)
            })
        },
        data() {
            return {
                dir_list: [
                    {'name': 'file1', 'time': '2002/10/22', 'type': '文本文档', 'size': '100k'},
                    {'name': 'file2', 'time': '2002/11/23', 'type': '文本文档', 'size': '100M'},
                    {'name': 'file3', 'time': '2002/9/24', 'type': '文本文档', 'size': '10M'},
                    {'name': 'file4', 'time': '2002/8/25', 'type': '文本文档', 'size': '1k'},
                    {'name': 'log', 'time': '2002/8/25', 'type': '文件夹', 'size': ''},
                    {'name': 'case', 'time': '2002/9/24', 'type': '文件夹', 'size': ''},
                    {'name': 'var', 'time': '2002/10/22', 'type': '文件夹', 'size': ''},
                ],
                // 路径相关
                is_path: true,
                // 初始路径
                base_path: 'logs',
                // 当前路径
                log_path: 'logs/sdfd/fdfd',
                // 搜索路径
                search_path: '',
                // 显示路径
                display_path: ['logs', '123'],
                // 前进一步
                history_path: 'logs/sdfd/fdfd',
                dir_name: '',
            }
        },
        methods: {
            // 路径显示
            focus_path() {
                this.is_path = false;
                this.$nextTick(() => {
                    this.$refs.input.focus()
                })
            },
            blur_path() {
                this.is_path = true;
                this.log_path = this.base_path
            },
            // enter 跳转
            onSubmit() {
                console.log(this.log_path)
            },
            // 刷新
            refresh_content() {
                console.log(this.log_path)
            },
            // 执行搜索
            execute_search() {
                console.log(this.search_path)
            },
            // 上一步
            onStep() {
                if (this.log_path === this.base_path) {
                    return
                }
                let path = this.log_path.split('/');
                path.pop(-1);
                this.log_path = path.join('/');
                console.log(this.log_path);
            },
            // 下一步
            underStep() {
                if (this.log_path === this.history_path) {
                    return
                }
                let path_list = this.history_path.split('/');
                let path = this.log_path.split('/');
                for (let i = 0; i < path_list.length; i++) {
                    if (path_list[i] === path[path.length - 1]) {
                        let under_path = path_list[i + 1];
                        path.push(under_path);
                        this.log_path = path.join('/');
                        break
                    }
                }
                console.log(this.log_path)
            },
            dir_open(name) {
                console.log(name);
                let path = this.log_path + '/' + name;
                check(path)
            },
            file_open(name) {
                console.log(name);
                let path = this.log_path + '/' + name;
                open_file(path)
            },
            // 绑定
            bindEvent() {
                // 双击打开
                let item = document.querySelectorAll('tr.el-table__row');
                for (let i = 0; i < item.length; i++) {
                    let td = item[i].childNodes;
                    if (td[2].childNodes[0].textContent === '文件夹') {
                        let dir_open_event = this.dir_open;
                        item[i].addEventListener('dblclick', function () {
                            dir_open_event(td[0].childNodes[0].textContent.trim())
                        });
                        // item[i].style.background  = 'red'

                    } else {
                        let file_open_event = this.file_open;
                        item[i].addEventListener('dblclick', function () {
                            file_open_event(td[0].childNodes[0].textContent.trim())
                        });
                    }
                }
            },
        }

    }
</script>

css:

<style scoped>
    .head {
        /*line-height: 60px;*/
        height: 40px;
    }

    /* 顶部栏 */
    .step {
        float: left;
        width: 80px;
    }

    .step > span {
        line-height: 40px;
        text-align: center;
    }

    .step-i {
        width: 40px;
        font-size: 20px;
        color: #7e8188;
    }

    .step-i:hover {
        color: #0978e7c2;
    }

    .path {
        width: 55%;
        float: left;
        line-height: 40px;
    }

    .path_display {
        background-color: #FFF;
        background-image: none;
        border: 1px solid #DCDFE6;
        box-sizing: border-box;
        color: #606266;
        display: inline-block;
        font-size: 14px;
        height: 40px;
        padding: 0 15px 0 4px;
        transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
    }

    /deep/ .el-input__inner {
        padding-left: 45px;
        border-radius: 0 !important;
    }

    .refresh {
        text-align: center;
        float: left;
        border-radius: 0;
    }

    .refresh > .el-button {
        text-align: center;
        padding: 0;
        width: 40px;
        line-height: 38px;
        font-size: 18px;
        color: #999b9d;
        border: 1px solid #DCDFE6;
        border-radius: 0
    }

    .refresh > .el-button:hover {
        color: #0978e7c2;
    }

    .search-box {
        width: calc(100% - 55% - 180px);
        float: left;
    }

    .search {
        float: left;
        border-radius: 0;
        border: 0;
    }

    .search > .el-button {
        text-align: center;
        padding: 0;
        width: 60px;
        line-height: 38px;
        border: 1px solid #DCDFE6;
        border-radius: 0
    }

    /* 内容 */
    .content-box {
        background-color: pink;
        height: 600px;
    }
    /deep/.el-table__row:hover {
        background-color: pink;
    }
</style>

import js: 可根据情况自行设定

import axios from "@/js/my_axios";


function check(path) {
    console.log(path);
    let data = {
        'path': path
    };

    return axios({
        method: 'get',
        url: 'log_manage',
        params: data,
    }).then((response) => {
        console.log(response.data)
    }).catch((error) => {
        console.log(error);
    });
}

function open_file(path) {
    console.log(path);
    let data = {
        'path': path
    };

    return axios({
        method: 'post',
        url: 'log_manage',
        data: data,
    }).then((response) => {
        console.log(response.data)
    }).catch((error) => {
        console.log(error);
    });
}


function delete_file(path) {
    console.log(path);
    let data = {
        'path': path
    };

    return axios({
        method: 'delete',
        url: 'log_manage',
        data: data,
    }).then((response) => {
        console.log(response.data)
    }).catch((error) => {
        console.log(error);
    });
}


export {
    check,
    open_file,
    delete_file,
}

 

posted @ 2022-05-08 13:35  萤huo虫  阅读(559)  评论(0编辑  收藏  举报