2

Greasemonkey (Firefox) 用の UserScript を作成し、Chrome の Tampermonkey との互換性をテストしており、開発者コンソールでエラーが発生しています。

Uncaught TypeError: Cannot read property 'profile_url' of undefined
Uncaught TypeError: Cannot read property 'encoded_name' of undefined

エラーは、次のように呼び出されるonreadystatechangedコールバックを参照しているようですGM_xmlhttpRequest:

var flairs = document.querySelectorAll('span.flair');
var steam_re = /(?:(?:https?:\/\/)?www\.)?(?:steam|pc)(?:community\.com\/?(?:(id|profiles)\/?)?|[\s\-_]*id)?[\/:\s\|]*(.{2,}?)(?:[\/|:\-\[(] ?(?:\/?(?:ghost|enforcer|tech|mm|master))+[\[)]?)?$/i

function get_text(e) { return e.innerText || e.textContent; }

function set_text(e, t) {
    if (e.innerText)
        e.innerText = t;
    else
        e.textContent = t;
}

var parser = new DOMParser();

for (var i = 0; i < flairs.length; i++) {
    var text = get_text(flairs[i]);
    var match = steam_re.exec(text);
    if (match == null || match.length < 3)
        continue;
    var type = match[1] || 'id';
    var name = encodeURIComponent(match[2]);
    var url = 'http://steamcommunity.com/' + type + '/' + name;
    var xml_url = url + '?xml=1';
    GM_xmlhttpRequest({
        method: 'GET',
        url: xml_url, // Link to a steam profile with ?xml=1 added
        accept: 'text/xml',
        context: {
            flair_index: i,
            flair_text: text, // textContent of span element
            encoded_name: name,
            profile_url: url, // Link to steam profile
            query_url: xml_url
        },
        onreadystatechange: function(response) {
            if (response.readyState != 4)
                return;
            // Attempt to fall back to alternate forms of context,
            // none of which works. response.context works on Firefox/Greasemonkey.
            var context = response.context || this.context || context;
            var doc = parser.parseFromString(response.responseText, 'text/xml');
            var validProfile = doc.documentElement.nodeName == 'profile';
            var a = document.createElement('a');
            a.href = validProfile ?
                context.profile_url : // TypeError here, context is undefined
                ('http://steamcommunity.com/actions/SearchFriends?K=' + context.encoded_name);
            a.className += (validProfile ? 'steam-profile-link' : 'steam-profile-search-link');
            var a_text = document.createTextNode(context.flair_text);
            a.appendChild(a_text);
            set_text(flairs[context.flair_index], '');
            flairs[context.flair_index].appendChild(a);
        }
    });
}

関数自体は正常に呼び出され、コールバックが呼び出されますが、そのcontext中の var にアクセスしようとすると、未定義です。

Firefox ではすべて期待どおりに動作します。「flair」クラスを持つ要素を繰り返し処理しspan、Steam ユーザー名が含まれているかどうかを正規表現でチェックし、含まれている場合は SteamCommunity ページへのリンクを作成します。( githubの完全なソース)。スクリプトは/r/PaydayTheHeistOnlineで実行されます。

xmlhttpRequest に渡されたコンテキスト プロパティを使用する代わりに、関数の外部で定義された配列を使用してデータを格納することをテストしましたが、まったく同じエラーが発生します。

4

1 に答える 1