我想用jQuery的data()
api檢索元素的所有數據屬性。但是這個API的緩存特性真的很煩人。有時我需要在JavaScript中更改某個元素的某些數據屬性,但data()
api始終返回每個數據屬性的初始值。因此,我必須使用attr()
來訪問元素的每個數據屬性以獲取其最新值。有沒有什麼辦法來克服這個緩存的事情,並讓data()
總是返回每次我打電話時的最新值?當元素數據發生變化時,jQuery的data()屬性不會更新
9
A
回答
16
簡短的回答是:不要使用jQuery .data()來動態設置數據屬性,除非您可以保證數據屬性總是由jQuery設置。
下面兩種解決方案將工作:
- 使用DOM,而不是
- 使用jQuery .attr(),而不是
這裏的relevant part from the jQuery documentation(我不認爲真正凸顯這個多少錢可能會驚訝jQuery用戶):
數據屬性被拉第一次d ata屬性被訪問,然後不再被訪問或變異(所有的數據值,然後內部存儲在jQuery)。
至於爲什麼你可能不使用 jQuery來設置屬性:許多客戶端模板語言構建DOM,包括數據屬性。
鑑於動態生成HTML(如圖DevTools:
<form data-test="300" ...
DOM API道出了實情:
document.querySelector('form').getAttribute('data-test');
JQuery的返回了過期前值(在此19000):
$('form').data('test');
jQuery attr也r E打開當前值:
$('form').attr('data-amount');
1
您還可以使用jQuery的.removeData()方法更新數據屬性重置其緩存後。
例如:
> document.querySelector('.sub-panels')
<div class="sub-panels">…</div>
> document.querySelector('.sub-panels').setAttribute('data-test', 300);
undefined
> document.querySelector('.sub-panels')
<div class="sub-panels" data-test="300">…</div>
> $('.sub-panels').data('test')
300
> document.querySelector('.sub-panels').setAttribute('data-test', 400);
undefined
> $('.sub-panels').data('test')
300
> $('.sub-panels').removeData();
[div.sub-panels, prevObject: jQuery.fn.init(1), context: document, selector: ".sub-panels"]
> $('.sub-panels').data('test')
400
相關問題
- 1. 當依賴屬性發生變化時,Ember計算屬性不會更新
- 2. 當data-l10n-id屬性發生變化時,innerhtml的值不會改變
- 3. 當WebRTC回調內的屬性發生變化時,Vue.js更新不會觸發
- 4. 當元素的````屬性發生變化時,是否會觸發事件?
- 5. jquery - 當圖片源發生更改時更改元素屬性
- 6. 當服務屬性發生變化時,角度過濾器不會更新
- 7. AngularJS:當底層數據發生變化時,過濾數據不會更新
- 8. 當屬性發生變化時如何更新用戶界面
- 9. 當底層數據發生變化時,Cursorloader不會刷新
- 10. 當Angular2屬性發生更改時,數據綁定不會更新
- 11. 當我的GamePieces的ArrayList發生變化時,JPanel不會更新
- 12. 當輸入數據發生變化時,AngularJs不更新模型
- 13. 當綁定的ObservableCollection發生變化時,ListView不會更新
- 14. 更新li元素的屬性data-id Nestable不更新
- 15. 當綁定的數據發生變化時,Winforms listbox不會更新
- 16. 當數據庫發生變化時,Heroku部署的Django網頁不會更新
- 17. d3 +主幹:更新數據發生變化的元素
- 18. 當數據發生變化時,異步更新asp.net轉發器
- 19. 當一個元素屬性發生變化時,javascript回調函數
- 20. 當綁定列表中的對象屬性發生變化時,datagrid單元格不會更新
- 21. 當Firebase數據發生變化時,Google Charts不會得到更新
- 22. 當底層對象發生變化時,ListView不會更新
- 23. 當價值發生變化時,AngularJs ng-class不會更新
- 24. 當事件源發生變化時,viewRender不會更新日曆
- 25. 當ObservableCollection對象發生變化時,ListView不會更新
- 26. GWT - 當潛在列表發生變化時,CellList不會更新
- 27. 當資源發生變化時,靜態綁定不會更新
- 28. 當CascadingDropDown selectedindex發生變化時,ASP.NET標籤不會更新
- 29. DataGrid不更新時,項目屬性發生變化
- 30. 當數據源發生變化時,dataSource中的數據不會刷新[解決]
這不是一個緩存的事情,'數據()'將數據存儲在內部,並且不改變數據的屬性,如果你要改變你應該使用'某種原因屬性attr()',但如果您一直使用'data()'來設置和獲取數據,那麼這不應該成爲問題,因爲您會得到正確的數據。 – adeneo
_「有時我需要改變JavaScript中某個元素的某些數據屬性」_ - 爲什麼?如果您需要在頁面加載後針對元素存儲數據,則可以使用'.data('key','value')'。這不會將數據存儲爲屬性,但那又如何? – nnnnnn
@nnnnnn每個客戶端模板語言都會構建DOM,其中可能包含數據屬性,並且很可能不會使用jQuery。 – mikemaccana