Javascript getElementById basiert auf einer Teilzeichenfolge

78

Ich muss die ID eines Elements abrufen, aber der Wert ist dynamisch, nur der Anfang ist immer der gleiche.

Hier ist ein Ausschnitt aus dem Code.

<form class="form-poll" id="poll-1225962377536" action="/cs/Satellite">

Die ID beginnt immer mit, poll-dann sind die Zahlen dynamisch.

Wie kann ich die ID nur mit JavaScript und nicht mit jQuery abrufen?

Calebo
quelle
Bitte zeigen Sie ein Beispiel Markup für die Klarheit
Naveen
Möchten Sie die ID des Elements oder das Element mit der ID?
aroth
Ich möchte die ID des Elements erhalten.
Calebo
Wenn dies Ihr eigener Website-Code ist, würde ich empfehlen, dass Sie jedem dieser Elemente eine Klasse geben. Es wird noch ein gewisses Maß an Code erforderlich sein, aber es gibt viele vorgefertigte Funktionen für getElementsByClassName. Einige moderne Browser unterstützen diese Funktion von Haus aus.
Kranu
@Kranu - getElementsByClassNameist nicht ganz vorgefertigt. Wenn Sie möchten, dass es im IE korrekt funktioniert (zumindest ältere Versionen des IE ... möglicherweise wurde es in neueren Versionen behoben), müssen Sie es selbst patchen.
aroth

Antworten:

119

Sie können den querySelector dafür verwenden:

document.querySelector('[id^="poll-"]').id;

Der Selektor bedeutet: Holen Sie sich ein Element, bei dem das Attribut [id]mit der Zeichenfolge beginnt "poll-".

^entspricht dem Start
*entspricht jeder Position
$entspricht dem Ende

jsfiddle

A1rPun
quelle
21
querySelectorAll ist toll. Außer document.querySelectorAll('[id^="poll-"]')gibt eine Liste zurück. Wir müssen die Liste iterieren, um die IDs zu erhalten, anstatt sie zu verwenden document.querySelectorAll('[id^="poll-"]').id.
Sophia Feng
3
Was wäre, wenn es etwas anders wäre, wenn Sie wüssten, was das ENDE des dynamischen Werts ist? In meinem Szenario ist es id = "dynamic_constant"?
JoeL
4
@JoeL ^entspricht dem Start, $dem Ende und *jeder Position. In deinem Fall wäre es id$="dynamic_constant".
A1rPun
4
Entschuldigung, ich hätte in meinem Beispiel klarer sein sollen. Wie würde ich alle Elemente mit einer ID auswählen, die mit 'user-' beginnt UND mit '-image' endet, aber die Zahl in der Mitte kann variieren.
Dave Potts
5
@ DavePotts verwenden [id^=user-][id$=-image]:)
A1rPun
10

Versuche dies.

function getElementsByIdStartsWith(container, selectorTag, prefix) {
    var items = [];
    var myPosts = document.getElementById(container).getElementsByTagName(selectorTag);
    for (var i = 0; i < myPosts.length; i++) {
        //omitting undefined null check for brevity
        if (myPosts[i].id.lastIndexOf(prefix, 0) === 0) {
            items.push(myPosts[i]);
        }
    }
    return items;
}

Beispiel für ein HTML-Markup.

<div id="posts">
    <div id="post-1">post 1</div>
    <div id="post-12">post 12</div>
    <div id="post-123">post 123</div>
    <div id="pst-123">post 123</div>
</div>

Nennen wir es wie

var postedOnes = getElementsByIdStartsWith("posts", "div", "post-");

Demo hier: http://jsfiddle.net/naveen/P4cFu/

Naveen
quelle
4

Wenn Sie die vollständige ID des Elements nur anhand des Präfixes ermitteln möchten, müssen Sie das gesamte DOM durchsuchen (oder zumindest einen gesamten Teilbaum durchsuchen, wenn Sie einige kennen Element, das garantiert immer Ihr Zielelement enthält). Sie können dies mit etwas tun wie:

function findChildWithIdLike(node, prefix) {
    if (node && node.id && node.id.indexOf(prefix) == 0) {
        //match found
        return node;
    }

    //no match, check child nodes
    for (var index = 0; index < node.childNodes.length; index++) {
        var child = node.childNodes[index];
        var childResult = findChildWithIdLike(child, prefix);
        if (childResult) {
            return childResult;
        }
    }
};

Hier ist ein Beispiel: http://jsfiddle.net/xwqKh/

Beachten Sie, dass dynamische Element-IDs wie die, mit denen Sie arbeiten, normalerweise verwendet werden, um die Eindeutigkeit von Element-IDs auf einer einzelnen Seite zu gewährleisten. Dies bedeutet, dass es wahrscheinlich mehrere Elemente gibt, die dasselbe Präfix haben. Wahrscheinlich möchten Sie sie alle finden.

Wenn Sie alle Elemente mit einem bestimmten Präfix anstelle des ersten finden möchten, können Sie Folgendes verwenden : http://jsfiddle.net/xwqKh/1/

Aroth
quelle
4

querySelectorAll mit moderner Aufzählung

polls = document.querySelectorAll('[id ^= "poll-"]');
Array.prototype.forEach.call(polls, callback);

function callback(element, iterator) {
    console.log(iterator, element.id);
}

In der ersten Zeile werden alle Elemente ausgewählt, die idmit der Zeichenfolge beginnen poll-. Die zweite Zeile ruft die Aufzählung und eine Rückruffunktion hervor.

Serge Stroobandt
quelle
2

Ich bin nicht ganz sicher, ob ich weiß, wonach Sie fragen, aber Sie können Zeichenfolgenfunktionen verwenden, um die tatsächliche ID zu erstellen, nach der Sie suchen.

var base = "common";
var num = 3;

var o = document.getElementById(base + num);  // will find id="common3"

Wenn Sie die tatsächliche ID nicht kennen, können Sie das Objekt nicht mit getElementById nachschlagen. Sie müssen es auf andere Weise finden (nach Klassenname, Tag-Typ, Attribut, Eltern, Kind, etc...).

Nachdem Sie uns endlich einen Teil des HTML-Codes gegeben haben, können Sie mit diesem einfachen JS alle Formularelemente finden, deren ID mit "poll-" beginnt:

// get a list of all form objects that have the right type of ID
function findPollForms() {
    var list = getElementsByTagName("form");
    var results = [];
    for (var i = 0; i < list.length; i++) {
        var id = list[i].id;
        if (id && id.search(/^poll-/) != -1) {
            results.push(list[i]);
        }
    }
    return(results);
}

// return the ID of the first form object that has the right type of ID
function findFirstPollFormID() {
    var list = getElementsByTagName("form");
    var results = [];
    for (var i = 0; i < list.length; i++) {
        var id = list[i].id;
        if (id && id.search(/^poll-/) != -1) {
            return(id);
        }
    }
    return(null);
}
jfriend00
quelle
Das Problem ist, dass ich nur die Basis kenne, aber den num-Wert nicht.
Calebo
Dann können Sie getElementById nicht ohne den gesamten ID-Namen verwenden. Wenn Sie Ihren tatsächlichen HTML-Code veröffentlichen, können wir Ihnen mit einer anderen Strategie helfen. In Ihrem neuen Beispiel könnten Sie eine CSS3-Strategie für eine ID verwenden, die mit "post-" beginnt. Es gibt jedoch nur wenige Browser, die Sie mit einfachem JS / Browser ausführen können (Unterstützung der CSS3-Selector-Engine). Es wäre viel besser, eine Selector-Engine in jQuery, Sizzle, YUI3 usw. zu verwenden.
jfriend00
Ich muss nur in der Lage sein, eine Variable mit dem Element zu setzen, dessen ID mit 'poll-' als Wert beginnt. <form class = "form-poll" id = "poll-1225962377536" action = "/ cs / Satellite" target = "_ blank">
Calebo
Die Struktur der Tags, IDs und Klassen ist alles, was Sie haben, wenn Sie keine erweiterte Auswahl-Engine verwenden möchten. Wenn Sie nicht teilen möchten und keine Selector-Engine verwenden, befinden wir uns in einer Sackgasse. Wenn Sie uns nur sagen würden, um welche Art von Tag es sich handelt, könnten wir alle auf eine teilweise ID-Übereinstimmung untersuchen.
jfriend00
OK, jetzt, da Sie etwas HTML gezeigt haben, habe ich zwei verschiedene Funktionen hinzugefügt, die diese Art von Formularelementen finden würden.
jfriend00
0

Sie müssen ihm wahrscheinlich entweder eine konstante Klasse geben und anrufen getElementsByClassNameoder ihn einfach verwendengetElementsByTagName und Ihre Ergebnisse durchlaufen und den Namen überprüfen.

Ich würde vorschlagen, dass Sie sich Ihr zugrunde liegendes Problem ansehen und einen Weg finden, wie Sie die ID im Voraus kennen.

Vielleicht könnten wir eine bessere Alternative finden, wenn Sie etwas mehr darüber posten, warum Sie dies erhalten.

Joe Enos
quelle
Beachten Sie, dass getElementsByClassName in einigen älteren Browsern (jeder IE-Version vor IE9) nicht unterstützt wird.
jfriend00
@ jfriend00 Guter Anruf. Das ist ein Grund, warum ich jQuery für alle meine DOM-Skripte verwende, damit ich mich nicht an so etwas erinnern muss.
Joe Enos
Wenn ich jQuery nicht habe und es nicht in die Seite ziehen möchte, verwende ich die Sizzle-Bibliothek, die (glaube ich) die Selektor-Engine in jQuery ist. Es löst auch dieses Problem und bietet Ihnen die vollständige Auswahllogik. Heutzutage gibt es nicht viel Grund, nur mit dem zu leben, was IE8 nativ kann.
jfriend00
0

Sie verwenden die idEigenschaft, um die ID abzurufen, dann die substrMethode, um den ersten Teil davon zu entfernen, und optional parseInt, um ihn in eine Zahl umzuwandeln:

var id = theElement.id.substr(5);

oder:

var id = parseInt(theElement.id.substr(5));
Guffa
quelle
0
<form class="form-poll" id="poll-1225962377536" action="/cs/Satellite" target="_blank">

Die ID beginnt immer mit 'post-', dann sind die Zahlen dynamisch.

Bitte überprüfen Sie Ihre ID-Namen, "Umfrage" und "Post" sind sehr unterschiedlich.

Wie bereits beantwortet, können Sie querySelector verwenden:

var selectors = '[id^="poll-"]';
element = document.querySelector(selectors).id;

Aber querySelector findet "poll" nicht, wenn Sie weiterhin nach "post" fragen: '[id^="post-"]'

Narr
quelle