JQuery: установить заголовок метки в "для"-атрибут его

Это мой код:

$(document).ready(function(){
  $("label").attr({
    title: getTitle($(this).attr('for')),
    className: "something" 
  });

  function getTitle(val) {
    return "blubb "+val;
  }
});

Функция getTitle(val) возвращает мне "blubb undefined" вместо "blubb contact_properties_list_18". В чем может быть проблема?

<label class="something" for="contact_properties_list_18" title="blubb undefined">Sonstige</label>

1 ответ

this где вы используете это не относится к метке. JQuery не говорит, что this будет в пределах ready обработчик.

Вы можете использовать версию attr который принимает функцию:

$("label").attr("title", function() {
    this.className = "something";
    return getTitleFor(this.htmlFor);
});

$("label").attr("title", function() {
    this.className = "something";
    return this.htmlFor;
});
.something {
  color: green;
}
<label for="foo">foo</label>
<label for="bar">bar</label>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

... но так как вы делаете две вещи, я бы, вероятно, использовал each:

$("label").each(function() {
    this.title = getTitleFor(this.htmlFor);
    this.className = "something";
});

$("label").each(function() {
    this.title = this.htmlFor;
    this.className = "something";
});
.something {
  color: green;
}
<label for="foo">foo</label>
<label for="bar">bar</label>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>


Обратите внимание, что я использовал htmlFor просто чтобы избежать ненужного создания экземпляра jQuery. htmlFor отражает for свойство (с универсальной поддержкой браузера). Точно так же title свойство элемента DOM отражает title атрибут, так что присвоение этому также работает.

Другие вопросы по тегам