Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript(通过Greasemonkey)未能设置;标题「;属性在<;a>;标签_Javascript_Html_Greasemonkey - Fatal编程技术网

JavaScript(通过Greasemonkey)未能设置;标题「;属性在<;a>;标签

JavaScript(通过Greasemonkey)未能设置;标题「;属性在<;a>;标签,javascript,html,greasemonkey,Javascript,Html,Greasemonkey,我有以下(相当)简单的JavaScript代码片段,我已经连接到Greasemonkey中。它浏览一个页面,查找href指向tinyurl.com的标签,并添加一个“title”属性来标识链接的真正目的地。许多重要的代码来自一个较旧的(不受支持的)Greasemonkey脚本,该脚本在保存XPath实现的内部组件发生更改时停止工作。我的剧本: (function() { var providers = new Array(); providers['tinyurl.com'] =

我有以下(相当)简单的JavaScript代码片段,我已经连接到Greasemonkey中。它浏览一个页面,查找href指向
tinyurl.com
的标签,并添加一个“title”属性来标识链接的真正目的地。许多重要的代码来自一个较旧的(不受支持的)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);
        }
    }
})();
原来是:

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

那也不行。我不是JavaScript或Greasemonkey的新手,但这一个让我难堪

如果,请尝试用此代码替换
的主体

        aTags[i].addEventListener("mouseover", (function(source, fragment)
        {
            return function()
            {
                if (this.title == "")
                {
                    (providers[source])(this, fragment);
                }
            }
        })(data[1], data[2]), false) ; 
注意循环完成后do
aTags=null

您的问题是if语句块不是真范围,任何var'd都将属于外部函数范围。因此,作为事件处理程序提供的内部函数将使用最后一个过程的源、链接和片段。另外,通过维护对DOM对象的引用,您将由于循环引用而导致内存泄漏


上述方法通过函数调用在每次传递时创建一个新的作用域,以便每个源和片段都在自己的作用域中。它还利用了这样一个事实,即被称为事件侦听器的函数具有指向它所连接的元素的
this
属性,因此避免了包含DOM元素的循环引用。

尝试将代码减少到bug仍然存在的最小值。如果范围太大+1卓越的。。。我试试这个。我怀疑你已经死定了,因为分配source/fragment/link而不是直接使用它们的原因是它们“神秘地”超出了范围。JS闭包!=Perl闭包!
        aTags[i].addEventListener("mouseover", (function(source, fragment)
        {
            return function()
            {
                if (this.title == "")
                {
                    (providers[source])(this, fragment);
                }
            }
        })(data[1], data[2]), false) ;