Yii रेंडरपार्टी(proccessoutput=true) डुप्लिकेट js अनुरोध से बचें




renderpartial clientscript (2)

मूल स्क्रिप्ट को दो बार शामिल करने से बचने के लिए

यदि आपकी स्क्रिप्ट पहले से एक पहले अनुरोध के माध्यम से शामिल की गई है, तो इसे फिर से शामिल करने से बचने के लिए इसका उपयोग करें:

// For jQuery core, Yii switches between the human-readable and minified
// versions based on DEBUG status; so make sure to catch both of them
Yii::app()->clientScript->scriptMap['jquery.js'] = false;
Yii::app()->clientScript->scriptMap['jquery.min.js'] = false;

यदि आपके पास if (Yii::app()->request->isAjaxRequest) साथ शामिल होने के लिए स्वतंत्र रूप से और HTML के टुकड़े के रूप में प्रस्तुत किए जाने वाले विचार हैं, तो आप इसे अंदर लपेट कर सकते हैं if (Yii::app()->request->isAjaxRequest) सभी ठिकानों को कवर करने के लिए।

JQuery के लिपियों को दो बार से बचने के लिए (जेएस समाधान)

क्लाइंट साइड पर स्क्रिप्ट को दो बार शामिल करने से रोकने की संभावना भी है। यह सीधे समर्थित नहीं है और थोड़ा और अधिक बोझिल है, लेकिन व्यवहार में यह ठीक काम करता है और आपको सर्वर पक्ष पर पता चलना पड़ता है कि क्लाइंट साइड पर क्या हो रहा है (अर्थात जो स्क्रिप्ट पहले ही शामिल हो चुके हैं)।

विचार सर्वर से एचटीएमएल प्राप्त करना है और नियमित अभिव्यक्ति के साथ <script> टैग को फिर से मिटा देना है। महत्वपूर्ण बिंदु यह है कि क्या पता लगाया जा सकता है कि jQuery के मुख्य स्क्रिप्ट और प्लगइन्स पहले से ही लोड किए गए हैं (क्योंकि वे इस पर $ या गुण बनाते हैं) और यह सशर्त रूप से करते हैं:

function stripExistingScripts(html) {
    var map = {
        "jquery.js": "$",
        "jquery.min.js": "$",
        "jquery-ui.min.js": "$.ui",
        "jquery.yiiactiveform.js": "$.fn.yiiactiveform",
        "jquery.yiigridview.js": "$.fn.yiiGridView",
        "jquery.ba-bbq.js": "$.bbq"
    };

    for (var scriptName in map) {
        var target = map[scriptName];
        if (isDefined(target)) {
            var regexp = new RegExp('<script.*src=".*' +
                                    scriptName.replace('.', '\\.') +
                                    '".*</script>', 'i');
            html = html.replace(regexp, '');
        }
    }

    return html;
}

फ़ाइल नाम और ऑब्जेक्ट्स का एक नक्शा है, जिसे निर्धारित किया गया है कि संबंधित स्क्रिप्ट पहले ही शामिल हो चुकी है; इस फ़ंक्शन के द्वारा अपने इनकमिंग HTML को पास करें और यह पहले लोड की गई लिपियों के अनुरूप <script> टैग की जांच करेगा और निकाल देगा।

हेल्पर फंक्शन isDefined है यह:

function isDefined(path) {
    var target = window;
    var parts = path.split('.');

    while(parts.length) {
        var branch = parts.shift();
        if (typeof target[branch] === 'undefined') {
            return false;
        }

        target = target[branch];
    }

    return true;
}

ईवेंट संचालकों को दो बार संलग्न करने से बचने के लिए

यदि आप पहले से ही हैंडलर संलग्न हैं तो याद रखने के लिए आप बस जावास्क्रिप्ट ऑब्जेक्ट का उपयोग कर सकते हैं; यदि हां, तो उसे दोबारा संलग्न न करें। उदाहरण के लिए (देखें कोड):

Yii::app()->clientScript->registerScript("view-script","
  window.myCustomState = window.myCustomState || {}; // initialize if not exists
  if (!window.myCustomState.liveClickHandlerAttached) {
    window.myCustomState.liveClickHandlerAttached = true;
    $('.link').live('click',function(){
       alert('test');
    })
  }
");

मैं एक साइट बनाना चाहता हूं जो ajaxRequest के साथ काम करता है, जब मैं एक लिंक पर क्लिक करता हूँ, यह ajaxRequest का उपयोग करके लोड हो जाएगा उदाहरण उपयोगकर्ता / लॉगिन UserController actionLogin के लिए जब मैं लोड करता हूं , तो मैं प्रोजेक्टऑप्टपुट के साथ दृश्य को सही में प्रस्तुत करता हूं ताकि जेएस के अंदर उस दृश्य के निर्माण की आवश्यकता होगी, हालांकि अगर मेरे पास क्लाइंट स्क्रीप्ट रिकॉर्ड है तो ईवेंट के साथ उस दृश्य में, मैं स्क्रिप्ट जनरेट करने से कैसे बच सकता हूं दो बार पंजीकृत या ajaxRequest पर निर्भर करता है? मैंने Yii::app()->clientScript->isSCriptRegistered('scriptId') की जांच की है कि स्क्रिप्ट पहले ही पंजीकृत है या नहीं, लेकिन ऐसा लगता है कि अगर आपने एजेक्स रिक्वेस्ट का इस्तेमाल किया है, तो परिणाम हमेशा झूठा होता है क्योंकि यह केवल सच हो सकता है रेंडर समाप्त हो गया है

नियंत्रक कोड

if (Yii::app()->request->isAjaxRequest)
{
   $this->renderPartial('view',array('model'=>$model),false,true);
}

कोड देखें

if (!Yii::app()->clientScript->isScriptregistered("view-script"))
   Yii::app()->clientScript->registerScript("view-script","
      $('.link').live('click',function(){
         alert('test');
     })
");

अगर मैं पहली बार नियंत्रक के लिए अनुरोध करता हूं, तो यह पूरी तरह से कार्य करता है (सतर्क 1 बार), लेकिन अगर मैं फिर से उस पेज पर ताज़ा करने के बिना उसी नियंत्रक के लिए अनुरोध करता हूं और सिर्फ एजेक्स रेक्वेस्ट का उपयोग कर रहा हूं, तो अलर्ट आपको दो बार आउटपुट देगा (क्योंकि यह रहता है घटना के निर्माण पर आप पहले से ही एक बार पंजीकृत हैं)

यह वही है अगर आपके पास jquery फ़ंक्शंसिटी के साथ दृश्य के अंदर सीक्वेटिवफॉर्म है। कोर्स्क्रिप्ट यूआईएक्टिवफॉर्म आपको प्रत्येक बार प्रस्तुत करना होगा


किसी भी डुप्लिकेट कोर स्क्रिप्ट से बचने के लिए एक्शन () से पहले ओवरराइड करना सबसे आसान तरीका है:

class Controller extends CController {

  protected function beforeAction($action) {
        if( Yii::app()->request->isAjaxRequest ) {
            Yii::app()->clientScript->scriptMap['jquery.js'] = false;
            Yii::app()->clientScript->scriptMap['jquery-2.0.0.js'] = false;
            Yii::app()->clientScript->scriptMap['anything.js'] = false;
        }

        return parent::beforeAction($action);
  }

}

ध्यान दें कि आपको पथ के बिना, सही जेएस फ़ाइल नाम रखना होगा।