如何为禁用的文本框中更改的文本连接Tridion GUI扩展事件?

如何为禁用的文本框中更改的文本连接Tridion GUI扩展事件?,tridion,tridion-2011,Tridion,Tridion 2011,我正在链接弹出窗口上实现Tridion 2011(GA)GUI扩展(当您单击富文本区域中的超链接按钮时打开该扩展,以允许您选择要链接到的组件或url/mailto等) 我想在此弹出窗口中连接到选择或更新组件的点,以便根据所选组件的模式加载一些数据。问题是包含组件uri的html输入字段被禁用(因为值只能由选择器更改),我认为这会阻止更改事件触发 在我的扩展js中,我有以下内容,但是当我选择/更新一个组件时不会调用该函数,只有当我更改http/mailto链接时才会调用该函数 $evt.addEv

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

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

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

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

function onFieldUrlChanged()
{
    alert("url changed to: " + $("#FieldUrl").value);
}
还有其他的活动能起作用吗?否则,是否有某种方法可以挂接正在关闭的浏览弹出窗口

更新

根据Frank的建议,我正在尝试在Select Item弹出窗口中连接事件。现在,我为浏览按钮
单击添加了一个事件处理程序,这反过来又为弹出窗口添加了事件处理程序。我希望使用
insert
甚至
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.view
为空,可能是因为弹出窗口尚未完全加载(如前所示,加载事件不起作用,因此我不知道如何等待加载!).

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

change
事件是一个标准的HTML事件,因此受所有与之相关的常规规则的约束(例如,它显然不会为禁用的控件触发)

另一方面,
submit
事件是一个定制的Tridion事件。尽管不幸的是,这意味着它的文档较少,但它确实具有巨大的优势,我们可以简单地读取JavaScript代码,查看它何时/如何启动以及如何钩住它

我会看看是否能为您写一个小例子,但同时看看Nuno的这个问题(和答案):

如果您想响应超链接弹出窗口中的组件选择,请查看
Link.js
中的内容,您将看到它为项目选择弹出窗口的
insert
事件注册自身

$evt.addEventHandler(p.ItemPopup,“插入”,
函数链接$\u onBrowseClicked$onpopusubmitted(事件)
对于那些保持跟踪的用户,到那时您将拥有以下弹出窗口链:

>仪表板>编辑组件>插入超链接>选择项目
更新

我看到您正在按照我的建议挂起
insert
。当我尝试这样做时,我也无法从超链接弹出窗口中捕获
insert
事件

但是,如果我在项目选择弹出窗口本身中注册处理程序,它将触发:

$evt.addEventHandler($display.getView(),“insert”,
函数(){alert('event fired in item selector');});
如果这确实是挂接它的唯一方法(我将进一步查看,但不知道会找到什么),那么您应该将脚本文件加载到所有弹出窗口中,并在视图完全加载后注册处理程序:

$evt.addEventHandler($display,“start”,function(){
$evt.removeEventHandler($display,“start”,onDisplayStarted);
if($display.getView().getId()=“ItemSelectDialogView”){
//我们在一个项目选择弹出->监听插入事件
$evt.addEventHandler($display.getView(),“insert”,onItemInserted);
}
}
职能部门(e){
$evt.removeEventHandler($display.getView(),“insert”,onItemInserted);
var项目=e.data.items;
...

如您所见,我们在
$display
上侦听
启动
事件,以确保在注册
插入
事件处理程序之前已正确加载视图。不要忘记删除此类事件处理程序,否则您将在稍后遇到重新输入问题。

谢谢Frank-在ItemSelect弹出窗口中注册事件处理程序s、 请注意,我不需要在所有弹出窗口中都包含js,我可以使用编辑器配置仅为ItemSelectDialog()包含特定的js,该对话框只包含插入事件处理程序,该处理程序会回调开瓶器中的函数(根据所选组件的架构加载数据)。这是通过window.opener.myFunction()完成的。请注意,实际上问题与禁用文本框无关。更改事件不会针对任何通过编程方式更改其内容的输入字段触发,仅通过用户输入(我在尝试挂接FieldTitle(文本框)和TargetType(选择)字段的更改时发现了这一点