7


1

PHPを使用してjQueryがロードされているかどうかを確認する方法はありますか?

JoomlaにはjQuery JSをロードする2つの異なるプラグインがありますが、それが複数回含まれていると正しく動作しません。

プロセスをもう少し説明すると、JoomlaはHTMLソースがレンダリングされる前にそれを傍受する機能を提供しています。基本的にはソースコード自体に取り組んでいます。

これは関数を使っている:

onPrepareContent(

$ rowは解析可能なページのHTMLコンテンツです。

私はおそらくpreg_matchはうまくいくかもしれないと思っていましたが、あまり経験がありません。

6 Answer


14


いっそのこと、あなたはそれをJavaScriptで検証して、もし見つからなければそれを頭に加えることができます。

if(type of jQuery == '未定義'){var head = document.getElementsByTagName( "head")[0]; script = document.createElement( 'script'); script.id = 'jQuery'; script.type = 'text / javascript'; script.src = 'js / jquery.js'; head.appendChild(スクリプト); }


3


Joomla1.0を使っていると思いますか?

JoomlaはPHPの出力バッファを使ってコンテンツをバッファします。 すなわち、ob_start()です。

内容はob_get_contents()を使って取得できます。

したがって、JQueryをチェックする正規表現を使うことができます。 何かのようなもの:

$ jquery_loaded = preg_match( "/

十分に良いはずです。 (私はそれをテストしていません)。

PHPの出力バッファはネストできるため、ob_get_contents()を使用しても状況によっては機能しない場合があります。 バッファ内でいくつでもバッファを起動できます。

Joomla1.5では、APIを介してバッファを取得できます。これにより、Joomlaの出力を常に取得できます。

$ Document =

Joomla1.0か1.5かにかかわらず、Joomlaは出力をレンダリングする前にバッファに追加できることに注意する必要があります(ob_flush()または同等のものを呼び出します)。 したがって、JQueryのチェックでは、チェック後にJQueryをロードできることを考慮する必要があります。

JoomlaバッファはHTMLだけでなくCSS、JavaScript、XML、JSONなどでも作成できます そのため、JQueryテストを実行する前にHTMLを確認することをお勧めします。 管理パネルをテストすることもできます。

$ mainframe =

//($ mainframe-> isAdmin()|| $ doctype!= 'html')の場合、//バックエンドを無効にする。 }

'' '' '

参考までに、ここにあなたが欲しいものを部分的にするシステムプラグインの例があります。 これはMooTools1.2用の互換性プラグインです。

getType();

//($ mainframe-> isAdmin())の場合はバックエンドを無効にします。 }

//($ doctype == 'html'){$ document-> addScript( 'components / com_ajaxchat / js / mootools-1.2-core.js'); // mootools 1.2を追加します。 $ document-> addScript( 'components / com_ajaxchat / js / mootools-1.2-more.js'); $ document-> addScript( 'components / com_ajaxchat / js / mootools-1.2-core-compat.js'); $ document-> addScript( 'components / com_ajaxchat / js / mootools-1.2-more-compat.js'); }

}

/ **
     *  テンプレート出力がバッファに入った後* / function onAfterRender(){

$ mainframe =

//($ mainframe-> isAdmin())の場合はバックエンドを無効にします。 }

//($ doctype!== 'html'){return;}の場合のみ、HTML出力用にレンダリングします。 }

//出力バッファを取得する$ body = JResponse :: getBody();

//必要でなければ、mootoolsを削除します。 、$ body); } else {$ body = preg_replace( "/ [\ s \ t \ r \ n] * / i"、 "\ n"、$ body); }

JResponse :: setBody($ body); }

}

?


1


最初にjavascriptでチェックをするべきです。 例えば:

window.onload = function(){if(typeof(window.jQuery)== "未定義")alert( 'jQuery no load');それ以外の場合は警告します( 'jQuery Ok')。 }

それから、あなたはajaxによってサーバーにメッセージを送ることができます。


1


それは可能ではありません。 PHPはサーバーサイドですが、Javascript(JQueryが書かれている言語)はクライアントサイドです。 PHPコードは、Javascriptを含むテキストがユーザーに送信され、ロードされる前に実行される必要があります。

最善の策は、jQueryを2回以上含めないことです。 これを行うには、すべてのインクルードを次のようなものに置き換えます。

if($){} // jQuery関数が定義されているかどうかをテストしますelse else document.write( "<script type = 'text / javascript' src = 'jquery.js'>");

確かにこれはちょっとしたハックであり、もっと良い方法があるかもしれません。

編集:少し考えた後:これはサーバからjQueryライブラリをロードすることの非同期性のために動作しないかもしれません。 これを行う最善の方法はスクリプトインクルードに添付された `onload`イベントハンドラを使うことだろうが、DOMはそれをサポートしていません。

編集2:さて、今、私はあなたの最善の策は単にページごとに1つのスクリプトタグを使用してそれをページに一度含めることであろうと思います。 あなたはこれをある種のグローバルヘッダに追加し、それを他のどこでもそれを削除することによってそれを行うことができます。 それで、何に関係なく、それを再び含めないでください。 これはあなたがそれを必要としないいくつかのページにそれをロードすることを意味するかもしれません、しかし現代のブラウザ上のキャッシュのためにそれは問題であるべきではありません。


1


`JDocument`オブジェクトを使ってヘッダを取得し、jQueryを検索してから必要に応じてリセットすることをお勧めします。 `getHeadData()`メソッドと `setHeadData()`メソッドはそこからあなたを助けるはずです。 このコードで現在の `JDocument`オブジェクトを取得することができます:

$ document =
https://stackoverflow.com/questions/1329981/joomla-jquery-modules-conflicting/1333301#1333301[Joomla、jQueryモジュールが競合しています]

その1つでは、実際には余分なjQueryの負荷を取り除いています。


0


Joomlaがどのスクリプトを含んでいるかをあなたに伝える方法を提供しない限り? (Zend Frameworkにはそのようなリストがあります)