جافا سكريبت (عبر غرسمونكي) عدم ضبط "عنوان" سمات على الوسم

StackOverflow https://stackoverflow.com/questions/427679

  •  06-07-2019
  •  | 
  •  

سؤال

ولدي ما يلي (إلى حد ما) جافا سكريبت بسيطة مقتطفة بأنني السلكية إلى غرسمونكي. وغني عن طريق صفحة، يبحث عن الوسم الذي نقاط href لtinyurl.com، ويضيف "عنوان" السمة التي تحدد الوجهة الحقيقية للارتباط. الكثير من رمز مهم يأتي من (غير معتمد) Greasemonkey السيناريو الأكبر سنا أن إنهاء العمل عندما تغير العنصر الداخلي الذي عقد تطبيق XPath. بلدي النصي:

(function() {
    var providers = new Array();
    providers['tinyurl.com'] = function(link, fragment) {
        // This is mostly taken from the (broken due to XPath component
        // issues) tinyurl_popup_preview script.
        link.title = "Loading...";
        GM_xmlhttpRequest({
                method: 'GET',
                url: 'http://preview.tinyurl.com/' + fragment,
                onload: function(res) {
                    var re = res.responseText.match("<blockquote><b>(.+)</b></blockquote>");
                    if (re)
                    {
                        link.title = re[1].replace(/\<br \/\>/g, "").replace(/&amp;/g, "&");
                    }
                    else
                    {
                        link.title = "Parsing failed...";
                    }
                },
                onerror: function() {
                    link.title = "Connection failed...";
                }
        });
    };
    var uriPattern = /(tinyurl\.com)\/([a-zA-Z0-9]+)/;
    var aTags = document.getElementsByTagName("a");

    for (i = 0; i < aTags.length; i++)
    {
        var data = aTags[i].href.match(uriPattern);
        if (data != null && data.length > 1 && data[2] != "preview")
        {
            var source = data[1];
            var fragment = data[2];
            var link = aTags[i];
            aTags[i].addEventListener("mouseover", function() {
                if (link.title == "")
                {
                    (providers[source])(link, fragment);
                }
            }, false);
        }
    }
})();

و(السبب تم تعيين "مقدمي" مجموعة النقابي حتى على ما هو عليه، هو حتى أستطيع أن توسيع هذا لتغطية الخدمات الأخرى تقصير URL كذلك.)

ولقد تحققت من أن جميع فروع مختلفة من التعليمات البرمجية التي يتم التوصل إليها بشكل صحيح، في الحالات التي يكون فيها رابط قيد النظر وما لا تتطابق مع النمط. ما <م> ليس يحدث، هو أي تغيير في "عنوان" سمة من العلامات مرساة. لقد شاهدت هذا عن طريق الحرائق، والمكالمات alert() القيت في اليسار واليمين، وأنها مجرد يتغير أبدا. في التكرار السابق كل مظاهر النموذج:

link.title = "...";

وكان في الأصل:

link.setAttribute("title", "...");

وهذا لم ينجح أيضا. أنا لست مبتدئ إلى تفعيل جافا أو غرسمونكي، ولكن هذا واحد لي الحيرة!

هل كانت مفيدة؟

المحلول

وحاول استبدال جسد if مع هذا الرمز بدلا من ذلك.

        aTags[i].addEventListener("mouseover", (function(source, fragment)
        {
            return function()
            {
                if (this.title == "")
                {
                    (providers[source])(this, fragment);
                }
            }
        })(data[1], data[2]), false) ; 

ملحوظة بعد حلقة كاملة قيام aTags = null;.

والمشكلة هي أن إذا كتلة البيان ليس مجالا صحيحا، أي شيء var'd سوف تنتمي إلى نطاق وظائف الخارجي. وبالتالي وظيفة الداخلية الخاصة بك أنك تنص على ما معالج أحداث ستستخدم مصدر، وصلة وجزء من الممر الماضي. أديتيونالي من خلال الحفاظ على كل ما يشير إلى DOM الكائن الذي سيكون له تسرب الذاكرة بسبب المراجع الدائرية.

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

scroll top