【问题标题】:jQuery conflict in WordPress Plugin - jQuery vs. WordPress CoreWordPress 插件中的 jQuery 冲突 - jQuery 与 WordPress 核心
【发布时间】:2011-01-10 22:00:07
【问题描述】:

我有一个使用 jQuery 1.4 的自定义开发的 WordPress 插件,由于某种原因,它与 WordPress js 代码的核心冲突......不确定,但我认为它也是 jQuery,不是吗?

无论如何,我认为这是我使用的这个名为“anytime.js”的日期选择器脚本,但是在调试后发现,在删除插件中的“anytime.js”链接后冲突仍然存在,但最终解决了当我摆脱 jquery.1.4.min.js 的链接时...

那么,关于如何避免冲突的任何想法? WordPress 是基于 jQuery 的,这就是原因还是其他原因?

这是插件中的相关代码:

function datepicker_header(){
    $theme_dir = get_bloginfo('wpurl').'/wp-content/plugins/postevents/js/';?>

    <link rel="stylesheet" type="text/css" href="<?=$theme_dir?>anytime.css" />
    <link rel="stylesheet" type="text/css" href="<?=$theme_dir?>ui.css" />

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type='text/javascript'></script>
    <script src="<?=$theme_dir?>anytime.js" type='text/javascript'></script>

    <script type="text/javascript">
        $(function(){
            AnyTime.picker( "startdate", { format: "%m-%d-%Y", firstDOW: 1, baseYear: '<?=date('Y')?>', earliest: '<?=date('m-d-Y')?>' } );
            AnyTime.picker( "enddate", { format: "%m-%d-%Y", firstDOW: 1, baseYear: '<?=date('Y')?>', earliest: '<?=date('m-d-Y')?>'  } );
        });
    </script>

编辑

我想我可能引起了一些混乱。我应该解释一下功能。有一个名为“Post Events”的插件,它有一个基于 jQuery 的日期选择器。 datepicker 依赖于 jQuery 来运行。具体和不寻常的问题是,当插件处于活动状态时,它会导致新的 WordPress 3.0 可拖动菜单从 WP 管理面板失败。所有其他功能都在工作,但是,禁用日期选择器不会导致菜单变得可拖动。相反,仅删除上述代码中指向“/libs/jquery/1.4.2...”的链接会导致菜单再次变为可拖动。

编辑#2

虽然我只能指出一个正确答案,但@Matthew 和 @polarblau 在下面的更正都是解决问题所必需的!

【问题讨论】:

    标签: javascript jquery wordpress


    【解决方案1】:

    此代码将检查 jQuery 是否已加载...如果尚未加载,则加载它(此代码从 Google 代码加载 - 如果您愿意,可以将 URL 更新为本地文件)。

    if(typeof(jQuery)=='undefined'){
        var loadjQuery = document.createElement("script");
        loadjQuery.setAttribute("type","text/javascript");
        loadjQuery.setAttribute("src","http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js");
        document.getElementsByTagName("head")[0].appendChild(loadjQuery);
    }
    

    但是,我必须注意,这只有在另一个 潜在 jQuery 实例之后加载才有效(不能保证以后不会加载 jQuery 实例,除非它执行同样的检查)。

    这在 jQuery 有时被加载并且你需要它总是被加载的情况下很有用,无论如何。在这种情况下,将此代码放置在原始加载之后,但在您使用任何 jQuery 功能之前。

    还有一件事:我有时 WordPress 对 jQuery 代码中的 $ 很挑剔。您可以通过在需要 $ 的任何地方输入“jQuery”(或执行查找/替换)而不是 $ 来解决此问题。

    【讨论】:

    • 就是这样。谢谢你救了我一百万!
    【解决方案2】:

    请参阅此链接,了解如何将脚本正确添加到 Wordpress: http://weblogtoolscollection.com/archives/2010/05/06/adding-scripts-properly-to-wordpress-part-1-wp_enqueue_script/

    是的,Wordpress 使用 JQuery 来实现它的一些功能......

    【讨论】:

      【解决方案3】:

      试试:

      jQuery(function(){
          AnyTime.picker( "startdate", { format: "%m-%d-%Y", firstDOW: 1, baseYear: '<?=date('Y')?>', earliest: '<?=date('m-d-Y')?>' } );
          AnyTime.picker( "enddate", { format: "%m-%d-%Y", firstDOW: 1, baseYear: '<?=date('Y')?>', earliest: '<?=date('m-d-Y')?>'  } );
      });
      

      一般来说,将使用 jQuery 的脚本和插件包装到它们自己的作用域中是一种很好的做法:

      (function($){
          //... your plugin, etc. here
      })(jQuery);
      

      【讨论】:

      • 您能详细解释一下您的脚本是如何失败的吗?怎么判断是冲突?以及原型和 jQuery 之间的冲突?另请参阅我的编辑...
      • 哈!我慢慢打字。那么……在包含有问题的行之后,您在最终源代码中只包含一个版本的 jQuery?
      • 见上面@Matthew 的回复。他演示了如何仅在尚未加载解决冲突的情况下加载 jQuery。我知道这就是我想要的,但不知道如何实现它!
      • 作为记录,您的观察是 100% 正确的,因为我发现我实际上需要您的修订以及 @Matthew's 以使代码正常工作。
      猜你喜欢
      • 2011-06-18
      • 2012-11-14
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多