2011-12-12 106 views
5

我想學習一些jQuery和我設置用下面的代碼測試頁:引用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> 

的想法是,我可以把東西在文字區域,並單擊「編碼」或「解碼」,它可能會逃避或忽略我投入文字區的內容。

這段代碼工作得很好,但我的問題與我如何改變textarea的值有關。在我的代碼中,我選擇了textarea值兩次:一次到(un)轉義它,並再次改變值。 IMO看起來很笨重,也許沒有必要。我想也許我可以做這樣的事情,而不是:

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

this似乎是指我點擊了鏈接,而不是#randomString選擇的對象,所以有一些其他的魔法的話,我可以用它來引用$('#randomString')

回答

1

簡短的回答,如果我正確理解你,不是。沒有辦法參考你所談論的$('#randomString')。它只是val方法的一個參數,所以它只是簡單的JavaScript語法,沒有jQuery「magic」。

爲了完成手頭的任務,使代碼更清潔,少笨重,我會保存關閉#randomString jQuery對象,這樣你就不必不斷創建它:

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

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

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

好吧,這看起來像ShankarSangoli的答案一樣,但你只需創建一個對象(我同意這個對象更清潔)。正如我在他的回答中所提到的,似乎有必要以某種方式引用它......我的意思是JS需要一個參考,以使方法鏈可能在第一個地方是正確的? – slinkhi

+0

jQuery方法鏈接是通過從'$()'方法(以及隨後調用的大多數其他jQuery方法)返回jQuery對象來實現的,所以這就是引用來自這種情況的地方。你問的是JavaScript中的一個特性來引用調用方法的對象。 – FishBasketGordo

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

這沒有得到你想要的對象。它實際上是這樣做的相當於:

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

this只意味着不同的東西,當你開始用一個函數定義的新範圍。

jQuery不會提供這種功能與回調選項:

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

第二個參數是該元件的電流值;返回值爲元素設置了一個新值。

+0

沒關係啊,這是不僅僅是一個簡單的「this」..似乎應該有一些更優雅和簡單的指向最直接的對象選擇,但我想這可能是一樣好,因爲它得到 – slinkhi

3

你可以試試這個

$(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

爲我的示例代碼的目的,這實際上是更多的代碼,但我想最終這可能是我正在尋找的,或者最接近它的。我仍然認爲可以(或應該)成爲$([selector])的一種方式。something([referencetoselector])雖然...我的意思是這是鏈接的東西的整個點...有些東西需要參考js使用,否則鏈接方法將不可能! – slinkhi

1

你可以把它一點點通用:

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

然後下面的調用就足夠了:

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

如果您想使其具有通用性,您應該可以處理選擇了多個元素的情況。 – lonesomeday

+0

@lonesomeday:你是對的,雖然.val也只適用於第一個元素。 – pimvdb