将命令从Javascript转换为Greasmonkey

将命令从Javascript转换为Greasmonkey,javascript,greasemonkey,Javascript,Greasemonkey,我试图在一个页面上添加一个字符计数器,在这个页面上我输入了三个值,它在div的innerHTML中返回一个大字符串,ID为'AnswerBoxID',现在我想让我的脚本明显地计算我写的代码中的字符数 var submit=document.getElementsByClassName('Row3'); function countChars(){ count = document.getElementById('AnswerBoxID').innerHTML.length; do

我试图在一个页面上添加一个字符计数器,在这个页面上我输入了三个值,它在div的innerHTML中返回一个大字符串,ID为'AnswerBoxID',现在我想让我的脚本明显地计算我写的代码中的字符数

var submit=document.getElementsByClassName('Row3');
function countChars(){
    count = document.getElementById('AnswerBoxID').innerHTML.length;
    document.title ="Chars "+count+"/160";
}
它返回字符的大致近似值,当我将其粘贴到编辑器或其他计算字符的工具中时,我再次得到一个不同的结果,使用此方法计算的字符数与其他报告的字符数相差不超过5个字符(特别是记事本+)

但我最大的问题是我无法更新countChars() 当
document.getElementById('AnswerBoxID').innerHTML的值更新时,在javascript中,我使用以下代码克服了这一问题

var submit=document.getElementsByClassName('Row3');
for (i=0; i<submit.length; i++){
    submit[i].firstChild.setAttribute('onclick','countChars()');
}
var submit=document.getElementsByClassName('Row3');

对于GreaseMonkey中的(i=0;i),您应该能够使用:

var count = document.getElementById('AnswerBoxID').textContent.length;

在GreaseMonkey中,您应该能够使用:

var count = document.getElementById('AnswerBoxID').textContent.length;

Greasemonkey脚本运行沙盒。这意味着,脚本在页面的
onload
事件中运行,然后被删除。提交表单时调用Greasemonkey脚本的
countChars()
函数将返回
未定义的
错误,因为DOM中不再存在函数对象

下面是我的简化
contentEval
函数(基于GM wiki的函数):

您还可以设置
text
属性,而不是
textContent
,以与旧版IE兼容,谢谢RogG

将该函数放入GM脚本中,它将用于将以后需要使用的任何函数附加到DOM头部

countChars
函数作为参数传递给
contentEval
函数:

function contentEval(source) {
    var script = document.createElement('script');
    script.setAttribute("type", "text/javascript");
    script.textContent = source;
    document.head.appendChild(script);
}
contentEval(function countChars() {
    var count = document.getElementById('AnswerBoxID').textContent.length;
    document.title ='Chars '+count+'/160';
});
这样,您的
countChars
函数将被放置在附加到文档
头的
脚本
元素中,在GM脚本的执行时间结束后可以访问该元素

如果要检查上述代码的演示,请在中使用DOM检查器。它将创建一个新的
脚本
元素,该元素将附加到(在JSFIDLE的情况下是
iframe
)文档的
,这意味着无论何时需要都可以访问它

您也可以简单地将函数附加到,但除非严格必要,否则应避免使用
unsafeWindow
,并注意Google Chrome不支持
unsafeWindow

请使用本页作为参考:


还可以使用该方法获取RobG指出的元素(及其子体)的文本内容。

Greasemonkey脚本运行沙盒。这意味着,该脚本在页面的
onload
事件中运行,然后被删除。调用Greasemonkey脚本的
countChars()
提交表单时,函数将返回一个
未定义的
错误,因为您的函数对象不再存在于DOM中

下面是我的简化
contentEval
函数(基于GM wiki的函数):

您还可以设置
text
属性,而不是
textContent
,以与旧版IE兼容,谢谢RogG

将该函数放入GM脚本中,它将用于将以后需要使用的任何函数附加到DOM头部

countChars
函数作为参数传递给
contentEval
函数:

function contentEval(source) {
    var script = document.createElement('script');
    script.setAttribute("type", "text/javascript");
    script.textContent = source;
    document.head.appendChild(script);
}
contentEval(function countChars() {
    var count = document.getElementById('AnswerBoxID').textContent.length;
    document.title ='Chars '+count+'/160';
});
这样,您的
countChars
函数将被放置在附加到文档
头的
脚本
元素中,在GM脚本的执行时间结束后可以访问该元素

如果要检查上述代码的演示,请在中使用DOM检查器。它将创建一个新的
脚本
元素,该元素将附加到(在JSFIDLE的情况下是
iframe
)文档的
,这意味着无论何时需要都可以访问它

您也可以简单地将函数附加到,但除非严格必要,否则应避免使用
unsafeWindow
,并注意Google Chrome不支持
unsafeWindow

请使用本页作为参考:


还可以使用该方法获取RobG指出的元素(及其子元素)的文本内容。

您似乎添加了错误的事件处理程序

elm.setAttribute('onclick','countChars()');
将设置一个属性,并在单击元素时在全局范围内eval
“countChars()”
。但是,Greasemonkey脚本会运行,并且您声明的函数“countChars”对eval不可用

elm.addEventListener('click',countChars(),true);

立即执行函数并将返回值作为处理程序添加。要使其正常工作,只需删除括号并传递函数本身。另请参见添加事件处理程序时出现的错误

elm.setAttribute('onclick','countChars()');
将设置一个属性,并在单击元素时在全局范围内eval
“countChars()”
。但是,Greasemonkey脚本会运行,并且您声明的函数“countChars”对eval不可用

elm.addEventListener('click',countChars(),true);

立即执行函数并将返回值作为处理程序添加。要使其正常工作,只需删除括号并传递函数本身。另请参见Greasemonkey脚本运行沙盒。您不能调用
countChars()
从您使用DOM的脚本开始!您应该试试DOM脚本注入黑客。谢谢,伙计,我会读一读这篇文章。这是一个好的开始:我有两个工作脚本,如果您在此之前没有得到工作答案,我会先测试它们,然后再作为答案发布P@Fabr里奇奥·马特:哈,那是什么?就用吧。@hamsolo474:你真的应该告诉你s脚本运行的页面。Greasemonkey脚本运行沙盒。您不能调用
countChars()
从您使用DOM的脚本开始!您应该试试DOM脚本注入黑客。谢谢,伙计,我会读一读这篇文章。这是一个好的开始:我有两个工作脚本,如果您在此之前没有得到工作答案,我会先测试它们,然后再作为答案发布P@Fabr里奇奥·马特:哈,那是什么?就用它。@hamso