2010-06-09 29 views
6

Tôi đang chạy vào một vấn đề sử dụng dojo.connect() để kết nối một 'onclick' sự kiện với nút này:dojo.connect sẽ không kết nối 'onclick' với nút

<button dojoType="dijit.form.Button" widgetId="inbox_button" id="inbox_button">Inbox</button> 

và làm cho mã kết nối là:

var inbox_button=dojo.byId("inbox_button"); 
dojo.connect(inbox_button,'onclick',function(){ 
    var container=dijit.byId("center"); 
    container.addChild(new dijit.layout.ContentPane({region: "left", content: "...", style: "width: 100px;"})) 
}); 

Tuy nhiên, thay vì thực hiện chức năng khi nút được nhấp, bất kỳ sự kiện onclick nào sẽ kích hoạt chức năng và tôi sẽ có rất nhiều hộp chứa trẻ em.

Mặc dù tôi khá chắc chắn các .connect() chức năng nên có sẵn như là một phần của chức năng cơ bản của võ đường, tôi đã 'cần thiết' nó một cách rõ ràng:

dojo.require("dojo._base.connect"); 

Bất kỳ ý tưởng là tại sao sức mạnh này đang xảy ra?

Trả lời

2

Để trả lời câu hỏi của riêng tôi: đừng bao giờ đánh giá thấp giá trị của dojo.addOnLoad!

Tôi cảm thấy rằng vì nút này đã được sử dụng làm tiện ích, ID của nó không được đăng ký cho đến khi Dojo tải xong và vì mã kết nối không nằm trong khối addOnLoad, nó không thể tìm thấy (không phải chưa được tải). Lý do, sau đó, phương thức được kích hoạt trên mỗi sự kiện nhấp chuột là do cách Dojo giao dịch với các đối tượng null trong hàm connect(): nó bỏ qua chúng và thay vào đó sử dụng dojo.global (phiên bản của document.window của Dojo) làm vật.

Tôi hy vọng điều này sẽ giúp bất kỳ ai khác có thể gặp phải vấn đề tương tự!

12

Như bạn nói, nếu bạn chạy mã đó trước khi DOM sẵn sàng, dojo.byId ("inbox_button") sẽ trả về giá trị rỗng. Vì vậy, kết nối của bạn thực sự đang thực hiện:

dojo.connect(null, "onclick", function() { ... }) 

.. nếu 1st arg to dojo.connect là null, đối tượng chung hoặc 'cửa sổ' sẽ được sử dụng.

Nhưng, đó chỉ là một lỗi ở đây. Phần tử nút của bạn đang nhận được tiện ích con và được chuyển thành một tệp dijit.form.Button. Vì vậy, bạn nên kết nối với phương pháp onClick của widget ở đây, không onclick của nút:

dojo.connect(dijit.byId("inbox_button"), "onClick", function() { ... }); 

Ngoài ra, để được rõ ràng, bạn nên không bao giờ phải dojo.require bất cứ điều gì trong dojo._base, đó là lời hứa rằng Dojo. js làm cho bạn - tất cả được nhóm lại.

+0

Cảm ơn, tôi đã thực hiện thay đổi đó cho tất cả các nút của mình. Mặc dù vậy, một câu hỏi: sử dụng dojo.byId ("x") và onclick đang hoạt động, vậy tại sao nó lại thích dùng dijit/onClick hơn? – Daniel

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