让 select 的 option 标签支持事件监听(如复制操作)

这标题,让option支持事件监听,应该不难的呀,有什么好讲的?

其实还是有的,默认在浏览器代码是无法直接对option标签进行操作的,不仅包括JS事件监听,还是CSS样式设置

查了一些资料,姑且认为它是系统OS级别处理的

想自定义option的样式,很多人会建议用 <ul> <li> 标签来辅助同步操作与值

想对option进行事件监听,有一个tip:当给select显示设置了size 属性且值 大于1 时,才能监听

近来产品也提了个鼠标操作复制option值的需求,就利用这个size属性实现一番吧

先看图

实现小析

因为select的size属性表示默认展示多少个option,并设置这个高度

不过有了size之后,默认select右侧就会出现滚动条式样,加个 overflow:hidden 处理就行了

此外,功能操作与原select也有一些些不同,也要模拟处理

右键后生成一个复制按钮,点击复制则调用浏览器自身的复制命令

HTML

    <p>
        <input type="text" id="select-val" placeholder="值" size="1">
        <input type="text" id="copy-test" placeholder="测试复制">
    </p>

    <select style="overflow:hidden;">
        <option value="1">one</option>
        <option value="2">two</option>
        <option value="3">three</option>
        <option value="4">four</option>
        <option value="5">five</option>
    </select>

复制按钮的模板

要注意一个点,id为myCopyVal放在此处是为了方便定位元素,再调用文本select()方法,调用此方法时要求dom元素不能隐藏

所以需用 opacity:0 代替 type="hidden" | display:none | visibility:hidden

    <script type="text/template" id="btn-tpl">
        <p id="myCopy" style="position:fixed;z-index:1000;top:{{Y}}px;left:{{X}}px;margin:0;">
            <input type="button" id="myCopyBtn" style="border:1px solid #999;border-radius:3px;cursor:pointer;" value="复制"/>
            <input type="text" id="myCopyVal" style="opacity:0" value="{{val}}"/>
        </p>
    </script>

JS部分

    <script type="text/javascript" src="jquery.min.js"></script>
    <script type="text/javascript">
        // 模拟size的变化
        $(‘select‘)
            .focus(function() {
                // 动态设置size支持option的事件监听
                this.size = this.children.length;
            })
            .blur(function() {
                // 恢复
                this.size = 1;
            })
            .change(function() {
                // 上下快捷键操作时,隐藏按钮
                $(‘#myCopy‘).remove();
                $(‘#select-val‘).val(this.value);
            });

        $(‘option‘)
            // 右键展示复制按钮
            .contextmenu(function(e) {
                $(‘#myCopy‘).remove();

                $(‘body‘).append($(‘#btn-tpl‘).html()
                    // 设置按钮位置
                    .replace(‘{{Y}}‘, e.pageY)
                    .replace(‘{{X}}‘, e.pageX + 10)
                    .replace(‘{{val}}‘, e.target.textContent || e.target.innerText)
                );

                return false;
            })
            // 点击操作恢复正常select
            .click(function() {
                $(‘#myCopy‘).remove();
                $(this).parent().blur();
            });

        $(document)
            // 直接Enter键 模拟select选择
            .keydown(function(e) {
                if (e.keyCode === 13) {
                    $(‘#myCopy‘).remove();
                    $(‘select‘).blur();
                }
            })
            // 点击外部区域,隐藏按钮
            .click(function(e) {
                if (e.target.id !== ‘myCopyBtn‘) {
                    $(‘#myCopy‘).remove();
                }
            });

        // 执行复制操作
        $(document).on(‘click‘, ‘#myCopyBtn‘, function() {
            var $this = $(this);
            // 复制
            $this.next().select();
            document.execCommand(‘Copy‘);

            // 这里先不直接remove,防止循环引用
            $this.parent().hide();
            // 再次展示select下拉
            $(‘select‘).focus();
        });
    </script>

当然了,这个execCommand方法可能在某些浏览器上不支持,这里还没做兼容,复制功能也还有些简陋

就酱

时间: 2025-01-02 17:03:02

让 select 的 option 标签支持事件监听(如复制操作)的相关文章

jQuery中的事件监听小记

一,一个事件监听的简便写法 最近发现一个jQuery中事件监听的简洁写法,感觉方便好多.同时也深感自己基础薄弱,好多东西竟然都模棱两可.因此,记录的同时,也对jQuery事件监听做个小的总结 原文链接:http://blog.csdn.net/luyinchangdejiqing/article/details/52413368 //鼠标拖拽触发动画 $(".item-wrap").on({ mousedown: function(e) { var el = $(this); var

第四节 wxml盒子布局,事件监听,不同页面数据传输

wxml盒子布局 标签和事件监听 不同页面数据传输 wxml盒子布局 标签和事件监听 标签和事件监听 原文地址:https://www.cnblogs.com/han-guang-xue/p/12157791.html

ExtJs内的datefield控件选择日期过后的事件监听select

[摘要]: 选择时间过后我们为什么需要监听事件?一般有这样一种情况,那就是用于比较两个时间大小或者需要判断在哪个时间点上需要做什么样的操作.基于这样的种种情况,我们很有必要琢磨一下datefield控件的日期选择事件了的. 那么我们如何添加日期选择事件呢?针对这样一个问题,网上有很多ExtJs的盆友想到了change事件,就是当文本框内日期值就上一次值来说不同时,触发该事件,change事件添加核心代码如下所示: { xtype: 'datefield', name: 'birthday', f

JS 事件绑定、事件监听、事件委托详细介绍

事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数. 在DOM中直接绑定事件 我们可以在DOM元素上绑定onclick.onmouseover.onmouseout.onmousedown.onmouseup.ondblclick.onkeyd

JS 中的事件绑定、事件监听、事件委托

事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数. 在DOM中直接绑定事件 我们可以在DOM元素上绑定onclick.onmouseover.onmouseout.onmousedown.onmouseup.ondblclick.onkeyd

事件监听addEventListener()和removeEventListener() ---------1

一直想写一个原生事件监听的记录,方便以后看,不愿意写主要是事件监听的单词太长,记起来好难记每次都要查,这次把知道的写完了,来这里查好了,以后要是理解的更透彻了,就再补全好了 首先,DOM0级事件和DOM2级事件 给一个元素添加事件有三种方法 HTML <input type="button" value='button1' id='btn1' /><input type="button" value='button2' id='btn2' />

android开发事件监听

第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适,实际上,这种形式是目前是最广泛的事件监听器形式.上面的程序代码就是匿名内部类来创建事件监听器的!!!对于使用匿名内部类作为监听器的形式来说,唯一的缺点就是匿名内部类的语法有点不易掌握,如果读者java基础扎实,匿名内部类的语法掌握较好,通常建议使用匿名内部类作为监听器.第二种:内部类作为监听器 将事

js基础——事件绑定(事件监听)

JavaScript事件一共有三种监听方法分别如下: 1.事件监听一夹杂在html标签内 1 <div id="box" onClick="alert('HELLO WORLD')"> 2 <div id="box2" onClick="notice();"></div> 3 <div id="box3" onClick="service('HELLO W

html屏幕旋转事件监听

近期做微信服务号开发,在做图片展示的时候需要横竖屏的检测实现图片大小不同的展示. 添加屏幕旋转事件侦听,可随时发现屏幕旋转状态(左旋.右旋还是没旋). 摘自:http://bbs.phonegap100.com/thread-28-1-1.html //js 判断屏幕是否旋转 4. 屏幕旋转事件:onorientationchange 添加屏幕旋转事件侦听,可随时发现屏幕旋转状态(左旋.右旋还是没旋).例子: // 判断屏幕是否旋转 function orientationChange() {