2016-11-04 55 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