Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从dropbox中选择多个项目&;让它们显示在文本框中_Javascript_Html_Drop Down Menu - Fatal编程技术网

Javascript 从dropbox中选择多个项目&;让它们显示在文本框中

Javascript 从dropbox中选择多个项目&;让它们显示在文本框中,javascript,html,drop-down-menu,Javascript,Html,Drop Down Menu,我想在下拉框中添加所选项目,并将其放入文本框中。 我现在可以只选择一个项目并将其放入文本框: Html代码: <select name="ncontacts" id = "contacts" multiple="yes" onclick="ChooseContact(this)"> </select> 但是当我选择两个项目时,只有第一个项目写在文本框中。 那么,您知道如何修复它,让它们都显示在文本框中吗?一种可能的(基本)解决方案如下: function Choo

我想在下拉框中添加所选项目,并将其放入文本框中。 我现在可以只选择一个项目并将其放入文本框:

Html代码:

   <select name="ncontacts" id = "contacts" multiple="yes" onclick="ChooseContact(this)"> </select>
但是当我选择两个项目时,只有第一个项目写在文本框中。 那么,您知道如何修复它,让它们都显示在文本框中吗?

一种可能的(基本)解决方案如下:

function ChooseContacts(selectElem) {
    var txtBox = document.getElementById ("friendName");
    txtBox.value = '';
    for (var i=0; i<selectElem.options.length; i++) {
        if (selectElem.options[i].selected) {
            txtBox.value += selectElem.options[i].value;
        }
    }
}
功能选择触点(selectElem){
var txtBox=document.getElementById(“friendName”);
txtBox.value='';

对于(var i=0;i另一种可能的解决方案是:

function ChooseContact(list) {
    var selected = [];
    Array.prototype.forEach.call(list.options, function(option) {
        if( option.selected ) {
            selected.push(option.value);
        }     
    });
    document.getElementById('friends').value = selected.join(', ');
}​

编辑:对于记录-

Array.prototype
的执行速度略快于
[]
。但它们做的事情是一样的:)性能损失并没有那么大(我在代码中使用了
[]
。但我不妨向您展示一种稍微快一点、更详细的方式).

请您进一步解释您的问题好吗?forEach不适用于节点列表…这就是为什么它不适用于您。此外,您应该缓存选项的长度,而不是在每次迭代时计算它们。
(var i=0,l=fromElem.options.length;i
@rlemon谢谢。缓存始终是首选的吗?在测试时是否没有对此进行优化?没有每次迭代都会重新检查数组长度。如果更改数组的值(删除或添加)这会把你搞砸。如果你不这样做,会有轻微的性能损失(如果你的循环太大,会有更大的损失……这是不应该的)@rlemon好的,谢谢。我似乎记得语言能够确定它是一个循环不变量,因为我没有修改我正在迭代的内容,因此我认为它可以为我做到这一点。
document.getElementById(“friendName”)
应存储在局部变量中,您无需从DOM中选择它两次。此外,应缓存选项的长度。并且您已创建了一个新的globabl变量…
i
-应为(var i=0
@rlemon:PHP测试是昨天进行的,orourkek赢了。这里的问题和答案仅仅与给出的奖励无关,更多的是某个特定的人给出了答案,这就是为什么会有奖励。以防万一。但我很感激这个问题也能从中受益。@hakre仍然需要一个错误的答案更新。这个问题仍在集体讨论中,有人可能会认为这是解决问题的方法。@rlemon:当然,如前所述,这是一个好处。谢谢你的评论,只是不想因为赏金而给人留下错误的印象,仅此而已。
function ChooseContact(list) {
    var selected = [];
    Array.prototype.forEach.call(list.options, function(option) {
        if( option.selected ) {
            selected.push(option.value);
        }     
    });
    document.getElementById('friends').value = selected.join(', ');
}​
function chooseContact(fromElem, appendToElem, separator){
    separator = separator|| " ";
    var result = [];
    [].forEach.call(fromElem.options, functon(option){
            if(option.checked){
                    result.push(option.value);
            }
    });
    appendToElem.value = result.join(separator);
}