2009-08-26 24 views
7

PHPを使用してjQueryが読み込まれているかどうかを確認する方法はありますか?ヘッダ(Joomla)にjQueryが含まれているか確認してください

Joomlaでは、jQuery JSを読み込む2つのプラグインがありますが、複数回含まれていると正常に動作しません。

このプロセスについてもう少し説明してください: JoomlaはHTMLソースがレンダリングされる前にインターセプトする機能を備えており、ソースコード自体を基本的に処理しています。これは、関数使用している

onPrepareContent(&$row, &$params, $limitstart) 

$行を解析できるページのHTMLコンテンツです。

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

+3

この質問は、「JoomlaでヘッダーにjQueryが含まれているかどうかを確認する」と言い換えることができます。 – deceze

答えて

14

JavaScriptを使用して確認してから、見つからない場合は頭に追加できます。

if (typeof jQuery == 'undefined') { 
    var head = document.getElementsByTagName("head")[0]; 
    script = document.createElement('script'); 
    script.id = 'jQuery'; 
    script.type = 'text/javascript'; 
    script.src = 'js/jquery.js'; 
    head.appendChild(script); 
} 
+3

しかし、他の記述されていないモジュールがjQueryを読み込んでも、これで問題は解決しません。 – Bakaburg

+0

これは質問に答えません。 – Cheeso

1

最初にチェックをjavascriptで行う必要があります。

window.onload = function() 
{ 
    if (typeof(window.jQuery)=="undefined") 
     alert('jQuery no load'); 
    else 
     alert('jQuery Ok'); 
} 

次に、サーバーにajaxによってメッセージを送信できます。

0

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

1

これはできません。 PHPはサーバー側ですが、Javascript(JQuery言語は書かれています)はクライアント側です。 Javascriptを含むテキストがユーザに送られて読み込まれる前にPHPコードが本来実行されなければなりません。

jQueryを複数回使用しないことをお勧めします。

<script type='text/javascript'> 
    if($) { } // test to see if the jQuery function is defined 
    else document.write("<script type='text/javascript' src='jquery.js'></script>"); 
</script> 

確かに、これはハックのビットです、そしてより良い方法があるかもしれません:あなたは、あなたのようなものを含んでいるのすべてを置き換えることにより、これを行うことができます。

EDIT:ちょっと考えてみてください。jQueryライブラリをサーバーからロードする非同期性のために、これはうまくいかないかもしれません。これを行う最善の方法は、onloadイベントハンドラをスクリプトincludeに添付して実行するように思われますが、DOMはそれをサポートしていません。

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

3

私はあなたがJoomla1.0を使用していると仮定していますか?

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

次のようにしてコンテンツを取得できます。ob_get_contents();

したがって、JQueryをチェックする正規表現を使用できます。次のようなものがあります。

$jquery_loaded = preg_match("/<script.*?src=[\"']jquery[^\"']\"/i", ob_get_contents()); 

は十分です。 (私はそれをテストしていない)。

PHP出力バッファをネストすることができるため、ob_get_contents()を使用すると状況に応じて動作しないことがあります。バッファー内でいくつでもバッファーを開始することができます。

Joomla1.5の場合は、常にJoomlaの出力を取得するAPIを介してバッファを取得できます。

$Document =& JFactory::getDocument(); 
$buffer = $Document->getBuffer(); 

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

Joomlaのバッファは、HTMLだけでなく、CSS、JavaScript、XML、JSONなどでも作成できることに注意してください.JQueryのテストを行う前に、HTMLをチェックしたいと思うかもしれません。また、管理パネルをテストすることもできます。ここでは参考のため


$mainframe =& JFactory::getApplication(); 
$doctype = $document->getType(); 

     // deactivate for backend 
     if ($mainframe->isAdmin() || $doctype != 'html') { 
      return false; 
     } 

の一部は、あなたが欲しいものを行う例のシステムプラグインです。これはMooTools1.2の互換性プラグインです。

<?php 
/** 
* MooTools1.2 w/ 1.1 compat for AjaxChat 
* @copyright www.fijiwebdesign.com 
* @author [email protected] 
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL 
*/ 

// included only 
defined('_JEXEC') or die('Direct Access to this location is not allowed!'); 

jimport('joomla.plugin.plugin'); 

/** 
* Joomla PHP Speedy Integration 
* 
* @author [email protected] 
*/ 
class plgSystemAjaxchat extends JPlugin 
{ 
    /** 
    * Constructor 
    * 
    * For php4 compatability we must not use the __constructor as a constructor for plugins 
    * because func_get_args (void) returns a copy of all passed arguments NOT references. 
    * This causes problems with cross-referencing necessary for the observer design pattern. 
    * 
    * @access protected 
    * @param object $subject The object to observe 
    * @param array $config An array that holds the plugin configuration 
    * @since 1.0 
    */ 
    function plgSystemAjaxchat(& $subject, $config) 
    { 
     parent::__construct($subject, $config); 

     $mainframe =& JFactory::getApplication(); 
     $document =& JFactory::getDocument(); 
     $doctype = $document->getType(); 

     // deactivate for backend 
     if ($mainframe->isAdmin()) { 
      return false; 
     } 

     // add mootools 1.2 
     if ($doctype == 'html') { 
      $document->addScript('components/com_ajaxchat/js/mootools-1.2-core.js'); 
      $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'); 
     } 

    } 

    /** 
    * After Templte output is in buffer 
    */ 
    function onAfterRender() { 

     $mainframe =& JFactory::getApplication(); 
     $document =& JFactory::getDocument(); 
     $doctype = $document->getType(); 

     // deactivate for backend 
     if ($mainframe->isAdmin()) { 
      return false; 
     } 

     // Only render for HTML output 
     if ($doctype !== 'html') { 
      return; 
     } 

     // get the output buffer 
     $body = JResponse::getBody(); 

     // remove mootools if not needed 
     if (stristr($body, 'mootools.js') || stristr($body, 'mootools-uncompressed.js')) { 
      $body = preg_replace("/<script.*?mootools(-uncompressed)?\.js.*?<\/script>/i", '', $body); 
     } else { 
      $body = preg_replace("/<script.*?mootools-1\.2\-.*?\.js.*?<\/script>[\s\t\r\n]*/i", "\n", $body); 
     } 

     JResponse::setBody($body); 
    } 

} 

?> 
+0

これは、束の唯一の良い答えです。 – Cheeso

1

その後、必要に応じてリセットし、jQueryのを検索し、ヘッダを取得するためにJDocumentオブジェクトを使用しようとする場合があります。 getHeadData()setHeadData()の方法はそこからあなたを助けるはずです。あなたはこのコードを使用して、現在のJDocumentオブジェクトを取得することができます

$document =& JFactory::getDocument(); 

あなたはまた、同様の質問には、この応答で見たいと思うかもしれません:あなたは実際に冗長なのjQueryをストリッピングしている、その一つはJoomla, jQuery modules conflicting

ロードする。

+0

私はJoomlaの開発の初心者ですから、わかりませんが、getHeadData()をprint_rしようとしましたが、プラグインによって追加されたスクリプトのみが表示されていましたが、モジュールでは見つかりませんでした。彼らは後でロードされているので、joomlaをバイパスしてhtmlにスクリプトタグを直接表示するので、私は思っています。私が間違っているかどうか教えてください。 – Bakaburg

関連する問題