event.target/srcElement一点应用

今天工作遇到一个问题,在朋友帮助下解决了,写下来跟大家分享下。

首先说下需求,有一个文本框,文本框下面有个隐藏的div,div中有几个a标签,当点击文本框时候,div显示出来,点击div中的a标签,会将a标签的值赋到文本框中。点击其他地方时候则隐藏div。

如图   点击文本框,下面div显示

点击a标签时候 a标签值赋到文本框中

当点击外面时候div隐藏

 

刚开始想的很简单,给文本框一个onblur跟onfoucs事件,分别对应着文本框的隐藏跟显示。a标签注册点击事件。

<table>
            <tr>
                <td>
                </td>
                <td id="tdtd">
                    <input type="text" id="txtV" value="">
                    <div id="dv" style="display: none; border: solid 1px red">
                        <a href="javascript:void(0)" onclick="addFun(this,1212)">1212</a>
                    </div>
                </td>
            </tr>
        </table>

js:

 $(function () {
            $("#txtV").focus(function () {
                $("#dv").show();
            }).blur(function () {
                $("#dv").hide();
            });
        })

function addFun(a, value) {
            $(a).parent().prev("input").val(value);
        }

但是这样子出现了一个问题 ,当点击a标签的时候,他首先触发的文本框的blur事件,这样子a标签的onclick就没有效果。

后来朋友的提示下改了下,思路是这样子的,给文本框一个click事件,让div显示。而给body一个mousedown事件,当鼠标不在文本框以及div中的时候,让他隐藏,刚开始还是想获取mousedown时候的鼠标位置,跟div 的height,width比较,想想比较麻烦。后来朋友一指点,恍然大悟,可以获取选中id,跟文本框,div比较。

改后的js:

 $(function () {
            $("#txtV").click(function () {
                $("#dv").show();
            })

            $("body").bind("mousedown", function () {
                var obj = event.srcElement ? event.srcElement : event.target;//为了兼容IE以及Chrome/FF
                if (obj.id != "dv" && obj.id != "txtV" && $(obj).parents("#dv").length == 0) {
                    $("#dv").hide();
                }
            })

        })

        function addFun(a, value) {
            $(a).parent().prev("input").val(value);
        }

当选中的id不为div以及不为文本框,以及不为div中子元素(a标签)时候,则让div隐藏。

 

  

 

posted @ 2013-01-10 23:55  sjR10  阅读(1218)  评论(3编辑  收藏  举报