2010-02-05 26 views
2

我想知道如何保存對使用jquery的對象(this)的引用。我的意思是,例如,當我的用戶點擊他的頁面中的任何元素時,我想要將對象的引用發送到我的網絡服務器,並且下次用戶調用服務器時,我將保存的引用發送回瀏覽器,並執行其他操作像fadeIn()...到目前爲止我已經嘗試使用JSON.stringify(this)和JSON.stringify($(this)),但都似乎沒有工作。我也嘗試保存元素ID和類和類型,所以下次用戶調用它們時,我可以使用選擇器,但由於我想在任何網站上使用該腳本,因此可能不是使用選擇器的理想選擇。有沒有什麼辦法可以確切地引用元素並將其發送到服務器?用jQuery引用元素的最佳方式?

回答

7

不,到DOM元素的引用只有一個DOM實例(所以即使你重新加載在同一頁,參考文獻將不再工作)內工作。你將不得不使用選擇器。如果你確定頁面結構不改變,以獲得相同元素的最簡單的方法是這樣的:

// Get numeric index of element on page. 
var index = $('*').index(this); 

// Restore element. 
var $this = $('*').eq(index); 

您可以通過使用ID和班級在可能讓它從換頁更安全。

看一看這個腳本:http://paste.blixt.org/297640

這裏的它的簡化版本,不依賴於類/ IDS:

jQuery.fn.getPath = function() { 
    if (this.length != 1) throw 'Requires one element.'; 

    var path, node = this; 
    while (node.length) { 
     var realNode = node[0], name = realNode.localName; 
     if (!name) break; 
     name = name.toLowerCase(); 

     var parent = node.parent(); 

     var siblings = parent.children(name); 
     if (siblings.length > 1) { 
      name += ':eq(' + siblings.index(realNode) + ')'; 
     } 

     path = name + (path ? '>' + path : ''); 
     node = parent; 
    } 

    return path; 
}; 

像這樣來使用:

// Get selector for element. 
var path = $(this).getPath(); 

// Get element using selector. 
var $this = $(path); 
+0

是的,這是完美的...我曾在ids和eq很多,但我忘了我們可以設置上下文!哈哈這正是我想要的,謝謝:) – 2010-02-05 12:09:36

1

雖然我不認爲有一種方法可以完全按照您的要求進行,但我會建議在您希望以這種方式保存的元素上放置一個ID。然後,您可以保存並稍後使用ajax從服務器檢索該ID。

你的選擇會是這個樣子:

var saveId = $(this).attr('id'); 

我不相信,這將在「任何網站」爲你指明工作,但如果你控制了現場,你可以確保所有你希望保存的元素有一個ID,並且在一個頁面上的所有ID必須是唯一的,你應該能夠實現這一點 - 在這個限制之內。

1

您可以保存selector字段,以便日後可以選擇它。就像這樣:

var Elements = $('body').find('.container').find('div.controls'); // Just some complex selection 
... 
var ToSave = Elements.selector; 
AJAXSave('Elements', ToSave); 
// ToSave will be 'body .container div.controls' which is the elements we are talking about. 
... 
var LastElements = $(AJAXLoad('Elements'));
+0

這隻有當jQuery對象僅使用選擇器檢索時纔會有效。例如,'$(aDomElement)'的結果不會有有效的'.selector'屬性。 – Blixt 2010-02-05 12:10:01