当然と言えば当然だが、 RDF リソースから生成した要素を得るために menupopup.getElementsByTagName('menuitem')
などと書くと、 template 内の要素まで数えてしまう(ちなみに、生成された要素は template の後に並んでいる)。生成された要素の数を得るときは elem.length-1
のようにすることを忘れないように。
getSelection()
は場合によって動作が変わる。 document.getSelection()
とすると選択した部分の文字列を、 window._content.getSelection()
のようにすると DOM2 の Range オブジェクトを返す。確実に文字列として取得したければ、 getSelection().toString()
とする。
XUL は XML の応用系なので、中に XHTML の要素を埋め込むことができるが、 XUL 中の JavaScript から単純に document.createElement('a')
のように生成した要素は HTML のリンクにはならない( DOM2 としては当然)。こういうときは DOM2 の document.createElementNS()
(ネームスペース付きで要素を生成する)を使う。
const XHTMLNS = 'http://www.w3.org/1999/xhtml';
var new_a = document.createElementNS(XHTMLNS, 'a');
XLink の各属性を使うと任意の要素をリンクにすることができるが、読み込んだ HTML 文書に最初からある要素に DOM 操作で XLink の属性を加えても、リンクにはならない。 DOM で何らかのネームスペースをつけて生成した要素については、指定が有効になる。どうなってんだ?
const XLinkNS = 'http://www.w3.org/1999/xlink';
const XHTMLNS = 'http://www.w3.org/1999/xhtml';
// これはリンクにならない
var elem = document.getElementsByTagName('span')[0];
elem.setAttributeNS(XLinkNS, 'xlink:type', 'simple');
elem.setAttributeNS(XLinkNS, 'xlink:href', 'https://piro.sakura.ne.jp/');
// これはリンクになる
var elem = document.createElementNS(XHTMLNS, 'span');
elem.setAttributeNS(XLinkNS, 'xlink:type', 'simple');
elem.setAttributeNS(XLinkNS, 'xlink:href', 'https://piro.sakura.ne.jp/');
改行を含んだ文字列を menuitem などの label としてそのまま表示しようとすると、改行部分が化けるだけでなく、表示にやたら時間がかかる。最近の Mozilla に搭載された、コンテキストメニューからの選択語句の検索機能も、そういう現象が起こる。この現象は、その文字列を表示する前に string = string.replace(/\s/g, '');
などとして改行文字を全て取り除いてやれば、発生しない。
event.isChar
は、環境によっては常に false を返すらしい(未確認情報――報告が1件あっただけなので)。代用としては、マッチングで event.type.match(/key/i)
と書くなどの方法がある。