【问题标题】:How can select2 3.5 and 4.0 conflicts be resolvedselect2 3.5和4.0冲突如何解决
【发布时间】:2016-04-22 04:45:47
【问题描述】:

虽然不是那个具体的问题,但这里描述的问题 - https://wordpress.org/support/topic/select2-conflicting-with-acf-v5 基本上也是我的问题。

一个 wordpress 网站有两个 wordpress 插件,一个使用 select2 版本 3.5 来处理所有选择元素,另一个(包含在我编写的插件中)使用 4.0 来处理一些特定的元素。这会导致

的错误

错误:select2.min.js?ver=3.4.5:21 未捕获的错误:Select2 附加到元素时不允许使用“多个”选项。

这类问题有什么可能的解决方案吗?我是否应该尝试检测已加载 3.5 并尝试避免设置冲突?也许尝试先加载“我的”select2并希望由于我更具体,不会与使用3.5的代码发生冲突? (我对 jQuery 内部知识缺乏了解,当不同的插件尝试使用相同的名称时会发生什么?)

【问题讨论】:

    标签: javascript jquery jquery-select2 jquery-select2-4


    【解决方案1】:

    我的插件Popup Maker 面临完全相同的问题。我发现这个select2 multiple versions on same page/site 可能有用,我预见到的唯一问题是我们不能总是控制插件使用 wp_enqueue_script 加载其 JS 的顺序。

    好吧,我所做的就是让我的脚本需要 select2 (DUH),然后在我的脚本外壳内我做了类似的事情。

    $.fn.pumSelect2 = $.fn.select2;

    然后我使用.pumSelect2(),而不是调用.select2()

    这非常适合我的情况,即我使用 v4,其他人使用 v3.5,有些甚至将其引导到他们自己的 admin.js 文件中,因此即使 select2 已经加载,它也会加载。

    总而言之,这是一个 hack,但因为我们通过使用 wp_enqueue_script 加载以正确的方式进行操作。

    如果 select2 已入队,我也会将其出队。

    // Deregister older versions, loaded by Types, Advanced Custom Fields etc.
    if ( wp_script_is( 'select2', 'registered' ) ) {
        wp_deregister_script( 'select2' );
    }
    wp_register_script( 'select2', $js_dir . 'select2.full' . $suffix, array( 'jquery' ), '4.0.1' );
    

    `

    目前的最终方法

    经过进一步测试,并且由于许多其他插件使用旧版本的自定义可能会破坏这就是我想出的。

    在我的 select2.full.js 文件中

    对于加载jQuery并调用工厂的开头部分

    (function (factory) {
        var existingVersion = jQuery.fn.select2 || null;
    
        if (existingVersion) {
            delete jQuery.fn.select2;
        }
    
        if (typeof define === 'function' && define.amd !== undefined && define.amd) {
            // AMD. Register as an anonymous module.
            define(['jquery'], factory);
        } else if (typeof exports === 'object') {
            // Node/CommonJS
            factory(require('jquery'));
        } else {
            // Browser globals
            factory(jQuery);
        }
    
        jQuery.fn.pumselect2 = jQuery.fn.select2;
    
        if (existingVersion) {
            delete jQuery.fn.select2;
            jQuery.fn.select2 = existingVersion;
        }
    }(function (jQuery) {
    

    在这种情况下,我基本上将它引导到一个新名称 pumselect2,如果之前有加载版本,我会恢复它,否则我会擦除石板,以便在加载另一个版本时不会出现冲突。

    我还将我的 wp_enqueue_script 句柄修改为 pumselect2,这样即使其他人加载了 select2,它也会被加载。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      对于使用 select2 的 WordPress 插件作者,我的回答是:Jquery Select2 plugin version check 可以提供一些关于版本检查的指导。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-09
        • 2016-02-22
        • 2013-11-09
        • 1970-01-01
        • 2023-04-04
        • 2017-06-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多