2009-08-31 29 views
8

Mã này ở đây không trả lại những gì người ta mong đợi:JQuery (..). Html() có lỗi trong jQuery 1.3.2 không?

jQuery('<div>Look here: [ jQuery0="null" ]</div>').html() 

Thay vào đó, bạn nhận được:

Look here: [ ] 

Mã nguồn jQuery trong câu hỏi:

html: function(value) { 
     return value === undefined ? 
       (this[0] ? 
         this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") : 
         null) : 
       this.empty().append(value); 
}, 

Điều gì sẽ là động lực phía sau .replace? Tôi không có thời gian để đi qua phần còn lại của jQuery, nhưng mã như thế này làm cho tôi tự hỏi nếu tôi nên sử dụng jQuery trong sản xuất ở tất cả.

Trả lời

4

Mã này mới trong 1.3.2, mã không phải là trong 1.3.1. Dường như với tôi như jQuery sử dụng các thuộc tính có tên bắt đầu bằng "jQuery" để lưu trữ dữ liệu trên các phần tử, và đây là cách của nó không lộ ra cho bạn khi bạn yêu cầu html trở lại.

Rõ ràng đây không phải là lỗi. Tác giả dự định xóa HTML đó trước khi trả lại chuỗi cho bạn.

Điều này có ảnh hưởng đến mã của bạn không? Như với bất kỳ thư viện nào, bạn nên kiểm tra mã sản xuất của mình kỹ lưỡng trước khi triển khai nó.

+1

Được cấp, nó chưa ảnh hưởng đến mã của tôi nhưng nó vi phạm 'x.html (y) .html() == y' bất biến, làm đổ chuông báo động. Cảm ơn bạn đã biết thông tin về thời điểm giới thiệu này. Bạn nói đúng, nó không phải là một lỗi, mà là một quyết định thiết kế đáng ngờ. – t0yv0

11

Động lực đằng sau .replace là gì?

Để ẩn các thuộc tính mà jQuery đang sử dụng cho mục đích nội bộ.

mã như thế này khiến tôi tự hỏi liệu mình có nên sử dụng jQuery trong sản xuất hay không.

Vâng, tôi đã có phản ứng tương tự. Nó cực kỳ cẩu thả. Việc cố gắng xử lý HTML với regexp là loại hack ngây thơ mà bạn mong đợi từ các áp phích câu hỏi lần đầu, không phải kiểu hành vi mà bạn hy vọng sẽ thấy trong khung làm cho rất nhiều người dùng SO xuất hiện để thờ phượng.

Đây không phải là nơi duy nhất jQuery truy cập bằng cách cố gắng phân tích cú pháp đánh dấu bằng regex; một số công cụ chọn cũng bị hỏng. Đây có thể là trường hợp góc tối nghĩa, nhưng đối với tôi đó là một lá cờ đỏ rất lớn biểu thị cách tiếp cận sai lầm.

+4

Ngẫu nhiên, có một sửa chữa dễ dàng cho việc này. IE chỉ bao gồm các thuộc tính expando trong chuỗi tuần tự 'innerHTML' của nó khi các giá trị của chúng là các kiểu đơn giản như' String' và 'Number'. Các đối tượng khác như Array không xuất hiện. Vì vậy, tất cả các jQuery cần làm là thiết lập 'node [expando] = [uuid];' thay vì 'node [expando] = uuid;' và tất cả việc xử lý regex vô nghĩa này có thể biến mất. – bobince

+0

Tôi đã bao giờ nói với bạn rằng tôi yêu bạn bao nhiêu? :-P Bạn đang, giống như, thần của các bản sửa lỗi IE tối nghĩa, hoặc một cái gì đó. –