2010-07-27 33 views
10

như tiêu đề cho biết, tôi tiếp tục nhận được "không xác định" khi tôi cố gắng lấy thuộc tính id của phần tử, về cơ bản những gì tôi muốn làm là thay thế một phần tử với một hộp đầu vào khi giá trị là "khác".

Đây là mã:

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> 

Nó có lẽ là một cái gì đó nhỏ mà tôi không nhận thấy, những gì tôi làm sai?

Thanx trước!

Trả lời

2

Do cách thức hàm được gọi (tức là một cuộc gọi đơn giản đến một biến chức năng), this là đối tượng chung (trong đó window là một bí danh trong trình duyệt). Sử dụng thông số obj để thay thế.

Ngoài ra, việc tạo đối tượng jQuery và sử dụng phương thức attr() để lấy ID phần tử không hiệu quả và không cần thiết. Chỉ cần sử dụng thuộc tính id của phần tử, hoạt động trong tất cả các trình duyệt.

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

Bạn đang mong đợi gì $(this) để tham khảo?

Bạn có nghĩa là sel.attr("id"); có lẽ không?

0

Trong bối cảnh chức năng "này" nó không đề cập đến các yếu tố lựa chọn, nhưng để trang tự

  • Thay đổi var ID = $(this).attr("id"); để var ID = $(obj).attr("id");

Nếu obj là đã là một jQuery Object, chỉ cần loại bỏ $() xung quanh nó.

5

sử dụng this trong một hàm, khi bạn nên sử dụng tham số.

Bạn chỉ sử dụng $ (this) trong callbacks ... từ các lựa chọn như

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

Cuối cùng, cách thích hợp (sử dụng ví dụ mã của bạn) sẽ thực hiện điều này

obj.attr('id');

+1

"this" sẽ luôn đề cập đến đối tượng bạn đang làm việc BẬT. Và nó có thể được sử dụng ở mọi nơi. Tất nhiên, nếu bạn biết những gì bạn đang làm. – GerManson

+1

thay vì '$ (this) .href', bạn chỉ có thể' this.href' và cũng 'obj.id' ... btw,' obj.attr ('id'); 'nên là' $ (obj) .attr ('id'); 'dựa trên OP ... – Reigel

9

Thay đổi

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

để

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

Ngoài ra bạn có thể thay đổi nó để sử dụng jQuery xử lý sự kiện:

$('#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 có vẻ như nó đã là một đối tượng jQuery. – efritz

+0

Nếu nó được chuyển từ thuộc tính onchange = "", nó sẽ là tham chiếu đến HTMLElement, không phải là đối tượng jQuery – fantactuka

1

Tháo inline event handler và làm điều đó hoàn toàn không phô trương, giống như

​$('​​​​#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 cho cách tiếp cận kín đáo! –

+0

Tại sao ...........? –

+0

Nó sạch hơn và dễ bảo trì hơn – fantactuka

0

tôi khuyên bạn nên đọc thêm về this keyword .

Bạn không thể mong đợi "điều này" để chọn thẻ "chọn" trong trường hợp này.

Điều bạn muốn làm trong trường hợp này là sử dụng obj.id để lấy id của thẻ đã chọn.

2

Bạn cũng có thể viết toàn bộ chức năng của mình dưới dạng tiện ích mở rộng jQuery, vì vậy bạn có thể làm điều gì đó dọc theo dòng `$ ('# element'). ShowHideOther();

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

       ... 

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

Không phải là câu trả lời cho câu hỏi của bạn ... Chỉ cần ăn để suy nghĩ.

0

Bạn có thể làm

onchange='showHideOther.call(this);'

thay vì

onchange='showHideOther(this);'

Nhưng sau đó bạn cũng cần phải thay thế obj với this trong hàm.

Các vấn đề liên quan