我不明白发生了什么...... 我有一个简单的用户脚本,在我访问的页面中添加了几个DIV,CSS样式和JS函数 特别是,我有一个DIV用onClick监听器触发JS函数 - 这个函数是一个“切换”函数(显示/隐藏其他DIV):
function togglegm(etat) {
if (etat = 'on') {
document.getElementById('greasemky').style.display = 'block';
document.getElementById('greasemkytoggle').innerHTML = '<a href="javascript:return(false);" onClick="togglegm(\'off\');"></a>';
} else if (etat = 'off') {
document.getElementById('greasemky').style.display = 'none';
document.getElementById('greasemkytoggle').innerHTML = '<a href="javascript:return(false);" onClick="togglegm(\'on\');"></a>';
}
}
var script2 = d.createElement('script');
script2.appendChild(d.createTextNode(togglegm));
(d.body || d.head || d.documentElement).appendChild(script2);
DIV“greasemkytoggle”只包含一个触发“togglegm('on')onClick的链接,我的目标是当执行togglegm(on)时,此DIV的innerHTML成为togglegm的触发器(关闭) )。
现在奇怪的部分...当我点击我的DIV greasemkytoggle时,函数togglegm(on)完美执行(greasemky显示),innerHTML完全改变了“togglegm(off)”的链接,但是如果我再次单击,然后没有任何反应。
我查看了源代码,发现我的JS函数刚刚消失(这就是为什么最后一次点击没有发生的原因)!现在,有一个空函数替换我的togglegm():
<script>
scriptHolderArray1
</script>
你了解那种行为......? 我在网上找不到这种情况...
答案 0 :(得分:1)
GreaseMonkey在更安全的良心规则下运行。
使用正确的DOM3(addEventListener)方法附加事件侦听器。
通过innerHTML分配Javascript绝不是一个好主意(在用户脚本或通用脚本中)。
使用“javascript:”伪协议永远不是一个好主意。
答案 1 :(得分:0)
问题包括etat = 'on'
和etat = 'off'
。
如果要设置值,请使用
etat = 'on'
etat = 'off'
如果您想比较,请使用:
etat == 'on'
etat == 'off'
此外,href="javascript:return(false);"
在Firefox上引发错误,因为函数外部有一个返回值(SyntaxError:return not in function)。您应该在onclick事件结束时执行href="javascript:void(0);"
或return false
。
无论如何,我不太清楚你在这里做了什么:
var script2 = d.createElement('script');
script2.appendChild(d.createTextNode(togglegm));
(d.body || d.head || d.documentElement).appendChild(script2);
togglegm
元素将一个函数<script>
加载到浏览器的内存中。
然后,您使用该函数创建一个新的<script>
并将其附加到文档中,以便再次将其加载到浏览器的内存中(我猜)。
为什么?