0
(function () {

    function callbackF(data) {
        eval(data.script);
    }

    window.onload = function () {
        if (url.indexOf('.html') > 0) {
            var gt_widget_id = document.createElement('div');
            gt_widget_id.setAttribute('id', 'gt_widget_0');
            var comments = document.getElementById('comments');
            comments.parentNode.insertBefore(gt_widget_id, comments);
            var comments = document.getElementById('comments');
            var script = document.createElement('script');
            script.setAttribute('src', "http://dev.example.com/wp/wpregister.asp?callback=callbackF&ver=2.5&url=" + encoded_url);
            script.setAttribute("type", "text/javascript");
            script.setAttribute("id", "grazit_script");
            document.getElementById("gt_widget_0").parentNode.appendChild(script);
        }
    }
})();

htmlは質問に関連していません。タグは追加され、json returnは呼び出しの直後です。コンソールは、callbackFが未定義であると通知します。何故ですか?

4

1 に答える 1

1

何故ですか?

callbackFクロージャーの外で関数を定義する必要があるため:

function callbackF(data) {
    eval(data.script);
}

(function () {
    window.onload = function () {
        if (url.indexOf('.html') > 0) {
            var gt_widget_id = document.createElement('div');
            gt_widget_id.setAttribute('id', 'gt_widget_0');
            var comments = document.getElementById('comments');
            comments.parentNode.insertBefore(gt_widget_id, comments);
            var comments = document.getElementById('comments');
            var script = document.createElement('script');
            script.setAttribute('src', "http://dev.example.com/wp/wpregister.asp?callback=callbackF&ver=2.5&url=" + encoded_url);
            script.setAttribute("type", "text/javascript");
            script.setAttribute("id", "grazit_script");
            document.getElementById("gt_widget_0").parentNode.appendChild(script);
        }
    }
})();

または、クロージャーの外部からアクセスできるようcallbackFに、スコープで関数を定義することもできます。window

(function () {
    window.callbackF = function(data) {
        eval(data.script);
    };

    window.onload = function () {
        if (url.indexOf('.html') > 0) {
            var gt_widget_id = document.createElement('div');
            gt_widget_id.setAttribute('id', 'gt_widget_0');
            var comments = document.getElementById('comments');
            comments.parentNode.insertBefore(gt_widget_id, comments);
            var comments = document.getElementById('comments');
            var script = document.createElement('script');
            script.setAttribute('src', "http://dev.example.com/wp/wpregister.asp?callback=callbackF&ver=2.5&url=" + encoded_url);
            script.setAttribute("type", "text/javascript");
            script.setAttribute("id", "grazit_script");
            document.getElementById("gt_widget_0").parentNode.appendChild(script);
        }
    }
})();
于 2013-02-17T15:22:55.970 に答える