2

我正在链接弹出窗口上实现 Tridion 2011 (GA) GUI 扩展(当您单击富文本区域中的超链接按钮以使您能够选择要链接到的组件或 url/mailto 等时打开的那个。 )。

我想在此弹出窗口中选择或更新组件的位置,以便我可以根据所选组件的架构加载一些数据。问题是包含组件 uri 的 html 输入字段被禁用(因为该值只能由选择器更改),我认为这会阻止更改事件触发。

在我的扩展 js 中,我有以下内容,但是当我选择/更新组件时不会调用该函数,仅当我更改 http/mailto 链接时

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

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

是否有其他活动可行?否则,有什么方法可以挂钩正在关闭的浏览弹出窗口?

更新

按照弗兰克的建议,我试图在“选择项目”弹出窗口中加入事件。我现在为浏览按钮添加了一个事件处理程序click,它又为弹出窗口添加了事件处理程序。我希望使用insertor unload,但是相当烦人的是,唯一似乎触发的是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.viewnull,可能是因为弹出窗口尚未完全加载(如所示,加载事件不起作用,所以我不知道如何等待它加载!)。

4

1 回答 1

2

您可能需要收听submit每个弹出窗口触发的事件,而不是change您现在正在收听的事件。

change事件是一个标准的 HTML 事件,因此受制于随之而来的所有常规规则(例如它显然不会为禁用的控件触发)。

submit另一方面,该事件是自定义 Tridion 事件。尽管不幸的是这意味着它的文档较少,但它确实具有巨大的优势,我们可以简单地阅读 JavaScript 代码来查看它何时/如何触发以及如何挂钩它。

我会看看我是否可以为你写一个小例子,但同时看看来自 Nuno 的这个问题(和答案):Anguilla - Updating a field's value from a popup? .

如果您想响应超链接弹出窗口本身中的组件选择,请查看内部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事件$display以确保视图已正确加载。insert不要忘记删除此类事件处理程序,否则您以后会遇到重新进入的问题。

于 2012-08-16T12:26:56.247 回答