2010-07-06 43 views
6

Tôi đang khởi chạy cửa sổ bật lên có window.open (...) và tôi chuyển elementId đến cửa sổ bật lên mới.sự kiện javascript trên nhiều cửa sổ

Sau đó trong khi khởi động cửa sổ bật lên, tôi tìm thấy phần tử trong cửa sổ mở khớp với phần tửId được truyền tới cửa sổ bật lên. Sau đó, popup đăng ký các sự kiện trên phần tử đó bằng cách sử dụng jQuery.bind (...). Sau đó, từ bên trong cửa sổ mở tôi kích hoạt các sự kiện này bằng cách sử dụng jQuery.trigger (...), tôi cũng đã thử triggerHandlers.

Vấn đề là eventHandlers của cửa sổ bật lên của tôi không bao giờ được gọi. Tôi có thể đăng ký các sự kiện từ bên trong cửa sổ mở không có vấn đề gì. Tuy nhiên, khi tôi thử từ cửa sổ bật lên, nó không hoạt động.

Có ai có ý tưởng nào về cách sửa lỗi này không? Đây có phải là một số loại mô tả bảo mật không?

Cảm ơn rất nhiều vì đã đọc!

+0

Sử dụng firebug firebug và kiểm tra lỗi. Sau đó, bạn sẽ biết thời tiết đó là bảo mật hoặc lỗi mã đơn giản. Mã mẫu sẽ giúp ích. – nebkat

+0

Bạn có thể đăng một số ví dụ về kích hoạt bạn đang cố gắng không? Tôi nghĩ rằng bạn có thể đang cố gắng làm điều đó trên các yếu tố phù hợp với bộ chọn trong cửa sổ hiện tại, chứ không phải là cái mở, thường là như vậy. –

+0

Tôi chắc chắn có yếu tố chính xác từ cửa sổ thích hợp. –

Trả lời

9

OK, khi tôi tìm ra "mở" yếu tố trang và gán xử lý theo cách này:

// in the popup page 
$(function() { 
    var openerElement = window.opener.document.getElementById(theElementId); 
    $(openerElement).click(function() { 
    alert("Hello World!"); 
    }); 
}); 

Sau đó, trước sự ngạc nhiên của tôi, mẹ đẻ "thật" các sự kiện làm việc tốt. Tuy nhiên, sự kiện tùy chỉnh được kích hoạt từ trang mở làm không phải là được chọn bởi trang bật lên. Đó là loại có ý nghĩa, vì mỗi trang có vũ trụ jQuery nhỏ của riêng nó. Tuy nhiên tôi dường như đã sai về trình duyệt không truyền bá sự kiện gốc, vì vậy cảm ơn vì trải nghiệm học tập của ngày hôm nay !! Thông tin

hơn — Từ cửa sổ popup (và tương tự từ bất kỳ con của tài liệu chính), bạn cũng có thể sử dụng

var thing_in_main_window = window.opener.$('#thingId'); 

tìm tòi trong cửa sổ mở. Tuy nhiên, chỉ cần sử dụng đối tượng jQuery trong trang popup để tìm phần tử đó không thể làm việc, vì jQuery sẽ không đi qua liên kết "window.opener" và đi săn tìm phần tử ở đó. Khi bạn gọi $('#thingId') trên trang bật lên, jQuery chỉ được gọi là document.getElementById('thingId') bằng cách sử dụng đối tượng document cho trang bật lên. Nếu không có phần tử nào được gọi là "thingId" trên trang đó, nó sẽ không được tìm thấy.

câu trả lời ban đầu:

Tôi không nghĩ rằng những gì bạn đang cố gắng làm sẽ làm việc. Trình duyệt sẽ không kích hoạt bất kỳ trình xử lý sự kiện nào trong cửa sổ khác với trình xử lý chứa phần tử đích.

Tuy nhiên, bạn có thể nắm bắt sự kiện trong một cửa sổ và sau đó kích hoạt sự kiện tùy chỉnh trong cửa sổ khác. Khi bạn làm điều đó, có thể bạn sẽ muốn kích hoạt sự kiện thông qua đối tượng jQuery trên trang đó. Nói cách khác, bạn sẽ làm điều này:

$('#thing').click(function() { 
    otherWindow.jQuery.trigger("thing-clicked"); 
}); 
+0

tuyệt vời, bạn có xem qua tài liệu này ở đâu đó không? –

+0

Vâng đó chỉ là kinh nghiệm của tôi, và nó khá dễ dàng để thử nghiệm với một trang thử nghiệm thực sự đơn giản (hoặc các trang tôi đoán). Tôi cho rằng tôi không thể nói rằng tôi hoàn toàn 100% rằng nó luôn đúng trong mọi trình duyệt; Tôi sẽ viết một bài kiểm tra nhanh và cập nhật câu trả lời của tôi nếu tôi sai tất nhiên! – Pointy

+0

Whoa! Đã cập nhật câu trả lời !! – Pointy

3

Xin lỗi vì câu trả lời. Tôi đã thử nghiệm điều này và muốn chia sẻ những phát hiện của mình.Bạn thực sự có thể xác định người nghe sự kiện của bạn trong cửa sổ popup mà không tham khảo mở:

trong trang mở dưới dạng bật lên:

$(document).on("foo", function() { 
    alert("foo"); 
}); 

trong trang này sẽ mở một cửa sổ bật lên:

var popup = window.open("popup.html", "_blank", "width=500"); 
$("#trigger-button").on("click", function() { 
    popup.$(popup.document).trigger("foo"); 
}); 

Bí mật là: ngay cả khi bạn gọi jQuery từ đối tượng cửa sổ bật lên, bạn không thể sử dụng bộ chọn trực tiếp, vì jQuery sẽ cố gắng tìm các phần tử trong cửa sổ cha (mở).

+0

Tôi cho rằng bạn có thể làm việc xung quanh vấn đề cuối cùng bằng cách chỉ định cửa sổ khác làm ngữ cảnh chọn. 'popup. $ ('# thing', popup.document) .trigger ('foo');' – colllin

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