JavaScript(通过Greasemonkey)未能设置;标题「;属性在<;a>;标签
我有以下(相当)简单的JavaScript代码片段,我已经连接到Greasemonkey中。它浏览一个页面,查找href指向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'] =
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(/&/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) ;
注意循环完成后doaTags=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) ;