2017-01-27 5 views
0

С помощью следующей php функции:отложить выполнение объявления скрипта

<?php 
    if (!function_exists('wrapAds')) { 
    function wrapAds($current_banner_name){ 
     $STRING_EMPTY = ""; 
     $openExprResult = array(); 
     $closeExpreResult = array(); 
     $openExpr = "/(<div[^>]*>)/"; 
     $closeExpr = "/(<\/div>)/"; 

     $banner = tsp_get_banner($current_banner_name); 
     $result = '<pre data-script-reference>' 
       .htmlspecialchars($banner) 
       .'</pre>'; 

    return $result; 
    } 
    } 
?> 

Я рендеринг следующих markup:

<pre data-script-reference="1">&lt;!--- s: middle-box-sidebar --&gt; 
&lt;div class="ads middle-box-sidebar"&gt;&lt;script type="text/javascript"&gt; 
var FW_type = "4w"; 
var FW_code = "18xxxx;95xxx;70xxx;0"; 
var FW_dimension = "300x250"; 
var FW_category = "gossip"; 
&lt;/script&gt; 
&lt;script src="//optimized-by.4wnetwork.com/simply_loader.js?4wvideo=true" type="text/javascript"&gt;&lt;/script&gt;&lt;/div&gt; 
&lt;!--- e: middle-box-sidebar --&gt;</pre> 

Теперь я Тринг отложить закодированное выполнение скрипта позже следующий сценарий:

<script type="text/javascript"> 
     [].slice.call(document.querySelectorAll('pre[data-script-reference]')) 
    .forEach(function(item){ 
     var txt = document.createElement("textarea"); 
     txt.innerHTML = item.innerHTML; 
     var parentNode = item.parentNode; 
     var p0 = txt.innerText; 
     // parentNode.removeChild(item); 
     parentNode.innerHTML += p0; 

    </script> 

похоже, что декодированная scr ipt не выполняется вообще, что я делаю неправильно?

ответ

1

После триллион бесполезных кода казни, я просто отметил любопытное заявление внутри длинного списка предупреждений:
«Не удалось выполнить„запись“на„Документ“: Это невозможно записать в документ от асинхронно загруженного внешнего скрипта, если он явно не открыт ».. Я просмотрел это сообщение, и нашел nice question.

только не принял ответ предложить postscribe.js


Асинхронный писать JavaScript, даже с document.write.


Удаленные сценарии, особенно объявления, блокируют страницу от чего-либо еще во время загрузки. Они вносят большой процент от времени загрузки, который влияет на вашу прибыль. Асинхронные объявления не блокируют страницу, и может быть доставлен после основного содержимого - Async FTW.

Почему так сложно доставлять объявления асинхронно? Потому что они могут содержать вызовы document.write, которые ожидают обработки синхронно. PostScript позволяет отправлять синхронное объявление асинхронно без изменения рекламного кода.

Так, так как я должен управлять обоими объявления в теле и на боковой панели, я сделал немного рефакторинга, перемещая PHP функцию в functions.php:

/** 
* redefine and get the legacy ads block from base library by name 
* render as encoded plain text inside a *pre* wrapper 
*/ 
function tsp_get_banner($current_banner_name){ 
    $STRING_EMPTY = ""; 
    // https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags 
    $openExpr = "/(<div[^>]*>)/"; 
    $closeExpr = "/(<\/div>)/"; 
    $openExprResult = $closeExpreResult = array(); 
    $banner = original_tsp_get_banner($current_banner_name); 
    preg_match($openExpr, $banner, $openExprResult); 
    $banner = preg_replace($openExpr, $STRING_EMPTY, $banner); 
    preg_match($closeExpr, $banner, $closeExpreResult); 
    $banner = preg_replace($closeExpr, $STRING_EMPTY, $banner); 
    return wrapAdsSnippet($banner, $openExprResult[0], $closeExpreResult[0]); 
} 

function wrapAdsSnippet($source, $prefix, $postfix){ 
    $result = '<pre data-script-reference style="display:none;">' 
          .htmlspecialchars($source) 
         .'</pre>'; 
    if(isset($prefix) && isset($postfix)){ 
     $result = $prefix.$result.$postfix; 
    } 
    return $result; 
} 

затем я изменил включение блока: , так что мне ничего не нужно менять.

<?php 

эхо tsp_get_banner ("среднего коробчатая боковая панель");

echo renderAds("middle-box-sidebar"); 
?> 

Я только изменить окончательный сценарий, чтобы включить в footer.php:

var MyCompanyLab; 
(function (MyCompanyLab) { 
    "use strict"; 
    var Ads; 
    (function (Ads) { 
     var Optimization; 
     (function (Optimization) { 
      var PostProcessor = (function() { 
       function PostProcessor() { 
       } 
       PostProcessor.postponeAdsExecution = function() { 
        $("pre[data-script-reference]").each(function (idx, item) { 
         var parentNode = item.parentNode; 
         postscribe(parentNode, $('<textarea />').html(item.innerHTML).text(), { 
          done: function() { }, 
          error: function() { }, 
          releaseAsync: true, 
         }); 
         parentNode.removeChild(item); 
        }); 
       }; 
       return PostProcessor; 
      }()); 
      Optimization.PostProcessor = PostProcessor; 
     })(Optimization = Ads.Optimization || (Ads.Optimization = {})); 
    })(Ads = MyCompanyLab.Ads || (MyCompanyLab.Ads = {})); 
})(MyCompanyLab|| (MyCompanyLab= {})); 


<script type="text/javascript"> 
    ... 
    MyCompanyLab.Ads.Optimization.PostProcessor.postponeAdsExecution(); 
    ... 
</script>