OperaのXPathについてのバグ(は9.50で修正されます)

はてなブックマーク - ku0522のブックマーク - 2008年4月6日に気が付いたけど、肝心のquaaさんの記事が消えているので補足エントリーを書いておきます。

Opera9.50"以前"でのバグ

動的に作成したDocumentでevaluateしたとき、XPath関数を使うと元のDocumentの要素・属性を取得してしまう。
具体的には下記のコードで、Opera9.2xはobject HTMLParagraphElementをalertしてしまう(Opera以外はnull)。

//Thx! id:quaa
<!DOCTYPE html>
<html>
<head>
<title>id() test</title>
</head>
<body>
<p id="aaa">a</p>
<script>
var doc = document.implementation.createDocument("", "test", null);
//XPathEvaluatorとコンテキストノードがdocumentじゃなくdocなので何も取得できないはず…
alert(doc.evaluate('id("aaa")/.', doc, null, 9, null).singleNodeValue);
</script>
</body>
</html>

id関数を始めcontainsとかが諸々ダメで、OperaAutoPagerizeを動かす際にネックになってました。これを回避するために、oAutoPagerizeではiframeを使用しています。

で、このバグはOpera9.50では修正されていています。どのBuildで修正されたのか把握してないのですが、2008/04/06時点で最新の9.50 beta Build 9864では問題ありませんでした。(oAutoPagerizeも9.50だったらiframe使わないようにしてみようかな)


なお、id("aaa")ではなくid("aaa")/.となっているのは、id関数のみのXPathだと要素を取得できないという別のバグのため。こちらも9.50では修正されています。


ちなみに、Safari3.04についてもid関数についてバグがあったんですが3.1で修正されているそうです。
Safari 3 の XPath のバグ: Days on the Moon