36

Tôi cần chuyển dữ liệu giữa hai người dùng tự động - lý tưởng là chạm vào đối tượng unsafeWindow - và tôi nghĩ việc sử dụng các sự kiện tùy chỉnh sẽ là cách để đi. Tôi nghĩ đến một cái gì đó như thế này (chúng ta hãy bỏ qua các mô hình MSIE với mục đích ví dụ):Có cách nào truyền dữ liệu bổ sung qua các sự kiện tùy chỉnh không?

addEventListener("customEvent", function(e) { 
    alert(e.data); 
}); 

var custom = document.createEvent("HTMLEvents"); 
custom.initEvent("customEvent", true, true); 
custom.data = "Some data..."; 
dispatchEvent(custom); 

này hoạt động độc đáo trong các tiêu chuẩn môi trường javascript và trong vòng một UserScript, nhưng khi sự kiện này là bắn bởi UserScript và bị bắt bên ngoài hoặc bên trong một người dùng khác, thuộc tính dataundefined trong crom. Tôi cho rằng tôi chỉ có thể lưu dữ liệu được truyền vào trong sessionStorage, nhưng nó không liền mạch. Bất kỳ giải pháp thanh lịch nào khác, quý ông và quý ông? Nhu cầu hoàn hảo và có thể đạt được, tôi có thể cảm nhận được nó.

+0

Lệnh 'tag google-chrome-extension' phù hợp hơn hơn' elegance'. Nó sẽ thu hút đúng đối tượng;) –

+0

suy nghĩ tốt :) – Witiko

Trả lời

55

Có, bạn có thể sử dụng MessageEvent hoặc CustomEvent.

Ví dụ sử dụng:

//Listen for the event 
window.addEventListener("MyEventType", function(evt) { 
    alert(evt.detail); 
}, false); 

//Dispatch an event 
var evt = new CustomEvent("MyEventType", {detail: "Any Object Here"}); 
window.dispatchEvent(evt); 
+21

Để đạt được điều này bằng cách sử dụng hàm tạo mới 'CustomEvent ('eventName')', chuyển dữ liệu trong một mã băm CustomEventInit, được khóa bởi 'chi tiết' như sau: 'new CustomEvent ('eventName', {'detail': data}); '. –

+6

có vẻ như 'initCustomEvent' không được chấp nhận – scrutari

+2

Tôi đã nhập dữ liệu đó? Tôi có thể đặt một tham chiếu đến một phần tử HTML trong đó không? –

6

vượt qua đối tượng với các chi tiết như là thuộc tính:

var event = new CustomEvent('build', { 'detail1': "something", detail2: "something else" }); 

function eventHandler(e) { 
    log('detail1: ' + e.detail.detail1); 
    log('detail2: ' + e.detail.detail2); 
} 

https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events

+9

Đây không phải là JSON: {foo: "bar"} Đó là mã băm JavaScript. JSON có các quy tắc rất nghiêm ngặt (các khóa phải được đặt trong dấu nháy kép), và ngay cả khi cùng một JS sẽ là JSON hợp lệ, việc sử dụng nó trong JS chỉ là JS chứ không phải JSON. Theo tôi, nó chỉ là JSON nếu nó là JSON hợp lệ và nó được lưu trữ như một chuỗi. Khi đó là mã JS, nó chỉ là một cơ sở dữ liệu JavaScript xảy ra giống như JSON. –

+0

Sự khác biệt chính xác giữa băm và đối tượng Json là gì? Theo như tôi biết chúng tôi có thể tạo một băm như var xyz = {}; xyz ['index1'] = "myvalue1"; xyz ['index2'] = "myvalue2"; –

+1

@SujalMandal - sự khác biệt là anh ấy không sử dụng thuật ngữ JSON một cách chính xác. Đó không phải là JSON, đó chỉ là một đối tượng javascript theo nghĩa đen. JSON là một định dạng ** chuỗi ** được sử dụng để truyền dữ liệu giữa các chương trình/dữ liệu lưu trữ và cú pháp của nó dựa trên các đối tượng javascript. –

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