1

我有一个在 javascript 控制台中显示错误的 js无法在此文件中调用 null 的方法“appendChild”:

(function(d) {
    if( typeof jQuery === 'undefined' ) {
        var srsr = d.createElement('script');
        srsr.src = '//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js';
        d.body.appendChild(srsr);

        setTimeout(function(){ doThat(); }, 5000);
    } else {
        doThat();
    }


    function getHost( url ) {
        var a = document.createElement('a');
        a.href = url;
        var host = a.hostname;

        var t = host.split(".");
        if( t.length == 2 ) {
            var host = "www."+host;
        } 

        return host;
    }   

    function doThat() {
        $.ajax({
            url:    'http://mobilesplashpro.com/app/assets/php/tRaCk_loAdInG_PoPUp.php',
            type: 'GET',
            data: 'adrs='+getHost( document.domain ),
            dataType:   'jsonp',
            jsonp:  false,
            jsonpCallback: 'methodCallback',
            success: function( data ) {
                if( data.message == "yes" ) {
                    $.getScript("http://mobilesplashpro.com/app/assets/js/popup/PoPUp_txt_CoDE.js",function() { iPhoneAlert(); });
                } else {

                }
            }, 
            error: function( error ) {
                console.log( error ); 
            }
        });
    }

})( document );

在另一个文件中使用了 Appendchild 代码,该文件运行良好但不在其中。

谢谢

4

2 回答 2

0

首先,将此代码放在正文的末尾(如果这是在您的头中,则正文不存在),如果必须将其放在头中,则应进行某种间隔,直到模拟 DomReady 事件(保证你有一个 document.body 可以遍历)。

例子:

var intervalDomReady = setInterval(function() { 
    if (document.body) {     
        clearInterval(intervalDomReady);
        intervalDomReady =null;
        DomReady(); 
    }
},500);

function DomReady() { /*you code*/ }

加载后,您只能从 google CDN 获得对 jquery 的引用。所以你不能确定它会在 5 秒内发生,必须首先绑定到脚本的 onload 事件,然后尝试使用 jquery 函数。

解决方案示例:

var d = document;
var srsr = d.createElement('script');
srsr.src = '//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js';
srsr.src.onload = function() { doThat(); } 
于 2013-08-22T16:03:13.510 回答
0

因为它在文档加载时运行,所以它是document.write.

如果您使用document.write加载脚本,它也会简化事情,因为它会同步加载脚本。

因此,您将不再需要该doThat()函数,并且setTimeout.


因此,首先将您的 jQuery 检查和脚本加载代码放在顶部的单独脚本中......

<script type="text/javascript">
if( typeof jQuery === 'undefined' ) {
    document.write('<scr' + 'ipt src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"><\/scr' + 'ipt>');
}
</script>

然后将您的主脚本放在上述脚本下方的单独脚本中......

<script>
(function(d) {
    function getHost( url ) {
        var a = document.createElement('a');
        a.href = url;
        var host = a.hostname;

        var t = host.split(".");
        if( t.length == 2 ) {
            var host = "www."+host;
        } 
        return host;
    }
    $.ajax({
        url:    'http://mobilesplashpro.com/app/assets/php/tRaCk_loAdInG_PoPUp.php',
        type: 'GET',
        data: 'adrs='+getHost( document.domain ),
        dataType:   'jsonp',
        jsonp:  false,
        jsonpCallback: 'methodCallback',
        success: function( data ) {
            if( data.message == "yes" ) {
                $.getScript("http://mobilesplashpro.com/app/assets/js/popup/PoPUp_txt_CoDE.js",function() { iPhoneAlert(); });
            } else {

            }
        }, 
        error: function( error ) {
            console.log( error ); 
        }
    });
})( document );
</script>

现在,如果没有加载 jQuery,新脚本将在第一个下方和第二个上方编写和加载,我们无需执行任何类型的 DOM 选择。

于 2013-08-22T16:22:11.143 回答