Выберите div, используя подстановочный знак - PullRequest
6 голосов
/ 21 декабря 2009

Как выбрать div, используя его идентификатор, но с виджетом?

Если идентификатор DIV равен statusMessage_1098, я бы хотел выбрать его каким-либо образом, например document.getElementById('statusMessage_*').

Это потому, что до тех пор, пока страница не будет сгенерирована, я не знаю суффикс идентификатора, и на странице будет присутствовать только один такой идентификатор. Это возможно?

Спасибо за любую помощь.

Ответы [ 8 ]

19 голосов
/ 21 декабря 2009

Подстановочное решение на основе атрибута id элемента

Да, это возможно. Это отвечает на ваш вопрос напрямую, не полагаясь на сторонние JavaScript или API или атрибуты, отличные от идентификатора элемента. Также вам не нужно использовать class =

Пример вызова пользовательского метода

// Uses JavaScript regex features to search on id= attribute
var arrMatches = document.getElementsByRegex('^statusMessage_.*');

Получает массив, содержащий все элементы, имеющие идентификатор, начинающийся с «statusMessage_» (даже вложенные).

Пример реализации - многоразовый и универсальный

Вот реализация функции getElementsByRegex, которая ищет в DOM заданное регулярное выражение, начиная с document. Он прикреплен к объекту документа для удобства и в соответствии с ожидаемым поведением.

<head>
<script>
// Called as: document.getElementsByRegex("pattern").
// Returns an array of all elements matching a given regular expression on id.
// 'pattern' argument is a regular expression string.
//
document['getElementsByRegex'] = function(pattern){
   var arrElements = [];   // to accumulate matching elements
   var re = new RegExp(pattern);   // the regex to match with

   function findRecursively(aNode) { // recursive function to traverse DOM
      if (!aNode) 
          return;
      if (aNode.id !== undefined && aNode.id.search(re) != -1)
          arrElements.push(aNode);  // FOUND ONE!
      for (var idx in aNode.childNodes) // search children...
          findRecursively(aNode.childNodes[idx]);
   };

   findRecursively(document); // initiate recursive matching
   return arrElements; // return matching elements
};
</script>
</head>

Вероятно, есть более эффективные реализации, но эта обеспечивает начало. Тело функции можно заменить другими алгоритмами по вкусу.

Проверка кода

Наконец, протестируйте его, используя рекламный ролик HTML с вложенными элементами, подобными этому

<body>

<div id="statusMessage_1">1</div>
<div id="statusMessage_2">2
    <div id="content">other stuff</div>
    <div id="statusMessage_3">3</div>
</div>

<script>
   // a quick test to see if you get the expected result.
   var arrMatches = document.getElementsByRegex('^statusMessage_.*');
   alert('found ' + arrMatches.length + ' matches - expected 3.')
</script>

Этот блок HTML содержит три элемента, начиная с id="statusMessage_; поэтому в тесте оповещения будет указано

"найдено 3 совпадений - ожидается 3"

Дополнительная информация о вариациях

Если вы хотите ограничить поиск только элементами div или каким-либо другим типом определенного элемента, то вам нужно будет внедрить следующий код getElementByTagName в алгоритм, чтобы ограничить набор элементов, для которых выполняется поиск.

var arrDivs = document.getElementsByTagName("div"); // pull all divs from the doc

Возможно, вы захотите изменить общий алгоритм, передав имя тега во втором аргументе для фильтрации, прежде чем поиск начнется следующим образом

var arrMatches = document.getElementsByRegex('^statusMessage_.*', 'div');
12 голосов
/ 21 декабря 2009

Используя jQuery, вы можете сделать это

$("div[id^='statusMessage_']")

См. attributeStartsWith

Редактировать - с селектором имени класса

Если вы можете использовать имя класса, тогда вы можете использовать что-то вроде этого

$$('div.myDivClass');

получает все элементы div с классом 'myDivClass'

8 голосов
/ 21 июня 2017

Просто подумал, что стоит обновить поток с более новым способом сделать это в JavaScript, который все еще появлялся в поиске.

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

caniuse.com указывает, что его можно использовать для идентификаторов из IE8 и отличной поддержки в других браузерах.

2 голосов
/ 21 декабря 2009

В jquery самый простой способ - назначить класс для каждого div, скажем, statusMessage что-то вроде:

<div id="statusMessage_<%=someid%>" class="statusMessage">...</div>

Чтобы получить их все:

$('.statusMessage')  // or $('div.statusMessage') //or $('div[id^=statusMessage_]')

Без запроса:

var divs = document.getElementsByTagName('div');
for(var i=0;i<divs.length;i++){
   if(divs[i].id.indexOf('statusMessage_')==0){
      //do stuff here for every divs[i]
   }
}
1 голос
/ 20 сентября 2011
function switch2 (elementid)
{
  var divs = document.getElementsByTagName("div");
  for ( var i = 0; divs[i]; i++ )
  {
    if (divs[i].id.indexOf("statusMessage_") == 0)
    {
      document.getElementById (divs[i].id).style.display = "none";
    }
  }
}

Просто замените document.getElementById (divs[i].id).style.display = "none"; тем CSS-кодом, который вы хотите применить ко всем элементам div, у которых идентификатор начинается с statusMessage_ .

0 голосов
/ 21 декабря 2009

Если вы не хотите использовать jQuery, есть еще один более простой способ сделать это:

Назначьте class - для примера назовите его "message" и используйте следующее:

function getElementsByClass(searchClass,node,tag) {
    var classElements = new Array();
    if ( node == null )
        node = document;
    if ( tag == null )
        tag = '*';
    var els = node.getElementsByTagName(tag);
    var elsLen = els.length;
    var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
    for (i = 0, j = 0; i < elsLen; i++) {
        if ( pattern.test(els[i].className) ) {
            classElements[j] = els[i];
            j++;
        }
    }
    return classElements;
}

Вот как вы это называете:

var messages = getElementsByClass("message");

for(var index=0; index < messages.length; index++) {
 // prompt the content of the div
 //alert(message[index].innerText);
}
0 голосов
/ 21 декабря 2009

Обычный способ сделать это в css - дать элементам класс statusMessage в дополнение к их уникальным идентификаторам. Затем вы можете создать правило css с помощью селектора, который будет влиять на все элементы этого класса. Например,

 .statusMessage {color: red;}

Помните, что элементы могут иметь более одного класса. Например,

<p id="id123" class="class1 class2">
0 голосов
/ 21 декабря 2009

Я не уверен, как вы его заполняете, но если это из кода, вы можете попробовать что-то вроде:

document.getElementById('statusMessage_<%= generatedID %>')

, где генерируемый идентификатор - это идентификатор, сгенерированный из кода позади.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...