0

我不明白发生了什么...
我有一个简单的用户脚本,它在我访问的页面中添加了几个 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(off)的触发器。
现在奇怪的部分......当我点击我的 DIVgreasemkytoggle 时,函数 togglegm(on) 被完美执行(显示greasemky),innerHTML 完全改变了“togglegm(off)”的链接,但是如果我点击再一次,然后什么也没有发生。

我查看源代码,发现我的 JS 函数就这样消失了(这就是为什么最后一次点击什么都没有发生的原因)!现在,有一个空函数替换了我的 togglegm():

<script>
scriptHolderArray1
</script>

你理解这种行为吗……?
对于这种情况,我在网上没有找到任何东西......

4

2 回答 2

1

GreaseMonkey 在一套更加安全良心的规则下运行。

使用正确的 DOM3 (addEventListener) 方法附加事件侦听器。

通过 innerHTML 分配 Javascript绝不是一个好主意(在用户脚本或一般脚本中)。

使用“javascript:”伪协议绝不是一个好主意。

于 2012-08-24T20:37:32.193 回答
0

问题是etat = 'on'etat = 'off'

如果要设置值,请使用

etat = 'on'
etat = 'off'

如果要比较,请使用:

etat == 'on'
etat == 'off'

此外,href="javascript:return(false);"在 Firefox 上引发错误,因为在函数外有返回(SyntaxError: return not in function)。您应该这样做href="javascript:void(0);",或return false在 onclick 事件结束时。

无论如何,我不太明白你在这里做什么:

var script2 = d.createElement('script');
script2.appendChild(d.createTextNode(togglegm));
(d.body || d.head || d.documentElement).appendChild(script2);

您有一个由元素togglegm加载到浏览器内存的函数。<script>

然后,您<script>使用该函数创建一个新函数并将其附加到文档中,以便再次将其加载到浏览器的内存中(我猜)。

为什么?

于 2012-08-24T20:42:38.333 回答