Có cách nào để tôi có thể kiểm tra nếu một thuộc tính dữ liệu tồn tại không?


190

Có cách nào để tôi có thể chạy như sau:

var data = $("#dataTable").data('timer');
var diffs = [];

for(var i = 0; i + 1 < data.length; i++) {
    diffs[i] = data[i + 1] - data[i];
}

alert(diffs.join(', '));

Chỉ khi có một thuộc tính được gọi là bộ đếm thời gian dữ liệu trên phần tử có id là #dataTable?


Một lưu ý cần lưu ý là đôi khi sẽ không có bất cứ thứ gì được lưu trữ trong một data-thuộc tính nhưng sẽ có dữ liệu được lưu trữ trong jQuery và ngược lại.
Alex W

Câu trả lời:


295
if ($("#dataTable").data('timer')) {
  ...
}

LƯU Ý điều này chỉ trả về truenếu thuộc tính dữ liệu không phải là chuỗi rỗng hoặc giá trị "falsey", vd 0hoặc false.

Nếu bạn muốn kiểm tra sự tồn tại của thuộc tính dữ liệu, ngay cả khi trống, hãy làm điều này:

if (typeof $("#dataTable").data('timer') !== 'undefined') {
  ...
}

35
Một lựa chọn khác cho bạn : if ($("#dataTable[data-timer]").length) { ... }.
VisioN

101
Hãy cẩn thận! Điều này chỉ đánh giá là đúng nếu bộ đếm thời gian dữ liệu có giá trị. Nếu nó hiện diện, nhưng trống rỗng, nó sẽ trả về false.
Kong

15
Kong nói đúng, nếu có một giá trị trống thì mã của bạn không hoạt động. Sử dụng cái này thay thế: if (typeof $ ("# dataTable"). Attr ('data-timer')! == "không xác định") {...}
PierrickM

22
Một phiên bản khác cung cấp cho bạn một boolean thực tế cho điều kiện của bạn : if ( $("#dataTable").is("[data-timer]") ) { ... }. Nó cũng hữu ích hơn nếu bạn đã có một tham chiếu đến bảng trong một đối tượng jQuery khác.
Noyo

10
Nó sẽ trả về false nếu giá trị tồn tại và bằng 0. Điều này là kỳ quặc.
Gherman

111
if (typeof $("#dataTable").data('timer') !== 'undefined')
{
    // your code here
}

@VisioN Một sự kết hợp không an toàn giữa nhận xét của bạn và PierrickM về câu trả lời này : if (typeof $('#dataTable').data('timer') !== 'undefined') ....
WynandB

3
@Wynand. Cập nhật để phản ánh bình luận của bạn và VisioN.
Paul Fleming

1
@flem Bạn cũng cần thêm vào typeofséc
Brendan Bullen

1
@flem, @VisioN, cách tiếp cận của bạn không thành công trong trường hợp không có thuộc tính dữ liệu, nhưng dữ liệu vẫn được đặt bằng phương thức .data (), vd $('#dataTable').data('timer', Date.now()). Có vẻ như OP muốn kiểm tra xem thuộc tính dữ liệu thực tế có ở đó không. Giải pháp của @ niiru (hoặc giải pháp bạn đưa ra trong một nhận xét cho giải pháp đó) là tốt hơn, trong trường hợp này.
Noyo

1
@VisioN Đối với tôi, đó là về việc kiểm tra undefinedmột cách nhất quán. Chúng tôi biết tại sao typeofđược sử dụng để kiểm tra undefinedtrong một số trường hợp, nhưng tôi muốn tìm thấy nó khó hiểu nhìn thấy nó đang được kiểm tra với typeof ở một nơi và không ở nơi khác. Bên cạnh đó, nó không phải như sử dụng typeofthêm hiệu ứng nhiều hơn phức tạp mã. Nó có thể rõ ràng hơn, có thể là dư thừa nhiều nhất nhưng hầu như không quá phức tạp. Tôi thấy quan điểm của bạn mặc dù, nhưng tôi nói rằng không sử dụng nó sẽ là quá đơn giản. ;]
WynandB

37

Vì lợi ích của việc cung cấp một câu trả lời khác với những câu hỏi trên; bạn có thể kiểm tra nó Object.hasOwnProperty(...)như thế này:

 if( $("#dataTable").data().hasOwnProperty("timer") ){
     // the data-time property exists, now do you business! .....
 }

cách khác, nếu bạn có nhiều yếu tố dữ liệu bạn muốn lặp đi lặp lại, bạn có thể biến đổi .data()đối tượng và lặp lại nó như thế này:

 var objData = $("#dataTable").data();
 for ( data in objData ){
      if( data == 'timer' ){
            //...do the do
      }
 }

Không nói giải pháp này tốt hơn bất kỳ giải pháp nào khác ở đây, nhưng ít nhất đó là một cách tiếp cận khác ...


9
Điều này rất thú vị, nhưng cần lưu ý rằng nếu bạn có thuộc tính data-foo-barthì kiểm tra của bạn cần phải .data().hasOwnProperty("fooBar"), chứ không phải.data().hasOwnProperty("foo-bar")
dgmstuart

Thú vị trong trường hợp này với trình xác nhận javascript. Kiểu trả về không xác định, nhưng điều này đã làm việc!
Richard Housham

12

Hoặc kết hợp với một số vanilla JS

if ($("#dataTable").get(0).hasAttribute("data-timer")) {
  ...
}

10

Bạn có thể sử dụng phương thức hasData của jQuery.

http://api.jquery.com/jQuery.hasData/

Ưu điểm chính của jQuery.hasData (phần tử) là nó không tạo và liên kết một đối tượng dữ liệu với phần tử nếu không tồn tại. Ngược lại, jQuery.data (phần tử) luôn trả về một đối tượng dữ liệu cho người gọi, tạo một đối tượng nếu không có đối tượng dữ liệu nào tồn tại trước đó.

Điều này sẽ chỉ kiểm tra sự tồn tại của bất kỳ đối tượng dữ liệu (hoặc sự kiện) nào trên phần tử của bạn, nó sẽ không thể xác nhận nếu nó đặc biệt có đối tượng "hẹn giờ".


10

Nếu bạn muốn phân biệt giữa các giá trị trống và giá trị còn thiếu, bạn có thể sử dụng jQuery để kiểm tra như thế này.

<div id="element" data-foo="bar" data-empty=""></div>

<script>
"foo" in $('#element').data(); // true
"empty" in $('#element').data(); // true
"other" in $('#element').data(); // false
</script>

Vì vậy, từ câu hỏi ban đầu bạn sẽ làm điều này.

if("timer" in $("#dataTable").data()) {
  // code
}

7

Bạn có thể tạo một plugin jQuery cực kỳ đơn giản để truy vấn một yếu tố cho việc này:

$.fn.hasData = function(key) {
  return (typeof $(this).data(key) != 'undefined');
};

Sau đó, bạn có thể chỉ cần sử dụng $("#dataTable").hasData('timer')

Gotchas:

  • Sẽ falsechỉ trả về nếu giá trị không tồn tại (is undefined); nếu nó được đặt thành false/ nullhasData()vẫn sẽ quay trở lại true.
  • Nó khác với tích hợp $.hasData()chỉ kiểm tra xem dữ liệu nào trên phần tử được đặt không.

3

Tôi đã tìm thấy điều này hoạt động tốt hơn với các yếu tố dữ liệu được thiết lập động:

if ($("#myelement").data('myfield')) {
  ...
}

3

Tất cả các câu trả lời ở đây sử dụng thư viện jQuery.

Nhưng javascript vanilla rất đơn giản.

Nếu bạn muốn chạy một kịch bản duy nhất nếu phần tử có một idsố #dataTable cũng có một data-timerthuộc tính, sau đó các bước như sau:

// Locate the element

const myElement = document.getElementById('dataTable');

// Run conditional code

if (myElement.dataset.hasOwnProperty('timer')) {

  [... CODE HERE...]

}

2

Theo tôi, đây là giải pháp đơn giản nhất là chọn tất cả các yếu tố có thuộc tính dữ liệu nhất định:

var data = $("#dataTable[data-timer]");
var diffs = [];

for(var i = 0; i + 1 < data.length; i++) {
    diffs[i] = data[i + 1] - data[i];
}

alert(diffs.join(', '));

Dưới đây là ảnh chụp màn hình về cách thức hoạt động của nó.

nhật ký giao diện điều khiển của bộ chọn jquery


1

Câu trả lời sai - xem EDIT ở cuối

Hãy để tôi xây dựng dựa trên câu trả lời của Alex.

Để ngăn chặn việc tạo đối tượng dữ liệu nếu nó không tồn tại, tôi nên làm:

$.fn.hasData = function(key) {
    var $this = $(this);
    return $.hasData($this) && typeof $this.data(key) !== 'undefined';
};

Sau đó, nơi $thiskhông có đối tượng dữ liệu được tạo, $.hasDatatrả về falsevà nó sẽ không thực thi $this.data(key).

EDIT: chức năng $.hasData(element)chỉ hoạt động nếu dữ liệu được đặt bằng cách sử dụng $.data(element, key, value), không element.data(key, value). Do đó, câu trả lời của tôi không đúng.


1

Tôi cần một boolean đơn giản để làm việc với. Bởi vì nó không được xác định là không có mặt và không sai, tôi sử dụng !!để chuyển đổi sang boolean:

var hasTimer = !!$("#dataTable").data('timer');
if( hasTimer ){ /* ....... */ }

Một giải pháp thay thế sẽ là sử dụng bộ lọc:

if( $("#dataTable").filter('[data-timer]').length!==0) { /* ....... */ }

0
var data = $("#dataTable").data('timer');
var diffs = [];

if( data.length > 0 ) {
for(var i = 0; i + 1 < data.length; i++) {
    diffs[i] = data[i + 1] - data[i];
}

alert(diffs.join(', '));
}

Nếu .data('timer')không được xác định, bạn sẽ nhận được TypeError: $ (...). Dữ liệu (...) không được xác định khi kiểm tra data.length. Đây rất có thể là nền tảng của câu hỏi của OP, tức là đảm bảo rằng người ta có thể kiểm tra an toàn data.lengthở nơi khác. Ngoài ra, bạn không nhất thiết có thể nói chắc chắn datalà một chuỗi, một mảng hay một đối tượng, trong đó chuỗi sau có thể có hoặc không chứa lengthnhư một thuộc tính được xác định.
WynandB

Có câu trả lời của tôi cần sửa đổi. Được viết vào năm 2012 .. Nhưng viết lại nó sẽ vô ích vì câu trả lời đã được đưa ra.
Luceos

0

Bạn có thể kiểm tra bằng cách chọn thuộc tính css với

if ($('#dataTable').is('[data-timer]')) {
   // data-timer attribute exists
}

3
Các giá trị dữ liệu không phải lúc nào cũng được lưu trữ dưới dạng các thuộc tính DOM. Khi bạn sửa đổi giá trị dữ liệu bằng jQuery bằng $ .data, nó sẽ đặt nó làm thuộc tính phần tử.
qwerty

0

Và thế còn:

if ($('#dataTable[data-timer]').length > 0) {
    // logic here
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.