2011-11-03 52 views
0

我不認爲我是第一個遇到這個問題,但我沒有找到一種方法來搜索這個沒有得到與這個問題無關的結果。jQuery全局選擇「緩存」

我採用的「緩存」重複的jQuery選擇不那麼擴展好的做法到像var element = $('#element');瓦爾防止「DOM庫搜索」,每重複使用的元素

我遇到的問題是,現在我正在做一個函數內的緩存。喜歡的東西:

function functionname (id) { 
    var id = $('#'+id); 
    //extra stuff 
} 

我不是專家在變量的範圍,但我不能夠做

functionname ('some-div-id'); 
some-div-id.dialog('open'); 

所以我敢肯定這是因爲在函數內部創建的變量不在函數本身之外可訪問。

於是我想出了

function functionname (id) { 
     window.id = $('#'+id); 
     //extra stuff 
} 

,但如果我嘗試做window.some-div-id.dialog('open');我得到TypeError: 'undefined' is not a function

我缺少什麼?我相信這是一個小小的愚蠢的東西,但我錯過了它,就在我眼前。

感謝


編輯

謝謝大家,但你失去了一些東西。 代碼建議缺少內部「全局」變量名稱是動態的事實:

var CACHEobject = {};

function doSomething (NAMEHERE) { //note the function parameter 
    CACHEobject.NAMEHERE = $('#'+NAMEHERE); 
} 

所以這個想法是該函數創建一個與#element_id同名的javascript變量。如果我通過一個名稱的功能應該與名稱選擇HTML標識和名稱相同的「緩存它」到一個全局變量:

doSomething('myDialogOne'); doSomething('myDialogTwo'); 

,所以我以後可以做

CACHEobject.myDialogOne.dialog('open'); CACHEobject.myBox.dialog('close'); 

回答

1

這是你想要的(基於關閉編輯):

var CACHEobject = {}; 
function doSomething(id) { 
    CACHEobject[id] = $('#' + id); 
} 
+0

最後!我知道這並不複雜,我錯過了[東西]。感謝@mikeycgto – Juan

0
window.some-div-id.dialog('open'); 

被解釋爲:

window.some - div - id.dialog('open'); 

即減法,這引起三個未定義的變量,其中之一是id.dialog瓦特在嘗試作爲函數執行時會導致錯誤。

對於特殊字符,請使用:

window["some-div-id"].dialog('open'); 

,並定義:

window[id] = $("#" + id); 

無論如何,我勸你不要使用全局變量。你最好重寫jQuery函數來實現緩存(使用一個對象,其中的選擇器作爲鍵和匹配的元素作爲值)。

+0

我沒有使用「 - 」 S的ID名稱,我從來沒有這樣做,我只是把他們的例子更可讀 – Juan

+0

@Juan:我認爲你確實需要'window [id] = ...'而不是'window.id'。 – pimvdb

+0

謝謝@pimvdb,但仍然相同的問題:TypeError:'undefined'不是一個函數(評估'窗口['mensajes']。對話框('打開')') – Juan

0

你可以在函數之外聲明該變量。

var $foo; 

function some_function(id) { 
    $foo = $('#' + id); 
} 
+0

謝謝,但在您的代碼中,緩存var名稱在函數內不是動態的。請看我的問題編輯。 – Juan

1

你的想法很好。爲此設置一個對象。下面是使用STASH作爲高速緩存對象的示例:

<html> 
<script src="http://code.jquery.com/jquery-latest.js"></script> 
<script> 
var STASH = {}; 
$(document).ready(function(){ 

    // stash your elements 
    STASH.item = $('#item'); 
    STASH.otherItem = $('#otherItem'); 


    // do stuff to them 
    STASH.item.css({ 
     color: '#f00' 
    }); // sets #item to red 
    alert(STASH.otherItem.text()); // alerts foo 
}); 
</script> 
<style></style> 
<body> 
    <div id="item">bar</div> 
    <div id="otherItem">foo</div> 
</body> 
</html> 
+0

謝謝,但在你的代碼中,緩存var名稱在函數內部不是動態的。看到我的問題編輯請 – Juan

0
function setDialog(selector) { 
    window.$dialogElem = $(selector); 
    //window.dialogSelector = selector; 
} 

var id= 'mensajes'; 
setDialog('#'+id); 
window.$dialogElem.dialog(); 
//$(window.dialogSelector).dialog(); 

評論東西是需要較少存儲器的替代方案。但爲什麼地獄使用窗口?檢查this fiddle各種簡單的技術。