2010-07-27 2 views
10

Как говорится в заголовке, я продолжаю получать «неопределенные», когда пытаюсь получить атрибут id элемента, в основном то, что я хочу сделать, это заменить элемент с полем ввода, когда значение «другое».

Вот код:

function showHideOther(obj){ 

    var sel = obj.options[obj.selectedIndex].value; 
    var ID = $(this).attr("id"); 

    alert(ID); 


    if(sel=='other'){ 

     $(this).html("<input type='text' name='" + ID + "' id='" + ID + "' />"); 

    }else{ 
     $(this).css({'display' : 'none'}); 
    } 
} 

HTML-:

  <span class='left'><label for='race'>Race: </label></span> 
      <span class='right'><select name='race' id='race' onchange='showHideOther(this);'> 
      <option>Select one</option> 
      <option>one</option> 
      <option>two</option> 
      <option>three</option> 
      <option value="other">Other</option> 
      </select> 
      </span> 

Это, вероятно, что-то маленькое, что я не заметил,, что я делаю неправильно?

Thanx заранее!

ответ

2

Из-за способа вызова функции (т. Е. Как простого вызова функциональной переменной) this является глобальным объектом (для которого window является псевдонимом в браузерах). Вместо этого используйте параметр obj.

Кроме того, создание объекта jQuery и использование метода attr() для получения идентификатора элемента является неэффективным и ненужным. Просто используйте свойство элемента id, которое работает во всех браузерах.

function showHideOther(obj){ 
    var sel = obj.options[obj.selectedIndex].value; 
    var ID = obj.id; 

    if (sel == 'other') { 
     $(obj).html("<input type='text' name='" + ID + "' id='" + ID + "' />"); 
    } else { 
     $(obj).css({'display' : 'none'}); 
    } 
} 
0

Что вы ожидаете от $(this)?

Возможно, вы имеете в виду sel.attr("id");?

0

В функции контексте «это» его виду не выбор элемента, а на страницу самого

  • Изменение var ID = $(this).attr("id"); к var ID = $(obj).attr("id");

Если OBJ уже jQuery Object, просто удалите вокруг него $().

5

ваш использование this в функции, когда вы должны использовать параметр.

Вы только использовать $ (это) в функции обратного вызова ... от выборов, как

$('a').click(function() { 
    alert($(this).href); 
}) 

В заключение, надлежащим образом (используя ваш пример кода) будет делать это

obj.attr('id');

+1

"this" будет всегда ссылаться на объект, в котором вы работаете. И его можно использовать где угодно. Конечно, если вы знаете, что делаете. – GerManson

+1

вместо '$ (this) .href', вы можете просто' this.href', а также 'obj.id' ... btw,' obj.attr ('id'); 'должен быть' $ (obj) .attr ('id'); 'на основе OP ... – Reigel

9

Изменение

var ID = $(this).attr("id"); 

в

var ID = $(obj).attr("id"); 

Также вы можете изменить его, чтобы использовать JQuery обработчик события:

$('#race').change(function() { 
    var select = $(this); 
    var id = select.attr('id'); 
    if(select.val() == 'other') { 
     select.replaceWith("<input type='text' name='" + id + "' id='" + id + "' />"); 
    } else { 
     select.hide(); 
    } 
}); 
+0

obj похоже, что это уже объект jQuery. – efritz

+0

Если это передано из атрибута onchange = "", это будет ссылка на HTMLElement, а не объект jQuery – fantactuka

1

Удалить inline event handler и сделать это укомплектовать ненавязчивым, как

​$('​​​​#race').bind('change', function(){ 
    var $this = $(this), 
     id = $this[0].id; 

    if(/^other$/.test($(this).val())){ 
     $this.replaceWith($('<input/>', { 
      type: 'text', 
      name: id, 
      id: id 
     })); 
    } 
});​​​ 
+0

+1 для ненавязчивого подхода! –

+0

Почему ...........? –

+0

Это намного чище и обслуживаемо – fantactuka

0

Я рекомендую вам прочитать больше о this keyword ,

Вы не можете ожидать «этого», чтобы выбрать тег «select» в этом случае.

Что вы хотите сделать в этом случае, это использовать obj.id, чтобы получить идентификатор тега select.

2

Вы также можете написать всю свою функцию как расширение jQuery, чтобы вы могли что-то делать по строкам `$ ('# element'). ShowHideOther();

(function($) { 
    $.extend($.fn, { 
     showHideOther: function() { 
      $.each(this, function() { 
       var Id = $(this).attr('id'); 
       alert(Id); 

       ... 

       return this; 
      }); 
     } 
    }); 
})(jQuery); 

Не то, чтобы он отвечал на ваш вопрос ... Просто пища для размышлений.

0

Вы можете сделать

onchange='showHideOther.call(this);'

вместо

onchange='showHideOther(this);'

Но вы также должны заменить obj с this в функции.