2011-11-01 28 views
9

Đọc qua số CKEditor documentation, tôi thấy rằng họ có tùy chọn hủy một phiên bản với CKEDITOR.instances.instanceName.destroy();. Tuy nhiên, nếu DOM đã thay đổi, và toàn bộ cấu trúc WYSIWYG DOM đã được gỡ bỏ, tôi nhận được lỗi sau trong Chrome:CKEditor - hủy một phiên bản khi nút DOM đã bị xóa

Uncaught TypeError: Cannot read property 'document' of null 

... và một sau đây trong Firefox:

i.contentWindow is null 

Có cách nào để giải quyết vấn đề này không?

Do cách ứng dụng của tôi được cấu trúc (tải nội dung qua AJAX), tôi không thể gọi .destroy() khi các yếu tố vẫn còn trên trang.

Trả lời

16

Nếu bạn cần hủy đối tượng ckeditor và elemnets trong DOM SAU cuộc gọi AJAX, bạn có thể thực hiện bằng cách đặt tham số boolean cho hàm hủy cuộc gọi (true). Bằng cách này, Google sẽ không cố cập nhật DOM:

var editor = CKEDITOR.instances[name]; 
if (editor) { editor.destroy(true); } 
CKEDITOR.replace(name); 

Tôi đã viết 2 chức năng để có thể kiểm soát những điều này tốt hơn một chút. Chú ý rằng tôi đã tuyên bố một biến trước khi các chức năng này có thể được sử dụng, nhưng có những cách áo mưa nhiều, nhưng cách tiếp cận này là đủ tốt cho mục đích tôi cần nó (tôi sử dụng và chỉ cần một ví dụ):

if(typeof(editor) == 'undefined') 
     var editor=null; 

    function ck_delete(editor) 
    { 
     if(typeof(editor) != 'undefined' && editor!=null) 
      editor.destroy(); 
    } 

    function ck_init(ck_inst_name) 
    { 
     var el_id=document.getElementById(ck_inst_name); 
     if(typeof(el_id) != 'undefined' && el_id!=null) 
     { 
      if(typeof(editor) == 'undefined' || editor==null) 
      { 
       editor=CKEDITOR.replace(ck_inst_name); 
      } 
      else 
      { 
       ck_delete(editor); 
       editor=null; 
       editor = CKEDITOR.replace(ck_inst_name); 
      } 
     } 
    } 

Tôi cũng kiểm tra xem một phần tử HTML có nên được thay thế không vì vậy tôi không nhận được thông báo lỗi.

+0

Điều này giải quyết một vấn đề tương tự (giống nhau?) Cho tôi (thay thế ckeditor dựa trên sự trở lại của cuộc gọi AJAX) nhưng tôi vẫn nhận được Uncaught TypeError (giống như trong OP). Tôi không chắc chắn nếu có bất kỳ tác dụng phụ nhưng tôi muốn thoát khỏi thông báo lỗi. Mã của tôi để tải trình chỉnh sửa là: window.makeCkEditor = function(e, w, h) { var cki, config, ei; ei = CKEDITOR.instances[e]; if (ei) ei.destroy(true); config = { width: w, height: h }; return cki = CKEDITOR.replace(e, config); }; Bất kỳ ý tưởng nào về cách tôi có thể loại bỏ thông điệp đó? –

+0

@KenThompson: Tôi có một cách tiếp cận khác, nhưng bạn đã cố gắng phá hủy đối tượng ck trước cuộc gọi AJAX chưa? –

+0

phá hủy (đúng) dường như hoạt động:) – bjunix

2

Bạn có thể áp dụng một trong các bản vá lỗi tại http://dev.ckeditor.com/ticket/8226 và nó sẽ hoạt động. Tôi đề nghị điều này: http://dev.ckeditor.com/attachment/ticket/8226/8226_5.patch

+0

Tôi là một chút mới đối với dòng lệnh; Làm cách nào để áp dụng bản vá này? Tôi đang chạy trên Windows 7 x64. –

+0

Nó có thể là quá phức tạp chỉ để làm điều đó. Cách mà tôi làm việc có bản sao SVN, dễ dàng với TortoiseSVN, sau đó sử dụng trình đơn ngữ cảnh trên thư mục sử dụng tùy chọn Patch và sau đó bạn phải đóng gói lại tất cả mã CKEditor (vì vậy bạn cũng cần phải cài đặt Java). Đó là một sự xấu hổ mà bạn được yêu cầu phải làm tất cả những bước chỉ vì họ không thích các bản vá và đề xuất một cái gì đó phức tạp hơn mà cuối cùng đã không được thêm vào. – AlfonsoML

+0

Vâng, vì tôi không sử dụng SVN, tôi đã đi qua tệp 'patch' và thực hiện tất cả những thay đổi đó theo cách thủ công. Bây giờ, tất cả những thay đổi này đều nằm trong thư mục '_source'. Tôi giả sử 'ckeditor.js' bằng cách nào đó được biên dịch/ghép nối/nén từ tất cả các tệp đó. Tôi sẽ làm thế nào? –

1

Chúng tôi đã gặp sự cố này khi tích hợp CKEDITOR trong GWT, trong hộp thoại bật lên. Khi hộp thoại bị phá hủy, CKEDITOR đã đưa ra lỗi này - "Không thể đọc tài liệu 'thuộc tính' của null." Giải pháp là phá hủy CKEDITOR trước khi đóng hộp thoại. (Chúng tôi đã phải mở rộng lớp GWK ckeditor để ghi đè điều này - bằng cách sử dụng cú pháp editor.destroy (đúng) do Erik đưa ra - Cảm ơn, Erik!)

+1

Không sao, tôi rất vui được giúp đỡ –

Các vấn đề liên quan