Tôi đang phát triển một ứng dụng sử dụng trình chỉnh sửa TinyMCE để cho phép người dùng sửa đổi nội dung. Tôi đã phát triển một lớp Prototype.js, khi khởi tạo, tạo ra một ID duy nhất và tạo ra một trình soạn thảo TinyMCE trên một <div>
với ID đó. Dưới đây là một số mã có liên quan:Điều gì có thể gây ra tham nhũng bộ nhớ trong JavaScript?
Region = Class.create(
{
initialize: function(options)
{
this._editorReady = false;
this._index = Region.nextIndex++;
this._uid = com.digitalfruition.Customizer.TypeRegion.uidPrefix+this._index;
Region.instances.push(this);
this.setupTinyMCE();
},
uid: function()
{
return this._uid;
},
index: function()
{
return this._index;
},
Trong rất nhiều nơi, tôi sẽ đề cập đến một Region
's uid()
, ví dụ, khi sự kiện xảy ra trong trình soạn thảo TinyMCE (ví dụ, những thay đổi lựa chọn) xử lý của tôi được cung cấp ID của trình chỉnh sửa. Tôi thường sẽ làm:
var index = Region.instances.invoke('uid').indexOf(uid);
Để tìm thực tế Region
dụ phản ánh giao diện các sự kiện xảy ra trong
tôi chỉ bao giờ thiết lập _uid
sở hữu của bất kỳ trao Region
lần.. Tôi chắc chắn về điều này.
Nhưng trong Firefox 9.0.1, tôi thấy hành vi thực sự kỳ quặc. Khi sự kiện kích hoạt, trình chỉnh sửa mà họ đang kích hoạt không thể tìm thấy vì index
trong mã ở trên là -1
. Sau khi kiểm tra trong Firebug, tôi thấy điều này:
Đó là những thông điệp debug từ mã của tôi, đăng nhập điều khác nhau (chiều cao của khu vực trong trường hợp này) cùng với giá trị this.uid()
của khu vực. Bộ nhớ dường như đã bị hỏng! và thậm chí bạn có thể nhìn thấy nơi nó xảy ra, mục nhập nhật ký vòng đầu tiên là chính xác và các mục nhập tiếp theo là sai.
Mã giống nhau hoạt động tốt trong Safari và Chrome. Cho đến nay chỉ có Firefox 9.0.1 dường như bị ảnh hưởng ...
Để kiểm tra thêm, tôi chạy này trong Firebug console:
>>> com.digitalfruition.Customizer.TypeRegion.instances.invoke('uid');
["�ᔮ��蒦ᓤ�瀀魳ᓪ�倀⛺ᓪ�怀�eg����遀"]
Điều đó làm cho không có ý nghĩa với tôi. Điều gì có thể gây ra tham nhũng bộ nhớ như thế này trong JavaScript? Làm cách nào để tôi khắc phục sự cố như vậy?
Tôi đang ở trong [trò chuyện JavaScript] (http://chat.stackoverflow.com/rooms/17/javascript) trong trường hợp bạn muốn hỏi tôi bất kỳ câu hỏi nào! – Josh
Điều này 'com.digitalfruition.Customizer.TypeRegion' đến từ đâu, bằng cách này? Nó là một đối tượng JavaScript thuần túy? – dyoo
@dyoo Xin lỗi, điều đó không rõ ràng phải không? :) Đó là đối tượng Region trong mẫu mã của tôi; Tôi chỉ rút ngắn mã cho câu hỏi của mình. – Josh