bugfix> jquery > 投稿

私はMediawikiとResourceloaderを初めて使います。最近、MediaWiki 1.27.4 LTSバージョンをダウンロードしました。インストールすると、デフォルトでjqueryがロードされていても、どこにも見つからないことがわかりました(Chrome開発者ツールの[ソース]タブを調べています)。 BeforePageDisplayフックを使用する拡張機能の1つで、jquery.cookieを使用したかったため、次のリソースローダーを宣言しました

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

そして、私の拡張ファイルでは、クラスの1つをオートロードし、その中で、 スクリプトでは、次のコードを実行するだけで、jqueryがロードされていないため、$undefinedという典型的なエラーがスローされます。

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

はい、私はベクタースキンを変更せずに使用しています。さらに、VisualEditor以外の拡張機能を使用していないため、見事に機能します。

私もmw.loader.load( 'jquery')を試しましたが、mwが認識されないと文句を言います。

$wgResourceLoaderDebug = true;も追加しました。リソースローダーがスクリプトとcssをバンドルしないように、ローカル設定で

Mediawikiはjqueryなしでは内部的に機能できないと思いますが、jquery.cookieを使用できるようにjqueryを拡張機能に正しくロードするにはどうすればよいでしょうか。

ありがとう

回答 3 件
  • 問題は 'position' => 'top' かもしれません  モジュール登録のオプション。これにより、おそらくjQueryより前でもロードされます。

    通常、 'position' => 'top' を使用する理由はありません。 、リソースがCSSのみのモジュールでない限り。

  • JQueryは、Common.jsまたはユーザーのカスタムvector.jsページで実行するJQueryコードがある場合にのみロードされます。

    外部ライブラリをインポートする前に、JQueryが機能することを確認する必要があります。次の遅延ステップに従います。

    LocalSettings.phpファイルに以下を追加します。

    $wgAllowUserJs = true;

    アカウントのカスタムvector.jsページ(つまり、user:/vector.js)に移動し、次のようなJQueryコードを入力します

    $(document).ready(function(){ alert("here"); }); ページを保存した後、「here」という言葉でブラウザに警告する必要があります。

    そうでない場合は、ブラウザでJavascriptが有効になっているかどうかを確認する必要があります。また、URLからJQuery Cookieをインポートする場合は、httpsプロトコルを介してURLが実行されていることを確認してください。MediaWikiはhttpsプロトコルを適用しない外部ソースを受け入れないためです

  • 拡張クラスで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がスローされます$は未定義です。

    良くも悪くも、すべてのインラインjsコードを専用のJavaScriptファイルに移動する必要があると思います。 MediaWikiの1.24.xバージョンではそうではありませんでした。今、私の拡張機能の多くは多くの作業を必要としています。

あなたの答え