【问题标题】:Mediawiki 1.27.4 jquery not loadedMediawiki 1.27.4 jquery 未加载
【发布时间】:2018-05-25 00:41:06
【问题描述】:

我是 Mediawiki 和 Resourceloader 的新手。我最近下载了 MediaWiki 1.27.4 LTS 版本,安装后,我发现即使他们说默认加载 jquery,也找不到它(我正在查看 chrome 开发人员工具中的源选项卡)。 在我的一个使用 BeforePageDisplay 挂钩的扩展中,我想使用 jquery.cookie,所以我声明了以下资源加载器

$wgResourceModules['ext.myFirstExtension'] = array(           
        'dependencies' => array( 'jquery.cookie'),            
        'localBasePath' => dirname( __FILE__ ),            
        'remoteExtPath' => 'myFirstExtension',
        'position' => 'top'
);

在我的扩展文件中,我正在自动加载其中一个类,我正在其中执行 在脚本中,我只是执行以下代码,它会抛出 $ undefined 的典型错误,因为未加载 jquery。

$(document).ready(function(){
alert("here");
});

是的,我使用的是 Vector 皮肤,没有进行任何修改。此外,我没有使用除 VisualEditor 之外的任何其他扩展程序,它运行良好。

我还尝试了 mw.loader.load('jquery') ,它还抱怨 mw 无法识别。

我还添加了 $wgResourceLoaderDebug = true;在我的本地设置中,这样资源加载器就不会捆绑我的脚本和 css

我怀疑 Mediawiki 在内部无法在没有 jquery 的情况下运行。但现在我怎样才能让 jquery 正确加载到我的扩展程序中,以便我可以使用 jquery.cookie。

谢谢

【问题讨论】:

    标签: jquery mediawiki


    【解决方案1】:

    问题可能是您的模块注册的'position' => 'top' 选项,这可能会导致它比jQuery 更早加载。

    通常没有理由使用'position' => 'top',除非资源是纯 CSS 模块。

    【讨论】:

    • Ciencia,我尝试了您的建议,但没有奏效。还有其他建议吗?
    【解决方案2】:

    只有在 Common.js 或用户自定义的 vector.js 页面中有要执行的 JQuery 代码时才会加载 JQuery。

    在导入任何外部库之前,您必须确保 JQuery 可以正常工作,请遵循以下惰性步骤:

    1. 将以下内容添加到您的 LocalSettings.php 文件中。

    $wgAllowUserJs = true;

    1. 转到您的帐户自定义 vector.js 页面(即 user:/vector.js)并键入任何 JQuery 代码,例如

    $(document).ready(function(){ alert("here"); }); 保存页面后,必须用“这里”字样提醒浏览器。

    如果不是,那么您应该检查您的浏览器中是否启用了 Javascript,如果您通过 URL 导入 JQuery cookie,则检查该 URL 是否通过 https 协议运行,因为 MediaWiki 不会接受任何不应用 https 协议的外部资源。

    【讨论】:

    • ASammour,我查看了 vector.js,它的第一行本身以 jquery 匿名函数 jQuery( function ( $ ) {.....}) 开头,所以看起来 jquery 是默认加载的。当我输入 $(document).ready(function(){...}) 时,它执行得很好。但是我的扩展中的同一段代码不起作用。可能是我在扩展的“执行”方法中使用内联 javascript?有什么建议吗?
    【解决方案3】:

    在努力使 jquery 在扩展类中工作之后,我决定创建一个试用扩展来证明我认为可能是这种情况的理论:

    这是我的扩展文件:

    <?php
    # Alert the user that this is not a valid entry point to MediaWiki if they try to access the special pages file directly.
    if (!defined('MEDIAWIKI')) {
        echo <<<EOT
    To install my extension, put the following line in LocalSettings.php:
    require_once( "$IP/extensions/MyExtension/MyExtension.php" );
    EOT;
        exit( 1 );
    }
    
    $wgExtensionCredits['specialpage'][] = array(
        'path' => __FILE__,
        'name' => 'TryExtension',
        'author' => 'Andy',
        'url' => 'https://home.com',
        'descriptionmsg' => 'Trial Extension',
        'version' => '1.0.0',
    );
    
    $dir = dirname(__FILE__) . '/';
    
    $wgAutoloadClasses['TryExtension'] = $dir . 'tryExtension.class.php'; # Location of the SpecialMyExtension class (Tell MediaWiki to load this file)
    
    $wgHooks['BeforePageDisplay'][] = 'TryExtension::execute';
    
    $wgResourceModules['ext.TryExtension'] = array(    
        'scripts' => array('scripts/tryjQuery.js'),    
        'dependencies' => array( 'jquery.cookie'),    
        'localBasePath' => dirname( __FILE__ ),    
        'remoteExtPath' => 'TryExtension',
        'position' => 'top'
    );
    

    这是我的扩展名中包含的 javascript 文件:

     $(document).ready(function () {
            alert("here");
        });
    

    这里是扩展类:

    <?php
    class TryExtension extends SpecialPage
    {
     public function execute(){
         global $wgOut;
         $wgOut->addModules( 'ext.TryExtension' );
        ?>
         <script>
            $(document).ready(function () {
            alert("from class - here");
        }); 
        </script>
         <?php
     }
    }
    

    你猜怎么着? 来自 js 文件的警报效果很好......但不是来自扩展名。它抛出 referenceError $ is undefined.

    我相信,无论好坏,我都必须将我所有的内联 js 代码移动到专用的 javascript 文件中。 在 1.24.x 版本的 MediaWiki 中情况并非如此。现在我相信,我的很多扩展都需要大量工作。

    【讨论】:

      猜你喜欢
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      相关资源
      最近更新 更多