用户名:我丢了一些JS?

时间:2012-08-24 20:30:45

标签: javascript userscripts

我不明白发生了什么...... 我有一个简单的用户脚本,在我访问的页面中添加了几个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>

你了解那种行为......? 我在网上找不到这种情况...

2 个答案:

答案 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>并将其附加到文档中,以便再次将其加载到浏览器的内存中(我猜)。

为什么?