2

リンクポップアップ(リッチテキスト領域のハイパーリンクボタンをクリックすると開き、リンク先のコンポーネントやurl /mailtoなどを選択できるようにするもの)にTridion 2011(GA)GUI拡張機能を実装しています。 )。

このポップアップ内でコンポーネントが選択または更新されるポイントにフックして、選択したコンポーネントのスキーマに基づいてデータをロードできるようにします。問題は、コンポーネントuriを含むhtml入力フィールドが無効になっていることです(値はセレクターによってのみ変更できるため)。これにより、changeイベントが発生しなくなっていると思います。

私の拡張機能jsには次のものがありますが、コンポーネントを選択/更新しても関数は呼び出されず、http/mailtoリンクを変更した場合にのみ呼び出されます

$evt.addEventHandler($("#FieldUrl"), "change", onFieldUrlChanged);

function onFieldUrlChanged()
{
    alert("url changed to: " + $("#FieldUrl").value);
}

うまくいく他のイベントはありますか?それ以外の場合、閉じているブラウズポップアップにフックする方法はありますか?

アップデート

フランクの提案に従って、[アイテムの選択]ポップアップでイベントにフックしようとしています。参照ボタンのイベントハンドラーをclick追加しました。これにより、ポップアップのイベントハンドラーが追加されます。私は使用したいと思っていましたがinsertunloadむしろ厄介なことに、発火したように見えるのはclose(リンクされたコンポーネントを選択しない場合にのみ発生するため、あまり使用されません)。私のJSコードは以下のとおりです。

$evt.addEventHandler($("#BtnBrowse"), "click", onBtnBrowseClicked);
function onBtnBrowseClicked = function (event)
{
    var popup = $display.getView().properties.ItemPopup;
    $evt.addEventHandler(popup, "load", function () { alert('loaded'); });
    $evt.addEventHandler(popup, "insert", function () { alert('insert'); });
    $evt.addEventHandler(popup, "close", function () { alert('close'); });
    $evt.addEventHandler(popup, "unload", function () { alert('unload'); });
}

clickコンソールを使用して、次のようなイベントをポップアップの実際の挿入ボタンにフックすることができました。

$evt.addEventHandler($display.getView().properties.ItemPopup.properties.view.properties.controls.insertButton, "click", function () { alert('stone the crows'); });

ただし、これをブラウズクリックイベントハンドラーに追加する$display.getView().properties.ItemPopup.properties.viewと、ポップアップがまだ完全にロードされていない可能性があるため、nullとしてエラーが発生します(そして、今示したように、ロードイベントが機能しないため、ロードを待つ方法がわかりません!)。

4

1 に答える 1

2

submit現在リッスンしているイベントではなく、各ポップアップが発生するイベントをリッスンする必要がありchangeます。

このchangeイベントは標準のHTMLイベントであるため、それに付随するすべての通常のルールに従います(たとえば、無効になっているコントロールに対しては発生しないようです)。

一方submit、イベントはカスタムTridionイベントです。残念ながら、これは文書化が少ないことを意味しますが、JavaScriptコードを読み取るだけで、いつ/どのように起動し、どのようにフックするかを確認できるという大きな利点があります。

小さな例を書けるかどうかはわかりますが、それまでの間、Nuno:Anguillaからのこの質問(および回答)をご覧ください-ポップアップからフィールドの値を更新しますか?

ハイパーリンクポップアップ自体でコンポーネントの選択に応答する場合は、内部を確認すると、アイテム選択ポップアップLink.jsのイベントに登録されていることがわかります。insert

$evt.addEventHandler(p.ItemPopup, "insert",
                     function Link$_onBrowseClicked$onPopupSubmitted(event)

追跡している人のために、それまでにあなたはこのポップアップのチェーンを持っています:

> Dashboard > Edit Component > Insert Hyperlink > Select Item

アップデート

insert私が提案したように、あなたはフッキングに向かって動いているようです。insertこれを実行しようとすると、ハイパーリンクポップアップ内からイベントをキャプチャすることもできません。

ただし、Item Select Popup自体からハンドラーを登録すると、次のようにトリガーされます。

$evt.addEventHandler($display.getView(), "insert", 
                     function() { alert('event fired in item selector'); });

それが実際にそれをフックする唯一の方法である場合(さらに調べますが、何が見つかるかわかりません)、スクリプトファイルをすべてのポップアップにロードし、ビューが完全にロードされたらハンドラーを登録する必要があります。

$evt.addEventHandler($display, "start", function () {
    $evt.removeEventHandler($display, "start", onDisplayStarted);

    if ($display.getView().getId() == "ItemSelectDialogView") {
        // we're in an Item select popup -> listen for the insert event
        $evt.addEventHandler($display.getView(), "insert", onItemInserted);
    }
}

function onItemInserted(e) {
    $evt.removeEventHandler($display.getView(), "insert", onItemInserted);
    var items = e.data.items;
    ...

ご覧のとおり、イベントハンドラーを登録する前に、ビューが正しく読み込まれたことを確認するためにstartイベントをリッスンします。このようなイベントハンドラーを削除することを忘れないでください。そうしないと、後で再入力の問題が発生します。$displayinsert

于 2012-08-16T12:26:56.247 に答える