在下拉列表/选择列表中选择已选择的项目

时间:2011-05-11 12:38:45

标签: javascript jquery html select drop-down-menu

我一直在寻找这个问题的答案已经有一段时间了,没有运气,或者最多的错误解决方案。

我遇到的问题是我有一个选择元素,显然在选择已经选择的项目时不会触发“onchange”事件。

像这样:

<select onchange="alert(this.value);">
<option>1</option>
<option>2</option>
<option>3</option>
</select>

现在,说我先选择第1项。 然后我需要再次选择第1项。

此功能对我正在进行的项目的成功非常重要。

非常感谢任何帮助。

修改:(更多信息)

当我正在使用谷歌地图进行项目时需要此功能,用户可以通过下拉菜单快速跳转到某个国家/地区(例如,您在下拉列表中选择“西班牙”,谷歌地图将西班牙设置为您的视图。< / p>

当你想去西班牙,然后在地图上拖动,最终到达意大利时,问题就出现了。现在你想回到西班牙,但你不能从下拉列表中选择它,直到你先选择其他东西。我的老板不喜欢这样:))

编辑2:解决方案

所以现在有一些解决方案。 其中一个是抛出动作onblur(当没有聚焦控件时)这个可以工作,因为我可以模糊更改列表,但仍然为人们再次选择相同的项目,触发器模糊控件不会去,除非他们自己切换焦点,否则他们不会看到地图的变化。

仍然我无法理解为什么应该如此难以找到一些可以选择/点击/模糊或其他任何事情的事件..我一直看着自己,并稍后再回来查看。

编辑3:最终解决方案

是的,所以我终于设法让这个工作,不完全像它的确是,但足够接近,至少现在至少。

我想出的解决方案是在选择的顶部添加“请选择国家/地区”选项。 然后在更改时,我会将“请选择国家/地区”的文本和值更改为所选项目的值,并将selectedindex重置为0。 这样,当选择西班牙时,它将处于禁用状态列表的顶部,并进一步处于工作状态。所以现在你可以点击列表中间的西班牙返回西班牙,即使它仍然被选中(顶部项目是)

相当整洁,想法是由同事提供的。

脚本如下:

   var dummyOption;
function setdummyCountry(obj)
{
    var selectedOption = obj.options[obj.selectedIndex];
    if (dummyOption != null) {
        dummyOption.text = selectedOption.text;
        dummyOption.value = selectedOption.value;
    }
    else {
        dummyOption = document.createElement("option");
        dummyOption.text = selectedOption.text;
        dummyOption.value = selectedOption.value;
        dummyOption.setAttribute("disabled", "true");
        obj.options[0] = dummyOption;
    }
    obj.selectedIndex = 0;
}

<select onchange="setdummyCountry(this);">
    <option value="">Please select country</option>
    <option value="ES">spain</option>
    <option value="SE">sweden</option>
    <option value="NO">norway</option>
</select>

我希望这会对某人有所帮助!

那些试图帮助我的人,感谢你的想法和时间。

3 个答案:

答案 0 :(得分:2)

我认为如果选择相同的项目,则无法触发更改事件。我们遇到了同样的问题所以我们所做的是一个简单的可用性黑客:当一个项目被选中时,我们向用户显示在一个范围内选择的项目,并将下拉列表的值重置为其默认值(--Select--)。

HTH

答案 1 :(得分:1)

这可能不是你想要的,但这是你可以决定的另一种选择。 选择该选项后,将其恢复为默认值(空的一个/第一个)选项

<select onchange="alert(this.value);this.value='';">
 <option value='' selected='selected'></option>
 <option>1</option>
 <option>2</option>
 <option>3</option>
</select>

或者你可以制作

<select onblur="alert(this.value);">
 <option>1</option>
 <option>2</option>
 <option>3</option>
</select>

但是当用户离开/模糊/取消焦点列表时,这种方式会调用你的函数(警报):p

答案 2 :(得分:1)

我一直在寻找相同场景的解决方案,并最终为此创建了一个angularjs指令 -

guthub link - angular select

使用element[0].blur();删除select标记的焦点。逻辑是在第二次下拉时触发此模糊。

即使用户在下拉列表中选择了相同的值,

as-select也会被触发。

DEMO - link