Javascript getElementById на основі часткового рядка


82

Мені потрібно отримати ідентифікатор елемента, але значення динамічне, лише його початок завжди однаковий.

Ось фрагмент коду.

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

Ідентифікатор завжди починається з, poll-тоді цифри динамічні.

Як я можу отримати ідентифікатор, використовуючи лише JavaScript, а не jQuery?


будь ласка, покажіть зразок розмітки для наочності
навен

Вам потрібен ідентифікатор елемента або елемент з ідентифікатором?
aroth

Я хочу отримати ідентифікатор елемента.
Калебо

Якщо це ваш власний код веб-сайту, я рекомендую вам дати кожному з цих елементів клас. Це все одно потребуватиме певного ступеня коду, але для getElementsByClassName існує багато заздалегідь створених функцій. Деякі сучасні браузери спочатку підтримують зазначену функцію.
Крану

@Kranu - getElementsByClassNameне зовсім заздалегідь побудований. Якщо ви хочете, щоб він працював коректно в IE (принаймні, старіші версії IE ... можливо, це було виправлено в нових версіях), то вам доведеться виправити його самостійно.
aroth

Відповіді:


126

Ви можете використовувати в querySelector для цього:

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

Селектор означає: отримати елемент, де атрибут [id]починається з рядка "poll-".

^відповідає початку
*відповідає будь-якій позиції
$відповідає кінці

jsfiddle


22
querySelectorAll це здорово. Крім document.querySelectorAll('[id^="poll-"]')повертає список. Нам потрібно повторити список, щоб отримати ідентифікатори замість використання document.querySelectorAll('[id^="poll-"]').id.
Софія Фенг

3
Що, якби це було дещо іншим тим, що ви знали, що таке КІНЕЦЬ динамічного значення? У моєму сценарії це id = "dynamic_constant"?
JoeL

4
@JoeL ^відповідає початку, $відповідає кінці та *відповідає будь-якій позиції. У вашому випадку це було б id$="dynamic_constant".
A1rPun

4
Вибачте, я мав бути чіткішим у своєму прикладі. Як би я вибрав усі елементи з ідентифікатором, який починається на 'user-' І закінчується '-image', але число в середині може змінюватися.
Dave Potts

5
@DavePotts Use [id^=user-][id$=-image]:)
A1rPun

11

Спробуйте це.

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

Зразок розмітки HTML.

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

Називайте це як

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

Демо тут: http://jsfiddle.net/naveen/P4cFu/


5

querySelectorAll із сучасним переліком

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

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

Перший рядок виділяє всі елементи, які idпочинаються з рядка poll-. Другий рядок викликає перерахування та функцію зворотного виклику.


4

Враховуючи, що вам потрібно визначити повний ідентифікатор елемента на основі лише префікса, вам доведеться здійснити пошук у цілому DOM (або принаймні, пошук у цілому піддереві, якщо ви знаєте елемент, який завжди гарантовано міститиме ваш цільовий елемент). Ви можете зробити це, наприклад:

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

Ось приклад: http://jsfiddle.net/xwqKh/

Майте на увазі, що динамічні ідентифікатори елементів, подібні до тих, з якими ви працюєте, зазвичай використовуються для гарантування унікальності ідентифікаторів елементів на одній сторінці. Це означає, що існує ймовірність того, що існує декілька елементів, що мають однаковий префікс. Напевно, ви хочете знайти їх усіх.

Якщо ви хочете знайти всі елементи, що мають заданий префікс, замість лише першого, ви можете використовувати щось на зразок того, що продемонстровано тут: http://jsfiddle.net/xwqKh/1/


2

Я не зовсім впевнений, що знаю, про що ви питаєте, але ви можете використовувати рядкові функції для створення фактичного ідентифікатора, який ви шукаєте.

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

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

Якщо ви не знаєте фактичного ідентифікатора, тоді ви не можете шукати об'єкт за допомогою getElementById, вам доведеться знайти його іншим способом (за назвою класу, за типом тегу, за атрибутом, за батьком, за дочірнім, тощо ...).

Тепер, коли ви нарешті передали нам трохи HTML, ви можете використовувати цей простий JS, щоб знайти всі елементи форми, які мають ідентифікатор, який починається з "poll-":

// 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);
}

Проблема в тому, що я знаю лише базу, але я не знаю числове значення.
Калебо

Тоді ви не можете використовувати getElementById без повного імені ідентифікатора. Якщо ви опублікуєте власний HTML, ми можемо допомогти з іншою стратегією. У вашому новому прикладі ви можете використовувати стратегію CSS3 для ідентифікатора, який починається з "post-", але існує лише декілька браузерів, які ви можете зробити це за допомогою простого JS / браузера (підтримка механізму вибору CSS3). Було б набагато краще використовувати механізм селектора в jQuery, Sizzle, YUI3 тощо ...
jfriend00

Мені просто потрібно мати можливість встановити змінну з елементом з ідентифікатором, що починається з 'poll-', оскільки це значення. <form class = "form-poll" id = "poll-1225962377536" action = "/ cs / Satellite" target = "_ blank">
calebo

Структура тегів, ідентифікаторів та класів - це все, що у вас є, якщо ви не збираєтесь використовувати більш вдосконалений механізм вибору. Якщо ви не хочете ділитися і не будете використовувати движок селектора, тоді ми в глухий кут. Якби ви просто сказали нам, що це за тег, ми могли б переглянути їх усі для часткового збігу ідентифікатора.
jfriend00

Добре, тепер, коли ви показали деякий HTML, я додав дві різні функції, які могли б знайти такі типи елементів форми.
jfriend00

0

Ймовірно, вам доведеться або давати йому постійний клас і дзвонити getElementsByClassName, або, можливо, просто використовувати getElementsByTagNameі прокручувати результати, перевіряючи ім'я.

Я пропоную розглянути вашу основну проблему та з’ясувати спосіб, за допомогою якого ви можете дізнатися посвідчення особи заздалегідь.

Можливо, якщо ви розмістите трохи більше про те, чому ви отримуєте це, ми могли б знайти кращу альтернативу.


Майте на увазі, що getElementsByClassName не підтримується в деяких старих браузерах (будь-яка версія IE до IE9).
jfriend00

@ jfriend00 Хороший дзвінок. Це одна з причин, через яку я використовую jQuery для всього свого сценарію DOM, тому мені не потрібно пам'ятати подібні речі.
Джо Енос

Коли у мене немає jQuery і я не хочу втягувати його на сторінку, я використовую бібліотеку Sizzle, яка (на мою думку) є механізмом вибору всередині jQuery. Це також вирішує цю проблему і надає вам повну логіку селектора. У наш час не так багато причин жити лише з тим, що IE8 може робити рідно.
jfriend00

0

Ви використовуєте idвластивість для отримання ідентифікатора, потім substrметод для видалення першої його частини, а потім, за бажанням, parseIntперетворюєте його в число:

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

або:

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

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

Ідентифікатор завжди починається з 'post-', тоді цифри є динамічними.

Будь ласка, перевірте свої ідентифікатори, "опитування" та "публікація" дуже різні.

Як уже відповіли, ви можете використовувати querySelector:

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

але querySelector не знайде "опитування", якщо ви продовжуєте запитувати "post": '[id^="post-"]'

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.