AdobeのスクリプトでPanel間やjsx・js間でデータのやりとりをすることができるCSXSEventですが、普段stringしか送っていなかったのをデータを送りたいなーと思いやってみたという話。
思ったより簡単にできました。
CSXSEvent基礎
基本はこう書きます
var mylib = new ExternalObject( "lib:\PlugPlugExternalObject" );
var eventObj = new CSXSEvent();
eventObj.type = "event_type"; // 好きなidentifierをつける
eventObj.data = "message";
eventObj.dispatch();
ちなみにphotoshopであれば"lib:\PlugPlugExternalObject"
が内臓されているらしいので特にファイルをダウンロードしなきゃいけないとかはありません。
var csInterface = new CSInterface();
csInterface.addEventListener("event_type", function (event) {
console.log(event.data);
});
event.dataにはもちろん"message"
(string)が入っています。
event.dataにObjectを入れる
stringだと物足りないので、Objectデータを送信したい!という気持ちでチャレンジ
var data = {
message : "送りたいメッセージとかを書き込んでみる",
id : 1 // idとか取得した数値とかを追加で送ってみる
}
var mylib = new ExternalObject( "lib:\PlugPlugExternalObject" );
var eventObj = new CSXSEvent();
eventObj.type = "event_type"; // 好きなidentifierをつける
eventObj.data = data;
eventObj.dispatch();
しかし、これで受け取り側でconsole.logを出してみると、objectがstringで送信されてしまうため、[object object]と表示されてしまいます。
event.dataにJson化したデータを入れる
やはりstring以外は送れないのかなーと思ったのですが、stringならばjsondで送ってパースすれば良いのでは?という思いつき。
※ちなみにAdobeのJsxではJSON.stringify/JSON.parseのメソッドが使えないので外部からincludeする必要があります。私はgithub.com/douglascrockford/JSON-jsを利用させていただいています。いくつか方法があると思いますので、お好きな方法を取ってみてください。
var data = {
message : "送りたいメッセージとかを書き込んでみる",
id : 1 // idとか取得した数値とかを追加で送ってみる
}
var mylib = new ExternalObject( "lib:\PlugPlugExternalObject" );
var eventObj = new CSXSEvent();
eventObj.type = "event_type"; // 好きなidentifierをつける
eventObj.data = JSON.stringify(data); // JSON化させる
eventObj.dispatch();
こんな感じで送信すると、特に受け取り側ではparseなどしなくても受け取ることができます
CSXSEventはちょっとしたタイミングの受け渡しでしか使えていなかったのですが、色々なデータを詰めて送れるとなるととても便利に使えそうです。