2016-11-04 11 views
0

私はここで類似のクエリを調べましたが、私が探している回答を見つけるのには苦労しています。chrome.tabs.executeScriptを使用して複数選択フィールドを設定する

私は非常に基本的なクロムエクステンションを書いています。ユーザーは頻繁に使用されるフォームを埋め込むことができます(基本的に1つのフォームがあり、ユーザーは完了する必要があります。

フォーム自体は私のものではありませんので、私は全くそれを編集することはできませんし、それは次のように設定しています:

<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

これは特定のサイトに固有のものですか? (この場合、より良い戦略は常にコンテンツスクリプトを挿入し、スクリプトインジェクションの代わりにMessagingを使ってそれと対話することです) – 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 = "値1"' + 'document.getElementById( "TextBox2")。値= "値2"' + など...); '' 私はそれを超効率的にすることについてあまり心配していないし、各行を書くことも喜んでいるが、どうすればよいか分からない。これは理にかなっていますか? – Mike

+1

もっと一般的なコンテンツスクリプトを作成し、オプションの配列だけを送ってください。 – Xan

+0

私はXanに同意します。あなたが注入するコンテンツスクリプトを持っていて、IDと値を記述するオブジェクトの配列を持つメッセージを受け入れると、すべてをハードコードするよりも良いアイデアのように思えます。また、既に保存している場合は、 'chrome.storage'から情報を引き出すことができます。 – Makyen

関連する問題