2013-08-22 3 views
1

У меня есть JS, который показывает ошибку в консоли JavaScript Невозможно вызвать метод «AppendChild» нулевых в этом файле: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 код в одном файле, работает отлично, но не в этом ..

Благодаря

+3

проверить, что вы получаете в d, выглядит как d.body is null – HaBo

+0

Какой браузер вы используете? –

+3

Чтобы работать, этот фрагмент должен быть помещен в 'body', если он находится в' head', 'body' не будет существовать во время выполнения кода. – Teemu

ответ

0

Прежде всего, поместите этот код в конце вашего тела (если это в вашей голове, тело не существует делает), если вы должны поместить его в голове, вы должны сделайте какой-то интервал до тех пор, пока вы не имитируете событие DomReady (это гарантирует, что у вас есть document.body для перемещения).

Пример:

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

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

Вы только ссылку на JQuery от Google CDN, как только он будет загружен. Таким образом, вы не будете уверены, что это произойдет через 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(); } 
+0

Функция вызывается с помощью 'document', а не iframe. Это показано в связанном файле JS. –

+0

, но m использует функцию appendchild в другом файле и отлично работает. –

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.

+0

Хорошая точка в synconous document.write, я даже не знал об этом. У вас уже есть документ document.body html, это заменит весь наш html? –

+0

@Roger: Нет. Если 'document.write' используется во время начальной загрузки страницы, тогда HTML написан в строке после текущего скрипта, что напоминает мне об ошибке в моем ответе. Код, который использует загруженный скрипт, должен быть в отдельном скрипте, чтобы сначала загрузить написанный скрипт. Я обновлю. –