1

これは、Javascript の専門家にとっては簡単なはずです。

スキーマとは何か ( http://schema.org )を知らない人のために説明すると、これは検索エンジンが Web ページのコンテンツを読み取るための新しい方法です。関連するデータに特定のタグを付けることで機能します。

それが何であるかを知っている人のために、ページ上でデータがどのように見えるかを簡単に調べることができるchrome 拡張機能 (スキーマ エクスプローラー) を次に示します。例を参照してください。

現在:拡張機能には、by is が空のネストされた要素をスキップ/無視しないという小さな問題があります。以下に 2 つの例を示します。1 つ目は完全に機能しますが、2 つ目<div>はタグが空のために失敗します。

最初の例は動作します:

<div itemscope="" itemtype="http://schema.org/Movie">
   <h1 itemprop="name">Avatar</h1>
   <div itemprop="director" itemscope="" itemtype="http://schema.org/Person">
      Director: <span itemprop="name">James Cameron</span> (born <span itemprop="birthDate">August 16, 1954</span>)
   </div>
   <span itemprop="genre">Science fiction</span>
   <a href="http://pierreloicdoulcet.fr/movies/avatar-theatrical-trailer.html" itemprop="trailer">Trailer</a>
</div>

秒の例では問題が発生します:

<div itemscope="" itemtype="http://schema.org/Movie">
   <div>
     <h1 itemprop="name">Avatar</h1>
     <div itemprop="director" itemscope="" itemtype="http://schema.org/Person">
         Director: <span itemprop="name">James Cameron</span> (born <span itemprop="birthDate">August 16, 1954</span>)
     </div>
     <span itemprop="genre">Science fiction</span>
     <a href="http://pierreloicdoulcet.fr/movies/avatar-theatrical-trailer.html" itemprop="trailer">Trailer</a>
   </div>
</div>

私は拡張機能を見てきましたが、実際には、ほとんどの作業を行う 1 つの JavaScript ファイルと非常にうまくまとめられています。ループを実行するコードは次のとおりですが、空のネストされた要素をスキップできる必要があり一般的にもう少し堅牢である必要があります。

    var __explore = function(node, parentData)
    {
        if (parentData === null || parentData === undefined)
        {
            parentData = __dataTree;
        }
        if (node.getAttribute)
        {
            var isItemScope = node.getAttribute('itemscope');
            var hasItemProp = node.getAttribute('itemprop');
            var itemtype = node.getAttribute('itemtype');


            var childs = node.childNodes;

            var i = 0;

            var tmp = new Array();

            while (i < childs.length)
            {
                if (isItemScope !== null)
                    __explore(childs[i], tmp);
                else
                    __explore(childs[i], null);
                ++i;
            }

            if (isItemScope !== null)
            {
                parentData.push({name : 'scope', value : hasItemProp, type : itemtype, childs : [tmp], node : node});
            }
            else if (hasItemProp && parentData)
            {
                parentData.push({name : hasItemProp, value :  node.innerText});
            }
        }
    }

https://gist.github.com/3413475の完全なバージョンは次のとおりです。contentscript.js

うまくいけば、誰かがこれで私を助けてくれます。記録のために、私は著者に連絡しましたが、彼はもっと緊急の問題で頭がいっぱいです。

4

1 に答える 1

1

http://jsfiddle.net/vyrvp/1/が期待どおりに動作するようにしましたが、これは少しハックであることを認めなければなりません。このコードは、すべてのケースで機能し、読みやすくするために、さらにリファクタリングが必要になる場合があります。

于 2012-08-21T08:58:35.180 に答える