0

このリンク(http://km0.la/js/mozXPath/)で提供されているカスタムJavaScript関数を使用して、FireFoxに特定のXML機能を実装しています。

コードは次のとおりです。

// mozXPath
// Code licensed under Creative Commons Attribution-ShareAlike License 
// http://creativecommons.org/licenses/by-sa/2.5/
if( document.implementation.hasFeature("XPath", "3.0") ) {
    if( typeof XMLDocument == "undefined" ) { XMLDocument = Document; }
    XMLDocument.prototype.selectNodes = function(cXPathString, xNode) {
        if( !xNode ) { xNode = this; }
        var oNSResolver = this.createNSResolver(this.documentElement);
        var aItems = this.evaluate(cXPathString, xNode, oNSResolver, 
                     XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
        var aResult = [];
        for( var i = 0; i < aItems.snapshotLength; i++) {
            aResult[i] = aItems.snapshotItem(i);
        }
        return aResult;
    }
    XMLDocument.prototype.selectSingleNode = function(cXPathString, xNode) {
        if( !xNode ) { xNode = this; } 
        var xItems = this.selectNodes(cXPathString, xNode);
        if( xItems.length > 0 ){ return xItems[0]; }
        else{ return null; }
    }
    Element.prototype.selectNodes = function(cXPathString) {
        if(this.ownerDocument.selectNodes) { 
            return this.ownerDocument.selectNodes(cXPathString, this);
        }
        else { throw "For XML Elements Only"; }
    }
    Element.prototype.selectSingleNode = function(cXPathString) {   
        if(this.ownerDocument.selectSingleNode) {
            return this.ownerDocument.selectSingleNode(cXPathString, this);
        }
        else { throw "For XML Elements Only"; }
    }
}

XMLオブジェクトが定義され、XMLコンテンツがロードされていると仮定して、「cd_rank」という名前のXMLタグにアクセスする方法の例を次に示します。

var cd_rank_XMLObj = XMLObj.selectSingleNode("cd_rank");

私がやりたいのは、プロパティ「nodeTypedValue」をselectSingleNode()関数に追加することですが、これを行う方法がわかりません。Element.prototype.selectSingleNode関数で、次を追加してみました。

this.prototype.nodeTypedValue = this.textContent;

ただし、未定義であるというエラーが表示されます。私はそれを関数の外に追加しようとしましたが、それをばかにして概念を理解するためだけに、それは未定義であるとも言っています:

var XMLObj.selectSingleNode.prototype.nodeTypedValue = XMLObj.textContent;
alert(XMLObj.selectSingleNode("cd_rank").nodeTypedValue);

基本的に、私がやろうとしているのは、プロトタイプ関数にプロトタイププロパティを追加することだと思います。しかし、私はこれについていくらかの助けが必要です。「XMLObj.selectSingleNode(Path).nodeTypedValue」と書くように「nodeTypedValue」を追加するにはどうすればよいですか?

4

1 に答える 1

0

さて、私はそれを関数内に追加する方法を理解したと思います。おそらくロジックよりも運が原因です。

Element.prototype.selectSingleNode = function(cXPathString){    
    if(this.ownerDocument.selectSingleNode) {
        var result = this.ownerDocument.selectSingleNode(cXPathString, this);
        if (result != null) {
            result.nodeTypedValue = result.textContent;
        }
        return result;
    }
    else{throw "For XML Elements Only";}
}
于 2011-10-17T18:04:26.207 に答える