在其他脚本中,如何确保首先执行我的JS脚本?

时间:2018-02-10 作者:Jonathan Guerin

我有一个脚本,它可以减少我的菜单,如果有太多的菜单项,可以添加一个“+”下拉列表,以美化长菜单,例如:

Menu With the Script

在不运行脚本的情况下:

Menu Without the Script

我打电话进来functions.php 使用:

function _s_scripts() {
    wp_enqueue_script( \'main\', get_template_directory_uri() . \'/js/main_res.js\', array( \'jquery\' ), \'\', false );
}
add_action( \'wp_enqueue_scripts\', \'_s_scripts\' );
不幸的是,这会导致执行延迟和锯齿状。是否有任何方法可以将此脚本挂接到“一旦生成X部件(菜单)”,执行此操作?

对于用户来说,效果非常明显:

https://imgur.com/aoFcYKe

这是脚本,仅供测试之用,main_res.js:

function sliceMenu(desired_len) {
    var menu_len = document.querySelectorAll(\'#primary-menu > li\').length;

    if (menu_len > desired_len) {

        var append_menu_el = document.createElement(\'div\');
        append_menu_el.innerHTML = (\'<div id="js-cover-menu"><img class="plus" src="$PATH/svg/plus_menu.svg" alt="more-menu"></div>\').replace(\'$PATH\', ABSPATH);
        document.getElementById(\'primary-menu\').parentNode.appendChild(append_menu_el);

        let diff = menu_len - desired_len;
        let sliced_lis = [...(document.querySelectorAll(\'#primary-menu > li\'))].slice(-diff);


        var js_menu_el = document.createElement(\'ul\');
        js_menu_el.setAttribute(\'id\', \'js-cover-menu-dropdown\');
        document.getElementById(\'js-cover-menu\').appendChild(js_menu_el);

        js_cover_menu_el = document.getElementById(\'js-cover-menu-dropdown\');

        for(var i = 0, length = sliced_lis.length; i < length; i++) {
            js_cover_menu_el.appendChild(sliced_lis[i]);
        }
        document.querySelectorAll(\'#js-cover-menu-dropdown > li > ul\').forEach(node => node.remove());
    } else {
        return;
    }
}

2 个回复
SO网友:Johansson

首先,如果您没有使用jQuery,那么不要传递jQuery 作为对wp_enqueue_script() 作用

现在,关于你的问题。这实际上与WordPress无关,但无论如何。您没有提到如何调用此函数,因为这才是最重要的。如果您最近输出了代码,例如在页脚中,则在加载该部分之前,它不会运行。我的建议是,在菜单输出后直接使用子菜单并添加代码,然后调用函数。这样,脚本将在创建菜单后立即运行,因为不需要jQuery,所以使用它不会有问题。

SO网友:Joel M

看起来您的脚本部分使用了vanilla javascript。如果您可以摆脱它对jQuery的依赖,那么您可以将它直接粘贴到页脚中的脚本标记中。

但是,在$(文档)上运行的脚本。如果更改页面的html,ready()将始终具有此效果。

您的两个解决方案是:使用php正确编写脚本,通过使用CSS类设置隐藏项,使其不会在页面加载时显示,并使用javascript逻辑将单击处理程序添加到“+”。

另一个稍显粗糙的选项是使用CSS隐藏div,并在javascript的末尾应用一个显示它的CSS类。现在页面将加载为空,一秒钟后,菜单将变为可见。这比单向加载菜单,然后在页面加载后完全更改要好一些。

结束

相关推荐