سؤال

أحاول تحديث تلميح الأدوات المصنوع ديناميكيا باستخدام Prototip والنموذج الأولي. الطريقة التي أحاول القيام بها ربما ليست هي أفضل طريقة (لذلك إذا كنت تعرف طريقة أفضل ستكون مفيدة)، ولكن الطريقة الوحيدة التي يمكنني التفكير فيها للقيام بذلك ستكون لعقد جافا سكريبت في عنصر وتحديث JavaScript داخل عنصر DIV من أجل تحديث Tooltip. ومع ذلك، يبدو أن هذا هو تسرب ذاكرة منذ كل مرة يتم فيها تحديث جافا سكريبت، يتم إنشاء كائن طرف جديد وتخزينه في الذاكرة. إذا لم تكن هناك طريقة أفضل للقيام بذلك، كيف يمكنني مسح الذاكرة؟

لقد قمت بإجراء هذا البرنامج النصي البسيط لاختبار تسرب الذاكرة، والآن أحتاج إلى معرفة كيفية تحقيق ذلك حتى يتم تصحيح تسرب الذاكرة في هذا المثال.

for (i=0; i<1000; i++) {
    $('testdiv').update("<script type='text/javascript'> new Tip('chips_tip', 'Your Chips', {style: 'creamy',stem: 'topLeft',hook: { mouse: true, tip: 'topLeft' },offset: { x: 10, y: 16 },delay: 0.04,width: 85}); <\/script>");
}

فيما يلي ما هو JavaScript ل Tooltip عادة:

new Tip('element', "Description", {
    style: 'creamy',
    stem: 'topLeft',
    hook: { mouse: true, tip: 'topLeft' },
    offset: { x: 10, y: 16 },
    delay: 0.04,
    width: 85
});
هل كانت مفيدة؟

المحلول

يبدو أن بناء النصيحة الجديدة يمكن أن يأخذ عنصر بدلا من نص أدوات الأدوات كمعلمة. قد ترغب في محاولة استخدام ذلك. لم أفعل ذلك حتى يتعين عليك تجربة ذلك بنفسك. أولا، قم بإنشاء تخطيط أدوات Tooltip (DIV Tag يحتوي على نص أدوات Tooltip) وأسلوبها كالمعتاد. قم بتعيين سمة النمط لهذا DIV إلى "عرض: لا شيء". ثم حاول إنشاء طرف مثل هذا:

new Tip('source', $('tooltip_container'));

يمكنك بعد ذلك تغيير نص Tooltip باستخدام:

$('tooltip_container').update('new tooltip text');

لا يكفي تعيين بناء أدوات تلميح الأدوات إلى متغير في المساحة العالمية، لأنه يبدو لي أن البروتوكول البروتوكول التنفيذي يقوم بتدوير الاشتراكات HTML Tooltip الخاصة به في DOM. تخميني هو أنه في كل مرة تسمون فيها "نصيحة جديدة" تقوم بإضافة HTML إضافية إلى DOM. هذه الكائن ثم المرجعية DOM العقد، لذلك لا يتم جمع القمامة أبدا. يجب أن يكون من السهل عليك التحقق من ذلك باستخدام رمز الاختبار الخاص بك و Firebug لفحص DOM.

الخيار النهائي لديك هو إلقاء نظرة على التعليمات البرمجية المصدر Prototip لمعرفة ما إذا كان لديه نوع من وظيفة SettoolTipText. ثم قد تكون قادرا على القيام بشيء مثل هذا:

var tooltip = new Tip('element', 'text');
// snip
tooltip.setText('some new text');

إذا لم يساعد ذلك، فما عليك سوى إرسال مؤلف Prototip. أنا متأكد من أنه سيكون سعيدا للمساعدة.

نصائح أخرى

كما لاحظت، سيعني إنشاء نصيحة جديدة، يتم إنشاء كائن طرف جديد وتخزينه في الذاكرة.

للحصول على هذا، تحتاج إلى تعيين الطرف إلى متغير فريد في النطاق العالمي. أي إنشاء مثيل "تلميح الأدوات" المتغير، ثم استخدم "Tooltip = TAOLTIP = نصيحة جديدة" في روتينك (هذا سيسمح ل Toottip واحد فقط لتكون قيد الاستخدام في وقت واحد، والذي أود أن أفترضه هو ما تريد فقط يمكن عرضه ). جمع القمامة يجب أن تعتني بالباقي.

عن طريق إنشاء كائن "TIP" الكائن الذي تقوم فيه بالفعل بإجراء مكالمة منشئتين، مثل مكالمة وظيفة بسيطة، والتي تتعامل مع العنصر المرئي وتحديثه وفقا لذلك، ولكن بمجرد الإشارة إلى أي متغير من المفترض أن يتم جمعها بواسطة جامع القمامة. في حال كنت تريد أن تكون متأكدا من أنه يمكنك القيام به التالي:

var tip = new Tip( whatever);
// before next update do delete tip;

يبدو أن هذا هو في الواقع تسرب الذاكرة في النموذج الأولي. وفقا لهذا, ، تم إصلاح التسرب في 1.6.1

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top