2016-11-04 3 views
0

Ich habe hier nach ähnlichen Abfragen gesucht, aber ich habe Mühe, die Antwort zu finden, nach der ich suche.Verwenden von chrome.tabs.executeScript zum Füllen mehrerer Felder

Ich schreibe eine sehr einfache Chrome-Erweiterung, die es Benutzern ermöglicht, häufig verwendete Formulare zu füllen (im Grunde gibt es ein Formular, das riesig ist, die Benutzer ausfüllen müssen, aber viele der Informationen ändern sich nie).

Die Form selbst ist nicht von mir, also kann ich es überhaupt nicht bearbeiten und es ist so aufgebaut:

<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> 

ich folgendes zu injizieren Werte in Textfelder verwendet, und das ist keine Probleme verursacht:

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

das Problem, das ich habe, ist es ein Bündel von mehreren Auswahlbox auf dem Formular ist, und in Fällen, in denen ich brauche nur einen Wert vorab zu füllen, arbeitet die oben in Ordnung. Wenn ich jedoch mehrere Optionen auswählen muss, funktioniert es nicht.

Ich habe verschiedene naiven Versuche versucht, wie zum Beispiel:

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"]; 

Aber natürlich keiner von ihnen arbeiten. in einigen Fällen wählt es die erste Option, in anderen Fällen gar nichts.

Ich würde auch lieber nicht jQuery wenn überhaupt möglich.

+2

Was hat JSON mit der Frage zu tun? – tmslnz

+0

Sie haben im Moment nichts. Schließlich werde ich die Feldinformationen aus einer JSON-Datei ziehen, aber Sie haben Recht, diese Frage ist nicht JSON-spezifisch - ich habe sie bearbeitet, um klarer zu sein – Mike

+0

Ist dies für eine Website spezifisch? (In diesem Fall ist es eine bessere Strategie, immer ein Inhaltsskript einzufügen und anstelle der Skript-Injektion Messaging zu verwenden) – Xan

Antwort

0

im Falle von mehreren Optionen auswählen, die Sie hinzufügen, zuerst müssen (wenn sie nicht ein Vielfaches wählt sind)

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

dann können Sie

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

oder

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

Vielen Dank für Ihre schnelle Antwort, aber das hat leider nicht funktioniert. Ich habe meine Frage oben bearbeitet, um ein wenig mehr Details zu geben. – Mike

+0

Ich habe die Antwort für Sie durch den Zugriff auf den Index –

+0

bearbeitet Dies wird funktionieren - ist es möglich, die Option mit dem Wert der Option statt dessen Index auswählen? Nur wenn sie der Auswahl Optionen hinzufügen, die mit allen Zahlen in Konflikt kommen würden? – Mike

0

tun Für <select multiple="true"> Elemente haben Sie die selected Eigenschaft auf jedem einzelnenfestgelegtElement.

Sie könnten so etwas wie dieses:

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>

Sie ziehen diese Informationen aus JSON von einem Rekord. Das bedeutet, dass Sie möglicherweise Auswahlen für mehrere Elemente treffen und dass die JSON-Daten möglicherweise Optionen enthalten, die zu diesem Zeitpunkt nicht vorhanden sind, oder IDs für <select> Elemente, die nicht vorhanden sind. Daher sollte etwas, das ein wenig generischer, effizienter und robuster ist, verwendet werden. Offensichtlich wird es etwas komplizierter:

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>

Derzeit ist die obige Funktion nur ignoriert ruhig alle fehlenden <select> oder <option> Elemente. Wenn Sie möchten, wäre es einfach, der Funktion einen Rückgabewert hinzuzufügen, der angibt, ob ein Element fehlt, und welches Element fehlt.

+0

Danke Sie, ich kämpfe um es zu implementieren, aber das kann wegen der Art, wie ich es tun muss Da es Code in einem Popup von einer Erweiterung ist, muss ich es in die Seite injizieren, und ich habe zu kämpfen So wie die Dinge stehen, habe ich so etwas: 'chrome.tabs.executeScript (null, { code : 'document.getElementById ("TextBox1"). value = "Wert 1"' + 'document.getElementById ("TextBox2"). value = "Wert 2"' + etc ...}); '" Ich bin nicht allzu besorgt darüber, es super effizient zu machen, und freue mich, jede Zeile zu schreiben, aber nicht sicher, wie. Macht das Sinn? – Mike

+1

Sie sollten wahrscheinlich ein allgemeineres Inhaltsskript erstellen und es einfach dem Array von Optionen senden. – Xan

+0

Ich stimme Xan zu. Mit einem Inhaltsskript, das Sie injizieren, und dann akzeptiert es eine Nachricht, mit einem Array von Objekten, die die ID und die zu füllenden Werte beschreiben, klingt nach einer besseren Idee, als alles hart zu programmieren. Alternativ könnte es die Informationen aus "chrome.storage" abrufen, wenn Sie es bereits speichern. – Makyen

Verwandte Themen