идентификаторы jquery с пробелами

127

Кто-нибудь знает, как выбрать элемент в DOM по идентификатору с помощью jQuery, когда в этом идентификаторе есть пробел?

Например, идентификатор моего предмета будет

<div id="content Module">Stuff</div>

Как мне выбрать это с помощью jQuery?

Если я просто сделаю

$("#content Module").whatever() 

jQuery попытается найти элемент как с идентификатором содержимого, так и с идентификатором модуля, а это не то, что я ищу.

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

Джефф Дэвис
источник
@ Glavić Все твои утверждения верны. Однако недавно принятый ответ будет более полезен для людей, которым действительно нужно это решение. Для тех, кто действительно застрял, умение справляться с пробелами - это то, что им действительно нужно.
Джефф Дэвис
Да, это правда, но в моем ответе также есть решение для идентификаторов с пробелами, оно даже выделено жирным шрифтом;)
Главич
1
Проголосуйте за правильную запись идентификаторов вместо идентификаторов. Извини, любимая мозоль. И да, я знаю, что большинство людей используют апостроф для образования множественного числа акронимов и сокращенных слов, но для меня это все равно выглядит апострофом бакалейщика walkinthewords.blogspot.com/2009/05/grocers-apostrophe.html
Хуан Мендес,

Ответы:

253

Используйте селектор атрибутов.

$("[id='content Module']").whatever();

Или, лучше, укажите еще и тег:

$("div[id='content Module']").whatever();

Обратите внимание, что в отличие от $ ('# id'), это вернет несколько элементов, если на вашей странице есть несколько элементов с одинаковым идентификатором.

Эллиот Нельсон
источник
1
даже ответ Главича - лучшее предложение. я думаю, что этот ответ решил проблему :)
GusDeCooL
8
Это мне ОЧЕНЬ помогло. Я читаю какой-то ужасный HTML через ajax и не могу контролировать структуру HTML или формат идентификаторов. В их идентификаторах есть пробелы, поэтому ответ Эллиота очень помогает, в то время как ответ Главича не предлагает никакой помощи.
daybreaker
Спасибо, отличный ответ!
alcfeoh
62

Не используйте пробелы, причина этого проста, символ пробела не является допустимым для атрибута ID.

Жетоны идентификатора должны начинаться с буквы ([A-Za-z]) и могут сопровождаться любым количеством букв, цифр ([0-9]), дефисами ("-"), подчеркиванием ("_"), двоеточиями. (":") и точки (".").

Но если вас не волнуют стандарты, попробуйте $("[id='content Module']")

Подобная ветка> Какие допустимые значения для атрибута id в HTML?

Изменить: как идентификатор отличается между HTML 4.01 и HTML5

HTML5 избавляется от дополнительных ограничений на атрибут id. Единственные оставшиеся требования - помимо уникальности в документе - заключаются в том, что значение должно содержать хотя бы один символ (не может быть пустым) и не может содержать никаких пробелов.

Ссылка: http://mathiasbynens.be/notes/html5-id-class

Glavic
источник
4
+1. Соблюдайте стандарты именования, и тогда вам не нужно придумывать обходные пути, если вы им не следуете.
matt b
Это вызвало идею обрезать второе отображаемое слово, чтобы у меня были действительные идентификаторы. Позаботился о проблеме, спасибо!
Джефф Дэвис,
1
Здесь вы цитируете спецификацию HTML 4.01. Хотя по-прежнему нельзя использовать пробелы в значениях атрибутов идентификатора, HTML5 избавляется от большинства этих ограничений: mathiasbynens.be/notes/html5-id-class
Mathias Bynens,
2
Не говорите человеку, чтобы он взломал всю кодовую базу старого проекта только из-за «стандартов». В
лучшем случае
Веселая. Пробелы отлично подходят для большинства целей, зачем делать их нестандартными?
Lodewijk
23

На всякий случай, если кому-то интересно, я обнаружил, что побег из космоса сработает. Это особенно полезно, когда у вас нет контроля над целевой DOM (например, из пользовательского скрипта):

$("#this\\ has\\ spaces");

Обратите внимание на двойную обратную косую черту, которая обязательна.

Morgon
источник
Затем до 4-х обратных косых черт, если JavaScript сам является строковой константой на каком-то другом языке.
Brilliand
2
Затем до 8 обратных косых черт, если этот другой язык сам по себе является строковой константой еще на одном языке :)
daniel1426
1
Это имеет переполнение стека, когда строка рекурсивно экранируется
Джефф Дэвис
7

Предложенный Крисом метод, вероятно, можно адаптировать для работы с функциями jQuery.

var element = document.getElementById('content Module');
$(element) ... ;
ceejayoz
источник
1
Ааа! Надо было прокрутить дальше!
gotomanners
2

Идея попробовать:

$("#content" + &amp;#032; + "Module").whatever()

$("#content" + %20 + "Module").whatever()

Точка с запятой может вызвать ошибку javascript. Также рекомендую изменить ID, чтобы в нем не было пробелов.

Также попробуйте document.getElementByID("content Module")

Крис Клепейс
источник
1
document.getElementByID предоставит мне обычный объект, и тогда я не смогу выполнять функции jQuery, которые ищу. Однако в подобных обстоятельствах это было бы хорошим решением.
Джефф Дэвис,
1
Не $(document.getElementByID("content Module"))дал бы вам объект jquery?
gotomanners
1

Это сработало для меня.

document.getElementById(escape('content Module'));
ххх
источник
0

Хотя технически недопустимо иметь пробел в значении атрибута ID в HTML , на самом деле вы можете выбрать его с помощью jQuery.

См. Http://mothereffingcssescapes.com/#content%20module :

<script>
  // document.getElementById or similar
  document.getElementById('content module');
  // document.querySelector or similar
  $('#content\\ module');
</script>

jQuery использует синтаксис, подобный Selectors API, поэтому вы можете использовать $('#content\\ module');для выбора элемента с помощьюid="content module" .

Чтобы настроить таргетинг на элемент в CSS, вы можете избежать его следующим образом:

<style>
  #content\ module {
    background: hotpink;
  }
</style>
Матиас Байненс
источник
0

это может сработать, если вы хотите, чтобы элемент имел точное значение идентификатора

$("[id='content Module']").whatever();

но если вы хотите проверить, есть ли у элемента только один из них (как и класс) с другими идентификаторами или без них

$("[id~='content']").whatever();

это выберет элемент, если он имеет id="content"или id="content Module"илиid="content Module other_ids"

Роберт
источник
0

В своем случае я обнаружил, что escape не работает, потому что он заменяет пробелы на% 20. Вместо этого я использовал replace, например, чтобы заменить h1 страницы на текст элемента списка. Если в меню есть:

<li id="Contact Us"\>Contact Us</li>

function setTitle(menu) {
    $("h1").text( $("li#" + menu.replace(" ", "\\ ")).text() );
}
Мартин
источник
0

У меня были проблемы с идентификаторами элементов, содержащими запятые и / или пробелы в jQuery, поэтому я сделал это, и это сработало как шарм:

var ele = $(document.getElementById('last, first'));

Это имеет пробелы и не работает:

var ele = $('#last, first');

Это запятая и не работает:

var ele = $('#last,first');

Стивен Спунгин
источник
0

Экранирование любого разного символа в селекторе (вместе с пробелами) .

var escapeSelector = function(string) {
  string = string||"";
  if (typeof string !== 'string') return false;
    return string.replace( /(:|\.|\[|\]|,|=|@|\s|\(|\))/g, "\\$1" );

}
console.log($("div[data-id="+escapeSelector("Document (0).json")+"]").text());   
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div data-id="Document (0).json">Howdy</div>

Донован П.
источник