09/11/11 23:24:56
ffやthunderbirdとは関係ないStandaloneなアプリをXULで開発しようとする場合に
一番参考になる書籍ってなんでしょう?
429:デフォルトの名無しさん
09/11/11 23:38:20
>>428
>ffやthunderbirdとは関係ない
釣り?文盲?白痴?
430:デフォルトの名無しさん
09/11/12 01:14:05
fxなんて数あるGecko搭載アプリの一つでしかねーぞ。
431:デフォルトの名無しさん
09/11/13 04:14:24
>>428
和書だとFirefox関連しかないみたいだし、
洋書でもEssential XUL Programmingくらいしか見つからなかった
現状では一番参考とかいうレベルではなく、それくらいしか選択肢無いみたい
それよりはXULRunnerで動いてるソフトのソースを見た方が参考になると思う
URLリンク(ja.wikipedia.org) の動作するアプリケーション等を参考に
>>429
無知は罪じゃないから安心していいよ
そもそも>>1にちゃんと説明は書いてあるんだけどね
432:デフォルトの名無しさん
10/02/07 19:04:19
質問をさせてください。
Firefoxでロケーションが変わるたびにサイドバーに
表示しているxulコントロールの要素の値を変更させるものを作りたいと思っているのですが、
その設定の方法は
window.top.document.getElementById("sidebar-box").getElementById("コントロール名").setAttribute(要素名, 設定する値);
で良いのでしょうか?
433:432
10/02/07 19:19:55
すみません、上記の方法で試してみたところうまく動いてくれませんでした。
正しい方法についてご教授願いたく思います。
434:デフォルトの名無しさん
10/02/08 11:45:27
>432
サイドバーの内容はサブフレーム扱いだからそれでは動かないと思う
そのスクリプトが動いてるのはbrowser.xulの名前空間?
それともサイドバー内の名前空間?
browser.xulの名前空間なんだったらこう。
document.getElementById("browser").contentDocument.getElementById("myControl").setAttribute("attributeName", "value");
435:デフォルトの名無しさん
10/02/08 11:54:49
すまん間違えた
document.getElementById("sidebar").contentDocument.getElementById("myControl").setAttribute("attributeName", "value");
436:432
10/02/09 23:46:16
>435
ありがとうございます。
しかし試してみましたが期待した動作をしてくれませんでした。
名前空間についてですが、まだそこまでの理解をしておらず、調べながらになりますが、
<overlay id="sidetempOverlay" xmlns="URLリンク(www.mozilla.org)"></overlay>
内にスクリプトがあります。名前空間はこのxmlns要素内の事でよろしかったでしょうか?
連続の質問で大変申し訳ありません。
437:デフォルトの名無しさん
10/02/10 00:07:59
>>436
その<overlay>は何をオーバーレイしてるの? browser.xul? 別の物?
438:432
10/02/10 00:51:45
オーバーレイをしているファイル内では以下のように記述しています
<?xml version="1.0"?>
<overlay id="sidetempOverlay" xmlns="URLリンク(www.mozilla.org)">
<script type="application/x-javascript" src="locationchange.js"></script>
<menupopup id="viewSidebarMenu">
<menuitem observes="side_with_page" />
</menupopup>
<broadcasterset>
<broadcaster id="side_with_page" label="SIDEBAR"
autoCheck="false" type="checkbox" group="sidebar"
sidebartitle="SIDEBAR" sidebarurl="chrome://sidebar/content/side_content.xul"
oncommand="toggleSidebar('side_with_page');"/>
</broadcasterset>
</overlay>
[表示]→[サイドバー]に表示するボタンと、
それを押すことで表示されるサイドバーです。
サイドバー内には独自に作ったxulが入るようになっています。
これでbrowser.xulを書き換えていると言うことなのでしょうか。
439:デフォルトの名無しさん
10/02/10 20:00:36
それなら>435でサイドバー内にアクセス出来ると思うんだけどな。
↓にもそう書いてあるし。
URLリンク(developer.mozilla.org)
「期待した動作をしない」ってのがどういう状況なのか分からないのでなんとも。
そもそも、ロケーションの変更でサイドバーの内容を書き換えるなら、
サイドバーのスクリプトからtabbrowserにProgress Listenerを追加するのが普通だと思うんだが。
URLリンク(developer.mozilla.org)
440:439
10/02/10 20:12:46
あ、ProgressListenersの方のURLはサイドバー関連は書かれてないや。間違って張ってしまった。
441:432
10/02/10 23:33:52
>サイドバーのスクリプトからtabbrowserにProgress Listenerを追加するのが普通だと思うんだが。
一度そうしようとしたことがあるのですが、
<overlay>内でJavaScriptファイルのインポートを記述した場合、
自動でスクリプトが実行されているのか、リスナーに追加されていたのですが、
<window>内でJavaScriptファイルのインポートを記述した場合、
リスナーに追加されていないようでした。
<window>でonload属性でスクリプトを動かせば良いのかと思い試したのですが、
<window>外にインポートの記述をしたところ、エラーを吐かれてしまいました。
以下がエラー文です
「XML パースエラー: ドキュメント要素の後ろに不正な文字列があります。」
サイドバーのスクリプトからリスナーを追加する方法を教えていただきたいです。
長々と質問を続けて大変申し訳ありません。
442:デフォルトの名無しさん
10/02/11 00:06:38
<window onload="init();" onunload="uninit();">
<script type="application/x-javascript" src="progress.js"/>
</window>
で、progress.jsに
function init() { top.gBrowser.addProgressListener(~
って書けばいいと思うんだが。
443:432
10/02/11 00:37:03
>>442
試してみました、しかしどうも動いてくれません。
ちなみにサイドバーのスクリプト内で
document.getElementById("sidebar").contentDocument.getElementById("myControl").setAttribute("attributeName", "value");
を動かしてみたところ、コントロールの要素の値は変更されていませんでした。
444:デフォルトの名無しさん
10/02/11 01:07:47
いやいやいや、そりゃサイドバーのスクリプトから見たら
document.getElementById("sidebar").contentDocument
が存在するわけないでしょ。もうすこし冷静になって考えようよ。
あと、「動かない」だけじゃなくて、どこまで出来てて、どこから出来ないのか、
どこで詰まっててどういうエラーが出るのか、ちゃんと自分で把握して説明しないと、
エスパーでもないかぎりアドバイスしようがないよ。
445:432
10/02/11 03:10:22
申し訳ありません、確かにその通りでした。
ところで急展開申し訳ないのですが、
現在期待した動き(ロケーションが変わったときにサイドバーのコントロールの要素が変更される)
が動きました。
どうやらaddEventListenerをしていなかったのが原因だったようです。
446:432
10/02/11 03:14:07
JavaScriptのソースは以下のとおりです
(locationchange.js)
const STATE_START = Components.interfaces.nsIWebProgressListener.STATE_START;
const STATE_STOP = Components.interfaces.nsIWebProgressListener.STATE_STOP;
var bgipeo_Listener = {
QueryInterface: function(aIID){
if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
aIID.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_NOINTERFACE;
},
onStateChange: function(aWebProgress, aRequest, aFlag, aStatus){
if(aFlag & STATE_START){}
if(aFlag & STATE_STOP){}
return 0;
},
onLocationChange: function(aProgress, aRequest, aURI){
document.getElementById(コントロール名).setAttribute(要素名, value);
return 0;
},
447:432
10/02/11 03:15:04
続き
onProgressChange: function() {return 0;},
onStatusChange: function() {return 0;},
onSecurityChange: function() {return 0;},
onLinkIconAvailable: function() {return 0;}
}
function init(){
top.gBrowser.addProgressListener(bgipeo_Listener, Components.interfaces.nsIWebProgress.NOTIFY_STATE_DOCUMENT);
}
function uninit(){
top.gBrowser.removeProgressListener(bgipeo_Listener);
}
var myExtension = {
init: function() {
top.gBrowser.addProgressListener(Listener, Components.interfaces.nsIWebProgress.NOTIFY_STATE_DOCUMENT);
},
uninit: function() {
top.gBrowser.removeProgressListener(Listener);
}
};
window.addEventListener("load", function() {myExtension.init()}, false);
window.addEventListener("unload", function() {myExtension.uninit()}, false);
サイドバー
<window onload="bgipeo_init();" onunload="bgipeo_uninit();">
<script type="application/x-javascript" src="locationchange.js" />
</window>
448:432
10/02/11 03:20:43
親切にお答えいただき誠にありがとうございました。
また大量の投稿大変申し訳ありませんでした。
次からは皆様のお役に立てればと思います。
では失礼いたします。