我正在链接弹出窗口上实现Tridion 2011(GA)GUI扩展(当您单击富文本区域中的超链接按钮以打开时,可以选择要链接到的组件,或者url / mailto等)。
我想勾选在此弹出窗口中选择或更新组件的位置,以便我可以根据所选组件的架构加载一些数据。问题是包含组件uri的html输入字段被禁用(因为值只能由选择器更改),我认为这可以防止更改事件被触发。
在我的扩展程序中,我有以下内容,但是当我选择/更新组件时,只有在我更改http / mailto链接时才会调用该函数
$evt.addEventHandler($("#FieldUrl"), "change", onFieldUrlChanged);
function onFieldUrlChanged()
{
alert("url changed to: " + $("#FieldUrl").value);
}
还有其他一些可行的活动吗?否则,是否有某些方法可以挂钩浏览弹出窗口?
更新
根据Frank的建议,我试图在“选择项目”弹出窗口中挂钩事件。我现在为浏览按钮click
添加了一个事件处理程序,它又为弹出窗口添加了事件处理程序。我本来希望使用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
的错误为空,可能是因为弹出窗口还没有完全加载(如刚才所示,加载事件不起作用,所以我看不到我如何等待它加载!)。
答案 0 :(得分: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
。当我尝试这样做时,我也无法从Hyperlink弹出窗口中捕获insert
事件。
但是如果我从 注册项目选择弹出窗口本身注册处理程序,它会触发:
$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
事件处理程序之前已正确加载视图。不要忘记删除此类事件处理程序,否则您最终会遇到重新输入问题。