【发布时间】:2011-07-20 10:41:56
【问题描述】:
我是 XUL 编程的新手,我学到了很多东西,但是我很难理解触发观察者通知并让另一个 XUL 窗口上的监听器从观察者函数中获取字符串值(观察者将字符串参数传递给其他 XUL 窗口)。
这是我的树 xil 文件。
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window title="ContactMatrix;"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/x-javascript" src="fire.js" />
<hbox>
<textbox type="search" oncommand="SearchKeyword(this)"/>
</hbox>
<tree editable="false" id="my-tree" flex="1" seltype="cell" onclick="onTreeClicked(event)"
datasources="file://C:/mercredi.xml" ref="*" querytype="xml" enableColumnDrag="true" hidecolumnpicker="false" >
</tree>
</window>
这是我的脚本:
function SearchKeyword(oElem)
{
var filter = document.getElementById("filter");
filter.setAttribute("value", oElem.value);
document.getElementById("my-tree").builder.rebuild();
}
function onTreeClicked(event){
var tree = document.getElementById("my-tree");
var tbo = tree.treeBoxObject;
// get the row, col and child element at the point
var row = { }, col = { }, child = { };
tbo.getCellAt(event.clientX, event.clientY, row, col, child);
var cellText = tree.view.getCellText(row.value, col.value);
alert(cellText);
observe();
}
XPCOMUtils.defineLazyServiceGetter(this, "obsService", "@mozilla.org/observer-service;1", "nsIObserverService");
obsService.notifyObservers(null, "xulschoolhello-test-topic", cellText);
let observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
observerService.addObserver(testObserver, "xulschoolhello-test-topic", false);
let testObserver = {
observe : function(aSubject, aTopic, cellText) {
if (aTopic == "xulschoolhello-test-topic") {
window.alert("Data received: " + cellText); //cellText=aData
var textboxElement = document.getElementByID("ali");
textboxElement.value = cellText; // from the notification
}
}
}
var yourAddonObject = {
obsService: Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService),
register: function()
{
this.obsService.addObserver(this, "xulschoolhello-test-topic", false);
}
}
function DisplayContacts()
{
alert('opening file fire');
var windowObjectReference = window.openDialog("chrome://hello/content/fire.xul","fire");
}
这是我的文本框 XUL 文件。我想将 xul 树单元格值触发到此文件中的文本框。
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<window title="Subjects import"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" >
<script type="application/x-javascript" src="fire.js" />
<groupbox>
<caption>Subject(s)</caption>
<hbox>
<label value="Subjects"/>
<textbox id='ali' value=""/>
<button label="Contacts" onclick="DisplayContacts();"/>
</hbox>
</groupbox>
</window>
我在将树单元格值触发到另一个 XUL 窗口时遇到问题。从我的文本框 XUL 文件中,我可以打开我的 Tree XUL 文件,当我单击树单元格时,我可以获得树单元格的值作为警报消息。之后我的脚本不起作用。
基本上在这里,当我单击树单元格时,选定的树单元格值应该会触发到另一个 XUl 窗口中的文本框。
请有人帮我解决这个问题。在这里,我将脚本文件和 xul 文件分开。 从这个网站我已经采取了所有可能的脚本。https://developer.mozilla.org/en/XUL_School/Observer_Notifications 谢谢你。 注意:我在这里的同一篇文章中更新了我的问题。
【问题讨论】:
-
在调用 addObserver 函数之前,您是否尝试过定义 testObserver?我不知道它之后会起作用,但这可能是第一个错误......
-
分离 xul 和脚本文件后,现在我可以打开我的 xul 树文件了。谢谢。
标签: javascript firefox xul listener observer-pattern