如何预先计算在waitForKeyElements()回调中使用的东西?

时间:2014-08-22 23:50:40

标签: javascript jquery scope greasemonkey tampermonkey

我正在使用这个令人惊叹的脚本waitForKeyElements()(wfke),它有助于处理用户脚本中动态加载的内容。

它做得很完美,但我在预先计算一些变量时遇到了很多麻烦,然后在执行wfke时使用它。

基本上,对于节点列表,它正确运行了数百次,所有节点都立即加载(在页面加载后)。但我无法为此列表中的每个项目创建昂贵的变量并进行昂贵的计算。所以我尝试在wfke函数之外做这些。

正如您在下面的示例中所看到的,我尝试了两种不同的方法来预先设置变量"图标"两者都不起作用。我猜这可能是@require脚本的一个特性?将脚本复制粘贴到我的主脚本中可以解决问题吗?这是唯一的方法吗?

// @require         https://gist.github.com/raw/2625891/waitForKeyElements.js
var icons = $('some stuff');
//Run for every BOX element that gets loaded by ajax
waitForKeyElements(".box", main);

function main(jqnode){
  if (typeof icons === 'undefined') { //icons is undefined here, and will be again the next time this function is run.
  var icons = $('some stuff');
  }
 jqnode.append(icons);
}

在Chrome中,Tampermonkey(测试版)

1 个答案:

答案 0 :(得分:1)

请参阅JavaScript Scoping and Hoisting和“Surprised that global variable has undefined value in JavaScript”。

执行此操作时:

var icons = $('some stuff');
函数main()范围内的

任何地方,它会创建一个用于代替全局范围变量的局部变量。此函数范围变量在if()语句时未定义。

此外,问题不明确;我假设你想 复制 所有.box个节点的图标?该代码目前的结构只包含一组图标,并将它们移动到最后显示的.box

如果您需要副本,请使用jQuery's .clone() method。类似的东西:

// @require  https://gist.github.com/raw/2625891/waitForKeyElements.js

var icons = $('some stuff');

//Run for every BOX element that gets loaded by ajax
waitForKeyElements (".box", main);

function main (jqnode){
    jqnode.append (icons.clone () );
    /*-- Or use this to copy event handlers, but should be using 
        `.on()` instead, anyway.

    jqnode.append (icons.clone (true) );
    */
}


如果那不是你想要的,请澄清并指明。