2016-11-04 53 views
0

我在这里看过类似的查询,但我努力寻找我正在寻找的答案。我正在写一个非常基本的Chrome扩展,这将允许用户填充常用的表单(基本上有一种形式是巨大的,用户必须完成,但很多信息从不改变)。使用chrome.tabs.executeScript来填充多个选择字段

形式本身是不是我的,所以我不能在所有的编辑和它的设置是这样的:

<select multiple="multiple" id="SelectField"> 
    <option value="Option 1">Option 1</Option> 
    <option value="Option 2">Option 2</Option> 
    <option value="Option 3">Option 3</Option> 
</select> 

我使用以下将值注入到文本字段,而这没有造成任何问题:

document.getElementById("TextField").value = "Text Field Value"; 

我遇到的问题是有一堆的形式在多个选择框,并在我只需要预先填写一个值的情况下,上述工作正常。但是,如果我需要选择多个选项,它将无法工作。

我已经试过各种天真的尝试,如:

document.getElementById("SelectField").value = "Option 1","Option 3"; 
document.getElementById("SelectField").values = "Option 1","Option 3"; 
document.getElementById("SelectField").value = ["Option 1","Option 3"]; 
document.getElementById("SelectField").values = ["Option 1","Option 3"]; 

不过,当然没有这些的都在工作。在某些情况下,它会选择第一个选项,在其他情况下则不会。

如果可能的话,我宁愿不使用jQuery。

在多个选项的情况下
+2

JSON与这个问题有什么关系? – tmslnz

+0

你说得对,目前没有。最终我会从JSON文件中提取字段信息,但是你说得对,这个问题不是JSON特有的 - 我已经编辑它来更清晰 – Mike

+0

这是特定于一个站点吗? (在这种情况下,更好的策略是始终注入内容脚本,并使用消息传递代替脚本注入来与其交互) – Xan

回答

0

选择您需要先添加(如果它们不是一个多选择)

document.getElementById("SelectField").multiple = true; 

那么你可以做

document.getElementById("SelectField").options[0].selected=true; 
document.getElementById("SelectField").options[1].selected=true; 

document.querySelector('#SelectField option[value="Option1"]').selected = true 
+0

感谢您的快速回复,但不幸的是,这并不适合我。我已经编辑了上面的问题以提供更多详细信息? – Mike

+0

我已经编辑了你的索引 –

+0

访问的响应这将起作用 - 是否可以使用选项值而不是索引来选择选项?只是在他们添加选项的选择,这将搅乱所有的数字? – Mike

0

对于<select multiple="true">元素,您可以设置每个人的selected属性<option>元素。

你可以使这样的事情:

var optionsToSelect = ["Option 1","Option 3"]; 
 

 
optionsToSelect.forEach(option => { 
 
    document.querySelector('#SelectField option[value="'+option+'"]').selected = true; 
 
});
<select multiple="multiple" id="SelectField"> 
 
    <option value="Option 1">Option 1</Option> 
 
    <option value="Option 2">Option 2</Option> 
 
    <option value="Option 3">Option 3</Option> 
 
</select>

您是拉一些记录这些信息了JSON的。这意味着您可能正在对多个元素进行选择,并且JSON数据可能包含目前不存在的选项或不存在的<select>元素的ID。因此,应该使用更通用,更高效和更强大的东西。显然,它变得有点复杂得多:

var optionsToSelect = ["Option 1","Option 3"]; 
 

 
setMultipleOptionsById('SelectField',optionsToSelect); 
 

 
function setMultipleOptionsById(id,selectedOptions) { 
 
    let selectEl = document.getElementById(id); 
 
    if(selectEl){ 
 
     selectedOptions.forEach(option => { 
 
      let optionEl = selectEl.querySelector('option[value="'+option+'"]'); 
 
      if(optionEl) { 
 
       optionEl.selected = true; 
 
      } 
 
     }); 
 
    } 
 
}
<select multiple="multiple" id="SelectField"> 
 
    <option value="Option 1">Option 1</Option> 
 
    <option value="Option 2">Option 2</Option> 
 
    <option value="Option 3">Option 3</Option> 
 
</select>

目前,上述功能只是静静地忽略任何缺少<select><option>元素。如果你愿意,可以很容易地向返回值添加一个返回值,该值指示是否存在缺失的元素,并可以报告缺失的元素。

+0

谢谢你正努力实现它,但这可能是因为我需要这样做的原因。 因为它是一个扩展的弹出窗口中的代码,所以我需要将它注入到页面中,并且我挣扎着 至于事情我有这样的事情: 'chrome.tabs.executeScript(null,{ code :'document.getElementById(“TextBox1”)。value =“Value 1”'+ 'document.getElementById(“TextBox2”)。value =“Value 2”'+ etc ...});'' 我并不太担心它的超高效率,并且很乐意写每一行,但不知道如何去写。这有意义吗? – Mike

+1

您应该制作一个更通用的内容脚本,并将其发送给选件阵列。 – Xan

+0

我同意Xan。有了一个你注入的内容脚本,然后它接受一个消息,用一组描述ID和值填充的​​对象,听起来像是一个更好的主意,而不是硬编码一切。或者,如果您已经存储了它,它可以从“chrome.storage”中提取信息。 – Makyen