2011-12-12 25 views
5

Tôi đang cố gắng để tìm hiểu một số jQuery, và tôi thiết lập một trang thử nghiệm với đoạn mã sau:Tham khảo đối tượng bộ chọn ngay lập tức với jQuery?

<a id='encode' href='javascript: void(0)'>encode</a> | 
<a id='decode' href='javascript: void(0)'>decode</a> | 
<br/> 
<textarea id='randomString' cols='100' rows='5'></textarea> 

<script type='text/javascript'> 
$(document.ready(function() { 
    $('#encode').click(function() { 
    $('#randomString').val(escape($('#randomString').val())); 
    }); 
    $('#decode').click(function() { 
    $('#randomString').val(unescape($('#randomString').val())); 
    });  
}); 
</script> 

Ý tưởng là tôi có thể đặt một cái gì đó trong textarea và nhấp vào một trong hai "mã hóa" hay "giải mã", và nó sẽ thoát hoặc không nhìn thấy những gì tôi đưa vào vùng văn bản.

Mã này hoạt động tốt, nhưng câu hỏi của tôi phải làm với cách tôi thay đổi giá trị của vùng văn bản. Trong mã của tôi, tôi đang chọn giá trị textarea hai lần: một lần để (un) thoát nó, và một lần nữa để thay đổi giá trị. IMO điều này có vẻ khó khăn và có thể không cần thiết. Tôi nghĩ có lẽ tôi có thể làm một cái gì đó giống như thay vì điều này:

$('#randomString').val(escape(this)); 

Nhưng this dường như đề cập đến đối tượng của liên kết tôi nhấp, không phải là chọn #randomString, như vậy là có một số câu thần chú khác tôi có thể sử dụng để tham khảo mà $('#randomString')?

Trả lời

1

Câu trả lời ngắn gọn, nếu tôi hiểu bạn một cách chính xác, là không. Không có cách nào để tham chiếu đến $('#randomString') nơi bạn đang nói đến. Nó chỉ là một tham số cho phương thức val, vì vậy nó chỉ là cú pháp JavaScript đơn giản, không có jQuery "ma thuật".

Để hoàn thành nhiệm vụ trong tầm tay và làm cho đoạn code sạch hơn và ít phiền phức, tôi sẽ tiết kiệm ra khỏi đối tượng jQuery cho #randomString vì vậy bạn không cần phải liên tục tạo nó:

$(document.ready(function() { 
    var $rndStr = $('#randomString'); 

    $('#encode').click(function() { 
     $rndStr.val(escape($rndStr.val())); 
    }); 

    $('#decode').click(function() { 
     $('#rndStr').val(unescape($rndStr.val())); 
    });  
}); 
+0

Được rồi, điều này có vẻ giống như nguyên tắc như câu trả lời của ShankarSangoli nhưng bạn chỉ cần tạo đối tượng một lần (mà tôi đồng ý là sạch hơn). Như đã đề cập trong bình luận của tôi với câu trả lời của anh ta, có vẻ như phải có cách để ám chỉ nó bằng cách nào đó ... Ý tôi là JS cần một tham chiếu để làm cho phương pháp xích có thể ở vị trí đầu tiên đúng không? – slinkhi

+0

Chuỗi phương thức jQuery được thực hiện bằng cách trả về đối tượng jQuery từ phương thức '$()' (và hầu hết các phương thức jQuery khác được gọi sau đó), vì vậy đó là nơi tham chiếu đến từ trong trường hợp đó. Những gì bạn đang hỏi về sẽ là một tính năng trong JavaScript để tham chiếu đến đối tượng mà trên đó một phương thức được gọi. – FishBasketGordo

4
$('#randomString').val(escape(this)); 

Điều này không nhận được đối tượng bạn muốn. Đó là một cách hiệu quả tương đương để làm điều này:

var foo = escape(this); 
$('#randomString').val(foo); 

this chỉ có nghĩa một cái gì đó khác nhau khi bạn bắt đầu một phạm vi mới với định nghĩa hàm.

jQuery không cung cấp các loại chức năng với một tùy chọn gọi lại:

$('#randomString').val(function (idx, oldVal) { 
    return escape(oldVal); 
}); 

Tham số thứ hai là giá trị hiện tại của nguyên tố này; giá trị trả lại đặt giá trị mới cho phần tử.

+0

ah không sao, đây là nhiều hơn một chút "này" .. có vẻ như có một cái gì đó thanh lịch hơn và đơn giản để tham khảo các đối tượng ngay lập tức nhất được lựa chọn, nhưng tôi đoán điều này có lẽ là tốt vì nó được – slinkhi

3

Bạn có thể thử này

$(document.ready(function() { 

    $('#encode').click(function() { 
    var $randomString = $('#randomString'); 
    $randomString.val(escape($randomString.val())); 
    }); 
    $('#decode').click(function() { 
    var $randomString = $('#randomString'); 
    $randomString.val(unescape($randomString.val())); 
    });  
}); 
+0

Cho các mục đích của mã ví dụ của tôi, đây thực sự là mã hơn, nhưng tôi đoán cuối cùng điều này có lẽ là những gì tôi đang tìm kiếm, hoặc gần nhất với nó. Tôi vẫn nghĩ rằng có thể (hoặc nên) là một cách để $ ([selector]). Một cái gì đó ([referencetoselector]) mặc dù ... Tôi có nghĩa là đó là toàn bộ các điểm của chuỗi công cụ ... SOMEWHERE có phải là một tài liệu tham khảo cho js để sử dụng, nếu không phương pháp chuỗi sẽ không thể! – slinkhi

1

Bạn có thể làm cho nó một chút chung:

$.fn.applyVal = function(func) { 
    return this.each(function() { 
     $(this).val(func($(this).val())); 
    }); 
}; 

Sau đó, các cuộc gọi sau đây là đủ:

$('#randomString').applyVal(escape); 
+0

Nếu bạn muốn làm cho nó chung chung, bạn có lẽ nên xử lý các trường hợp có nhiều hơn một yếu tố đã được chọn. – lonesomeday

+0

@lonesomeday: Bạn chính xác, mặc dù .val cũng chỉ hoạt động trên phần tử đầu tiên. – pimvdb

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