4

私の JavaScript には、私の Web サイトのページの 1 つのコードがあります。

$('#nmdt1').datetimepicker({
        dateFormat: $.datepicker.ATOM,
        minDate: nmsdt,
                  ...
                  ...

これは、id="nmdt1" がロードされたページが読み込まれると正常に実行されます。そして、関連する datetimepicker js ライブラリ (モジュール) を、そのページを読み込んだときにのみ読み込みます。ここまでは順調ですね。

しかし、Web サイトに他のページをロードすると、このエラーが発生します。dateformat が定義されている行番号からです。

編集: firebug ログの正しいエラーは次のとおりです。

TypeError: $.datepicker is undefined
http://myswbsite/jscript/myjsscript.js
Line 569

569行目は次のとおりです。

dateFormat: $.datepicker.ATOM,

はい、このエラーは、関連する js コード (jquery-ui-timepicker-addon.js) をロードしていないページでのみ発生します。この js をすべてのページにロードしない理由は、1 つのページだけで必要だからです。

詳細:

lib ロード後の HTML ヘッダー (seq)

<head>
    <script src="/jscript/jquery-1.8.0.min.js" type="text/javascript"></script>
    <script src="/jscript/myjsscript.js" type="text/javascript"></script>
...
...
    <script type="text/javascript">
    jQuery(document).ready(function(){
        var mid = "[% mid %]";
        alert('mid='+mid);
        $(".bvmainmenu #"+mid).css({"background":"url(/images/current-bg.gif) top left repeat-x", "color":"#ffffff"});
    });
    </script>
</head>

上記の最後の JavaScript コード (ヘッダーの下部) は、jquery-ui-timepicker-addon.js lib がロードされていないたびに実行されません (そして、firebug でエラーが表示されます - エラーが発生しても問題ありませんが、なぜこれが最後のコードは実行されていません。よくわかりません)。「アドオン」ライブラリをロードしなかったという理由だけで、このルーチンが実行されない理由を理解できません

すべてを正しく実行するページは、BODY に次の js スクリプトをロードします

<script src="/jscript/jquery-ui-1.8.21.custom.min.js" type="text/javascript"></script>
<script src="/jscript/jquery-ui-timepicker-addon.js" type="text/javascript"></script>

このページでは、ヘッダーに表示される最後の JavaScript コードも読み込まれ、アラートが表示されます。

私はこれを理解するのに苦労しています。

4

3 に答える 3

10

アプリケーションにjQuery UIを含めましたか。

<script language="javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script language="javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.22/jquery-ui.min.js"></script>
于 2012-08-12T01:48:52.057 に答える
2

あなたはこのコードを言っているようです:

$('#nmdt1').datetimepicker({
    dateFormat: $.datepicker.ATOM,
    minDate: nmsdt,
    ...

...すべてのページにロードされる共通myjsscript.jsスクリプト内にあります。その場合、それはすべてのページで実行されることを意味するため、追加のプラグイン スクリプトも含まれていないページでエラーが発生します。

上で引用したコードは、「その ID を持つ要素が存在する場合、メソッドを呼び出す」という意味ではなくdatetimepicker()、「要素が含まれているかどうかに関係なく jQuery オブジェクトを作成し、datetimepicker()メソッドを呼び出して、オブジェクトをに設定されたプロパティ$.datepicker.ATOM。」つまり、ページに nmdtd1 要素がなくても、 を呼び出しdatetimepickerて参照し$.datepicker.ATOMます。

これを修正するには、少なくとも 3 つの方法があります。

  1. そのコードを共通のものから移動し、myjsscript.jsそれを必要とする 1 つのページに配置します。

  2. サイトのすべてのページにプラグイン JS ファイルを含めてください。これらはブラウザによってキャッシュされるため、ユーザーがいくつかのページにアクセスすると仮定しても、実際にはパフォーマンス ヒットにはなりません。

  3. そのコードを条件内に移動して、.datetimerpicker()必要でない限りその部分が実行されないようにします。

オプション 3 の場合:

var $nmdt1 = $('#nmdt1');
if ($nmdt1.length > 0) {
    $nmdt1.datetimepicker({
       dateFormat: $.datepicker.ATOM,
       minDate: nmsdt,
       ...
    });
}
于 2012-08-12T02:22:39.040 に答える