压缩中断脚本

时间:2018-03-18 19:54:37

标签: javascript php compression

我有以下JS( not jQuery ),我想压缩(保存在带header('Content-type: text/javascript')的PHP文件中):

var $url = window.location.href;

    $url = $url.toLowerCase().replace(/^(http(s)?\:\/\/)/g, ''),
    $url = $url.split('/');

var $current_page = $url[$url.length - 1].replace(/(\?.*)?(\#.*)?/g, ''); // Current Page

document.addEventListener('DOMContentLoaded', function() {
    if ($current_page === 'index.html') {
        if (window.location.hash) {
            var $current_hash = window.location.hash.substring(1);
        } else {
            window.location.hash = '';
        }

        // Ignore the code above, the important part is right below:
        var $fp_imgs = document.querySelectorAll('img.-homepage-poster');
        $fp_imgs.forEach(function($fp_img) {
            var $imgs = [518966, 518967, 518968, 518969],
                $rand = Math.floor($imgs.length * Math.random()),
                $xmhr = new XMLHttpRequest();

            var response = function($e) {
                var $this = this,
                    $url_creator = window.URL || window.webkitURL,
                    $image_url = $url_creator.createObjectURL($this.response);
                $fp_img.src = $image_url;
            }

            $xmhr.open('get', '../imgs/' + $imgs[$rand] + '.jpg', true);
            $xmhr.responseType = 'blob';
            $xmhr.onload = response;
            $xmhr.send();
        });
    }
});

我使用ob_start使用以下正则表达式模式来压缩文件开头的代码:

ob_start(function($code) {
    // return $code; # If the compression causing errors, do not compress
    return preg_replace('(\s{2,})', ' ', preg_replace('/(?:(?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:(?<!\:|\\\|\')\/\/.*))/', '', $code));
});

当它没有被压缩时,一切运作良好。但是当我使用该模式时,我在控制台中收到以下错误:

  

SyntaxError:意外令牌:标识符

&#34;缩小&#34;输出:

var $url = window.location.href; $url = $url.toLowerCase().replace(/^(http(s)?\:\/\/)/g, ''), $url = $url.split('/'); var $current_page = $url[$url.length - 1].replace(/(\?.*)?(\#.*)?/g, ''); document.addEventListener('DOMContentLoaded', function() { if ($current_page === 'index.html') { if (window.location.hash) { var $current_hash = window.location.hash.substring(1); } else { window.location.hash = ''; } var $fp_imgs = document.querySelectorAll('img.-homepage-poster'); $fp_imgs.forEach(function($fp_img) { var $imgs = [518966, 518967, 518968, 518969], $rand = Math.floor($imgs.length * Math.random()), $xmhr = new XMLHttpRequest(); var response = function($e) { var $this = this, $url_creator = window.URL || window.webkitURL, $image_url = $url_creator.createObjectURL($this.response); $fp_img.src = $image_url; } $xmhr.open('get', '../imgs/' + $imgs[$rand] + '.jpg', true); $xmhr.responseType = 'blob'; $xmhr.onload = response; $xmhr.send(); }); } });

我该如何解决这个问题?

非常感谢

1 个答案:

答案 0 :(得分:0)

问题是您的JavaScript代码的语句终止 s 不正确。这是JavaScript缩小和意大利面内的 PITA 的常见问题。

只是为了它的乐趣,这里是你的代码的正则表达式示例: https://regex101.com/r/Iwvo4I/1/

查看上面JS中的第一个var语句。如果您没有打算终止var,那么您似乎已经终止:

:此

var $url = window.location.href; <-----------LOOK HERE

    $url = $url.toLowerCase().replace(/^(http(s)?\:\/\/)/g, ''),
    $url = $url.split('/');

var $url = window.location.href, <-----------LOOK HERE

    $url = $url.toLowerCase().replace(/^(http(s)?\:\/\/)/g, ''),
    $url = $url.split('/');

下一步

查看response函数表达式的代码:

    var response = function($e) {
       //// ... 
    } // <--- PUT SEMICOLON HERE

由于这是一个JavaScript表达式,因此该语句应以分号结束。它不是,但 会导致代码在缩小时中断。

为了完全清楚,请使用逗号替换第一行末尾的分号,以纠正编码错误。 在响应函数声明后放置分号

应该这样做。