为什么例子中的“文本被选中!”会输出3次?select事件的触发机制是什么?

http://www.w3school.com.cn/tiy/t.asp?f=jqueryeventtrigger
以上网址的例子的结果为什么会输出3次“文本被选中!”,而不是一次?
代码如下:

<html>

<head>
    <script type="text/javascript" src="/jquery/jquery.js"></script>
    <script type="text/javascript">
    $(document).ready(function() {
        $("input").select(function() {
            $("input").after("文本被选中!");
        });
        $("button").click(function() {
            $("input").trigger("select");
        });
    });
    </script>
</head>

<body>
    <input type="text" name="FirstName" value="Hello World" />
    <br />
    <button>激活 input 域的 select 事件</button>
</body>

</html>

阅读 6.1k
5 个回答

这是 trigger 引起的,看这里 .trigger().

改用 triggerHandler 就可以了。补上一个 triggerHandler 的地址

看不到你的代码

我按你的代码查看,是选中后出现一次文字提示,只不过文字提示会累计,

可以考虑使用选中则隐藏和显示某个提示语句的方式。

如今我看到这个demo,也有了同样的疑问。
不过我发现如果value值是空,就只会触发一次。只要有了内容就会触发三次。

后来我尝试了一下,发现主要问题是出在select事件上吧。
它会先调用focus,光标移动到文本框后,再会去选择文本。
(= =!!然后先卡在这里,下次继续研究研究)

我的理解是:
trigger('select')或select()执行三次事件处理函数:第一次简单执行事件处理函数,第二次触发默认行为,第三次由于默认行为文本被选中再次执行事件处理函数。所以后两次是触发默认行为引起的。
注意:
1.先执行后触发;
2.默认行为在事件所属对象获得焦点、文本未被选中时只触发一次;
3.文本被选中时总是会执行一次事件处理函数。
4.并不是触发默认行为就一定会选中文本,选中文本总是发生在最后一个匹配的事件所属对象上;
5.事件所属对象在文本被选中后鼠标点击空白处,trigger()方法仍认为文本是被选中的,而triggerHandler()则不认为文本被选中。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏