2009-08-26 15 views
7

में शामिल है या नहीं, यह जांचने का कोई तरीका है कि jQuery का उपयोग करके jQuery लोड हो गया है या नहीं?जांचें कि jQuery में हेडर (जूमला)

मैं जूमला में दो अलग-अलग करने वाले प्लग इन jQuery जे एस लोड है, लेकिन जब यह एक बार की तुलना में इसे सही ढंग से काम नहीं करता है और अधिक शामिल है।

प्रक्रिया को और अधिक समझाने के लिए: जूमला एचटीएमएल स्रोत को प्रस्तुत करने से पहले इसे रोकने की क्षमता प्रदान करता है, अनिवार्य रूप से स्रोत कोड पर काम कर रहा है।

इस समारोह का उपयोग कर रहा है:

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

$ पंक्ति पेज कि पार्स किया जा सकता की HTML सामग्री है।

मैं सोच रहा था कि शायद एक preg_match काम कर सकता था, लेकिन यह बहुत ज्यादा अनुभव नहीं है।

+3

आप के रूप में "अगर jQuery जूमला के साथ शीर्षक में शामिल किया गया है की जाँच करें" इस सवाल का अलग तरीके से व्यक्त कर सकते हैं। – deceze

उत्तर

14

अभी तक बेहतर, आप इसे जावास्क्रिप्ट के साथ की पुष्टि करें और फिर सिर में जोड़ने के लापता अगर कर सकते हैं।

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

पहले जावास्क्रिप्ट में चेक करना चाहिए। उदाहरण के लिए:

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

तब, आप सर्वर पर AJAX द्वारा एक संदेश भेज सकते हैं।

0

जब तक जूमला आपको बता रहा है जो स्क्रिप्ट यह शामिल है का एक तरीका प्रदान करता है? (ज़ेंड फ्रेमवर्क में ऐसी सूची है)

1

यह संभव नहीं है। PHP सर्वर-साइड है, जबकि जावास्क्रिप्ट (भाषा JQuery में लिखा गया है) क्लाइंट-साइड है। 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> 

वैसे यह एक हैक का एक सा है, और एक बेहतर तरीका हो सकता है: आप भी शामिल की तरह कुछ के साथ अपने के सभी बदल कर ऐसा कर सकता है।

संपादित करें: सोचा था की एक बिट के बाद: यह और भी सर्वर से jQuery पुस्तकालय लोड करने की asynchronicity की वजह से काम नहीं हो सकता है। ऐसा लगता है कि ऐसा करने का सबसे अच्छा तरीका onload स्क्रिप्ट से जुड़े ईवेंट हैंडलर के साथ होगा, लेकिन डोम इसका समर्थन नहीं करता है।

संपादित करें 2: ठीक है, अब मुझे लगता है कि आपका सर्वश्रेष्ठ दांव बस पृष्ठ में एक बार इसे शामिल करने की केवल प्रति-पृष्ठ एक स्क्रिप्ट टैग का उपयोग किया जाएगा। आप इसे किसी प्रकार के वैश्विक शीर्षलेख में जोड़कर और फिर इसे हर जगह हटाकर कर सकते हैं। फिर, कोई फर्क नहीं पड़ता कि, इसे फिर से शामिल न करें। इसका मतलब यह हो सकता है कि आप इसे उन पृष्ठों पर लोड करते हैं जिन्हें इसकी आवश्यकता नहीं है, लेकिन आधुनिक ब्राउज़र पर कैश के कारण यह कोई समस्या नहीं होनी चाहिए।

3

मुझे लगता है कि आप Joomla1.0 का उपयोग कर रहे हैं?

PHP आउटपुट बफर का उपयोग कर जूमला बफर सामग्री। यानी: ob_start()।

आप का उपयोग सामग्री प्राप्त कर सकते हैं: ob_get_contents();

इस प्रकार आप नियमित अभिव्यक्ति कर सकते हैं जो JQuery के लिए जांच करता है। कुछ ऐसा:

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

पर्याप्त होना चाहिए। (मैंने इसका परीक्षण नहीं किया है)।

ob_get_contents() का उपयोग स्थितियों में काम नहीं हो सकता है के बाद से पीएचपी उत्पादन बफर नेस्ट जा सकता है। आप बफर के भीतर कई बफर शुरू कर सकते हैं।

Joomla1.5 के लिए, आप एपीआई जो आप हमेशा जूमला उत्पादन हो रही है सुनिश्चित करता है के माध्यम से बफर मिल सकती है।

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

चाहे Joomla1.0 या 1.5 आप ध्यान दें कि जूमला किसी भी बिंदु पर बफर को जोड़ सकते हैं इससे पहले कि यह उत्पादन renders है (ob_flush कॉल() या समकक्ष)। इस प्रकार JQuery के लिए आपकी जांच को ध्यान में रखना है कि चेक के बाद JQuery लोड किया जा सकता है।

ध्यान दें कि जूमला बफर न केवल HTML के लिए बनाई गई है, लेकिन सीएसएस हो सकता है, जावास्क्रिप्ट, एक्सएमएल, 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

आप JDocument वस्तु का उपयोग कर हेडर प्राप्त करने के लिए है, तो कोशिश jQuery के लिए खोज के रूप में आवश्यक पुनर्स्थापित करने के लिए चाहते हो सकता है। getHeadData() और setHeadData() तरीकों वहाँ से आप की मदद करनी चाहिए। आप इस कोड के साथ वर्तमान JDocument वस्तु प्राप्त कर सकते हैं:

$document =& JFactory::getDocument(); 

तुम भी एक ऐसी ही सवाल करने के लिए इस प्रतिक्रिया को देखने के लिए चाहते हो सकता है: Joomla, jQuery modules conflicting

कि एक में, आप वास्तव में अनावश्यक jQuery बाहर अलग करना कर रहे हैं लोड होता है।

+0

मुझे यकीन नहीं है, क्योंकि मैं जूमला विकास में नौसिखिया हूं, लेकिन मैंने getHeadData() को print_r करने की कोशिश की और मुझे पता चला कि केवल प्लगइन द्वारा जोड़े गए स्क्रिप्ट मौजूद हैं लेकिन मॉड्यूल द्वारा नहीं। मैं जब से वे बाद में वे सिर्फ एचटीएमएल दरकिनार जूमला पर सीधे उनके स्क्रिप्ट टैग प्रिंट लोड कर रहे हैं लगता है। मुझे बताओ कि मैं गलत हूं। – Bakaburg

संबंधित मुद्दे