2013-10-21 13 views
6

Trong một sổ ghi chép IPython, người ta sẽ mong đợi đoạn mã sau đây làm cho Raphael.js tải thành công vào không gian tên chung.Làm cách nào để tải Raphael trong sổ tay IPython, tránh một số vấn đề phát sinh do require.js?

from IPython.display import Javascript 

raphael_url = "https://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js" 
Javascript('alert(Raphael);', lib=[raphael_url]) 

Tuy nhiên, nó không hoạt động trong các phiên bản gần đây của IPython sử dụng require.js. Hóa ra, Raphael.js, mà IPython tải bằng cách sử dụng jQuery.getScript(), nhận ra sự hiện diện của require.js và do đó không chèn chính nó vào không gian tên chung. Trong thực tế, nếu một trong những đầu tiên chạy mã javascript loại bỏ các đối tượng window.define, Raphael không còn nhận ra require.js là hiện tại, và nó chèn chính nó vào không gian tên toàn cầu như tôi muốn. Nói cách khác, các mã trên hoạt động sau khi chạy như sau:

Javascript('window.define = undefined;') 

Vì vậy, cách duy nhất tôi có thể có được Raphael để tải trong một phiên bản mới của máy tính xách tay IPython là để xóa (hoặc đặt sang một bên) window.define.

Sau khi xác định được sự cố, tôi không đủ quen thuộc với require.js để biết phần mềm nào đang hoạt động chống lại giao thức. Raphael có sử dụng cách kiểm tra nghèo nàn cho sự tồn tại của require.js không? IPython có nên sử dụng require.js trực tiếp thay vì jQuery.getScript() khi nó tải thư viện javascript do người dùng cung cấp không? Hoặc là có một cách tôi là người sử dụng nên được embracing require.js, mà sẽ cung cấp cho tôi các đối tượng Raphael mà không cần bất kỳ hack đặc biệt? (Nếu câu trả lời cho câu hỏi cuối cùng là có, có cách nào tôi cũng có thể hỗ trợ các phiên bản cũ hơn của sổ tay IPython không sử dụng require.js không?)

Trả lời

4

Phần đầu tiên của câu trả lời của tôi sẽ không làm hài lòng bạn, nhưng tải và yêu cầu của thư viện javascript trong IPython-notebook-webapp vẫn chưa được giải quyết, vì vậy bây giờ tôi sẽ đề nghị không xây dựng nhiều về giả định bạn có thể tải thư viện như thế, và dựa nhiều hơn vào custom.js cho hiện nay.

Điều đó đang được nói, nếu raphael không nằm trong không gian tên toàn cầu yêu cầu đủ thông minh để lưu trữ bộ nhớ cache và cung cấp cho bạn tham chiếu đến nó. Sau đó, trong khi gọi lại bạn chỉ có thể gán cho một toàn cầu:

yêu cầu ([ 'raphael'], function (Raph) { window.raphael = Raph; })

Hoặc một cái gì đó như thế nên làm lừa.

+0

Thực ra, thậm chí tải raphael.js thông qua '$ .getScript()' kết quả trong 'ReferenceError: eve chưa được xác định'. Có vẻ như Raphael đang mong đợi 'eve' ở trong không gian tên toàn cục, nhưng nó không được đặt ở đó trước đêm trước (cũng là một phần của raphael.js) nếu require.js hiện diện. –

+0

Sau đó, tôi không có đầu mối. Liệu từ đó có được tải thủ công trong trang bằng 'require' không? nếu có, hãy xuất bản một đoạn mã JS thay vì sử dụng 'lib =' kw. – Matt

+0

Tôi đã thử tải bằng 'require', nhưng không may mắn. Lệnh hiện tại tôi đang sử dụng (trên một dòng) là 'Javascript (" require.config ({đường dẫn: {Raphael: 'https://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min .js '}}); yêu cầu ([' Raphael '], hàm (raph) {window.Raphael = raph;}); ")' –

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