浏览器-一个JavaScript问题!

问题描述

一个JavaScript问题!
$("#searchImg_3").click(function () {
    $("#chooseRole").slideToggle("fast");
});

这段代码是为了写一个只读的input输入框和一个下拉框,实现点击输入框就会弹出下拉框,但我发现只能通过点击输入框来实现下拉框的下滑与收回,于是我又加了一段:

    $(document).click(function (e) {  //每次点击鼠标判定该点击的元素是否是searchImg_3或chooseRole元素
        console.log($(e.target).closest("#chooseRole").length);
        if ($(e.target).closest("#searchImg_3").length == 0 && $(e.target).closest("#chooseRole").length == 0) {
            $("#chooseRole").slideUp("fast");
            $(document).unbind("click");
        }
    });

点击文档内任何都判断我点击的元素是否是输入框或下拉框,不是则收回下拉框以达到点击除了这两个元素之外的任何地方能够收回下拉框。其中:

console.log($(e.target).closest("#chooseRole").length);

这段代码起初是为了查看closest()返回的是否是一个数组对象,确实也发现当点击的非判断元素时length返回的是0,点击的是我需要判断的元素时返回的是1。

这时候我突然想到不能让每一次无意中的点击都去触发判断,而应该给它添加一个触发条件,于是我让它只有在点击输入框之后才进行判断:

$("#searchImg_3").click(function () {
    $("#chooseRole").slideToggle("fast");
    $(document).click(function (e) {  //每次点击鼠标判定该点击的元素是否是searchImg_3或chooseRole元素
        console.log($(e.target).closest("#chooseRole").length);
        if ($(e.target).closest("#searchImg_3").length == 0 && $(e.target).closest("#chooseRole").length == 0) {
            $("#chooseRole").slideUp("fast");
        }
    });
});

但是只要点击输入框之后每一次点击鼠标都会在控制台产生n+1个输出,点击任何元素都是这样,我想这样的话如果要长时间在这个网页上操作是不是久而久之导致浏览器变卡,但不知道这样产生的原因,希望大家帮我解决一下这个困惑。

最后附上我想到的解决方案:

$("#searchImg_3").click(function () {
    $("#chooseRole").slideToggle("fast");
    $(document).click(function (e) {  //每次点击鼠标判定该点击的元素是否是searchImg_3或chooseRole元素(应设置触发条件)
        console.log($(e.target).closest("#chooseRole").length);
        if ($(e.target).closest("#searchImg_3").length == 0 && $(e.target).closest("#chooseRole").length == 0) {
            $("#chooseRole").slideUp("fast");
            $(document).unbind("click");
        }
    });
});

这样在点击下拉框以外的地方后只会进行一次判断,之后控制台不会再有输出。

解决方案

一个javascript语法问题
求救 一个关于JavaScript的问题
挂起一个问题(javascript)

解决方案二:

给document添加click,判断当前点击对象是哪个,是否弹层中对象就行了,干嘛想得那么复杂

时间: 2024-09-29 03:11:42

浏览器-一个JavaScript问题!的相关文章

怎样写一个能同时用于 Node 和浏览器的 JavaScript 包?

本文讲的是怎样写一个能同时用于 Node 和浏览器的 JavaScript 包?, 我在这个问题上见过很多困惑,即使是很有经验的 JavaScript 开发者也可能难以把握其中的巧妙之处.因此我认为值得为它书写一小段教程. 假设你有一个 JavaScript 的模块想要发布到 npm 上,它是同时适用于 Node 和浏览器的.但是请注意!这个特殊的模块在 Node 版本和浏览器版本上的实现有着细微的区别. 这种情况出现得实在频繁,因为在 Node 和浏览器间有着很多微小的环境差别.在这种情况下,

怎样写一个能同时用于Node和浏览器的JavaScript包?

我在这个问题上见过很多困惑,即使是很有经验的 JavaScript 开发者也可能难以把握其中的巧妙之处.因此我认为值得为它书写一小段教程. 我在这个问题上见过很多困惑,即使是很有经验的 JavaScript 开发者也可能难以把握其中的巧妙之处.因此我认为值得为它书写一小段教程. 假设你有一个 JavaScript 的模块想要发布到 npm 上,它是同时适用于 Node 和浏览器的.但是请注意!这个特殊的模块在 Node 版本和浏览器版本上的实现有着细微的区别. 这种情况出现得实在频繁,因为在 N

判断网页浏览器支持javascript的方法

javascript|浏览器|网页 许多网站需要客户端做许多复杂的工作,比如:用客户端 JavaScript 进行数据合法性校验,这需要客户浏览器的 JavaScript enabled:使用 Session 变量记录身份等信息,需要浏览器 Cookies enabled.因此,有必要确定用户浏览器中的这些选项被打开.在我的网站中,我使用了一串简洁的代码实现这些功能,在用户登录时进行检查,如果不符合就不让登录.在本文中,我就介绍一下这个login页面的写法. 我们首先用 JavaScript 建

测试IE浏览器对JavaScript的AngularJS的兼容性

这篇文章主要介绍了测试IE浏览器对JavaScript的AngularJS的兼容性的方法,尽管随着Windows10的近期上市,IE浏览器即将成为历史...需要的朋友可以参考下 短版本 为确保Angular应用在IE上能够工作请确认:   1. 在IE7或更早的版本上polyfill JSON.stringify.你可以使用JSON2或JSON3来polyfills. ? 1 2 3 4 5 6 7 8 9 10 11 <!doctype html> <html xmlns:ng=&qu

不使用浏览器运行javascript代码的方法

用js写一段小程序,但是又觉得使用浏览器去运行挺麻烦的,下面为大家介绍下如何使用java程序调用javascript程序,有类似需求的朋友可以参考下哈,希望对大家有所帮助   有时候我们想用js写一段小程序,但是又觉得使用浏览器去运行挺麻烦的,那么现在我们来看一下如何使用java程序调用javascript程序,这样就可以不借助浏览器就可执行js代码了. 之 所以有这个需求是因为这几天在做的一个项目中碰到了这样的问题,我有一个javascript脚本,但是这个项目的其他代码都是用CC++写的,不

为IE浏览器的javascript提速

 随着现在网页设计越来越多的应用javascript技术,而且浏览器的Javascript引擎运行速度也成为各大浏览器比拼性能的重要指标,各家浏览器厂商皆宣称他们的浏览器速度更快,希望搅动现存的竞争态势.IE8浏览器的Javascript运行速度虽然相对于IE7以及IE6有着很大的提升,但相对于Webkit引擎的浏览器还是有一定的差距,在去年的ZDNET Javascript测试上Chrome浏览器表现突出,一举击败Firefox.Safari和微软的IE浏览器.不过因为IE浏览器相对庞大的使用

怎样在不使用框架的基础上开发一个 Javascript 组件

本文讲的是怎样在不使用框架的基础上开发一个 Javascript 组件, 许多开发者(包括我)犯的一个错误是当遇到问题时他们总是自上而下地考虑问题.他们想问题的时候,总是从考虑框架(Framework),插件(Plugin),预处理器(Pre-processors),后处理器(Post-processors),面向对象模式(objected-oriented patterns)等等这些方面出发,他们也可能会从他们以前看过的一篇文章来考虑.而这时如果有一个生成器(Generator)的话,他们当然

如何搭建自动化、跨浏览器的 JavaScript 单元测试

本文讲的是如何搭建自动化.跨浏览器的 JavaScript 单元测试, 我们都知道在各个不同的浏览器环境里测试代码是很重要的,并且在大多数时候,我们这些 Web 开发者在这一点上还是做的不错的 -- 至少在第一次发布项目的时候是这样. 然而我们每次更改代码之后的测试工作,却做的不尽人意. 我深切地知道我本人就是这样的 -- 我早就把"学习怎样搭建自动化.跨浏览器的 JavaScript 单元测试"写在 To-do List 上了,但每当我坐下来想要真正的去解决这个问题的时候,我却不得不

《JavaScript和jQuery实战手册(原书第3版)》---第1章 编写第一个JavaScript程序 1.1 编程简介

本节书摘来自华章出版社<JavaScript和jQuery实战手册(原书第3版)>一书中的第1章,第1.1节,作者David Sawyer McFarland,姚待艳 李占宣 译,更多章节内容可以访问"华章计算机"公众号查看. 第1章 编写第一个JavaScript程序 HTML自身并没有太多智能:它不能做数学运算,不能判断某人是否正确填写了一个表单,而且不能根据Web访问者的交互来做出判断.基本上,HTML让人们阅读文本.观看图片或视频,并且单击链接转向拥有更多文本.图片