2

我正在开发一个小游戏,在这个游戏中,我需要时常发生灾难。这场灾难必须动摇我的 MainFrame 元素并从构建数组和 DOM 中删除所有具有 .House 类的元素。

此代码在一定程度上有效,问题是它不会从 DOM 中删除元素,仅从数组中删除。你能帮我让它工作吗?我第一次使用这个网站,所以我希望我没有遗漏任何相关内容。

setInterval(function() {

    var iDisasterChance = getRandomNumber(1, 12);

    if (iDisasterChance === 1)
    {
        $(".MainFrame").effect("shake", {times: 8}, 4000);
        //$(".House").effect("explode", {pieces: 24}, 4000);
        $(".House").effect("explode", {pieces: 24}, 4000,  $(".House").remove); // TODO: bug - leaves elements in the dom
        //$(".House").remove();
        oCity.aBuildings.length = 0;
        console.log(iDisasterChance +' of 12');
        console.log('*** DISASTER ! AVOIDED ***');
        console.dir(oCity.aBuildings);
        return false;
    }
    else
    {
        console.log(iDisasterChance +' of 12');
        console.log('*** DISASTER AVOIDED ***');
    }
}, 10000);
4

2 回答 2

5

试试这个方法。您不需要remove()remove回调中,因为您在 remove 方法中丢失了 jquery 对象的上下文。

$(".House").effect("explode", {pieces: 24}, 4000,  function(){
    $(this).remove(); //now this will get executed once your animation effect is complete and this represents the .House where the effect happened.
});

如果你想要remove所有的.House,那么它必须是。

$(".House").effect("explode", 
                              {pieces: 24}, 4000, 
                              $(".House").remove.bind($(".House"))); //bind will set the context to that of .House.

或者

   $(".House").effect("explode", {pieces: 24}, 4000,function(){
          $(".House").remove();
   });

原因是当你这样做时:

$(".House").effect("explode", {pieces: 24}, 4000,  $(".House").remove));

当然,该remove方法将在回调中设置,其上下文最有可能与DOMelement而不是jquery object(正如您在常规回调中看到的那样,您this作为 DOM 元素获得,并且它没有 jquery 版本的 remove 方法)。因此您可以使用function.bind绑定上下文或$.proxy仅在回调中执行此操作。

于 2013-09-27T17:45:03.507 回答
-1

我不知道这个函数将在什么背景下工作,但我注意到关于你的代码的两件事。

  1. 您当前拥有的后期效果代码:$('.House').remove应该$('.House').remove()带有括号,否则您只是引用该方法而不是实际调用它。

  2. 您的 if 语句仅返回其两种情况之一,我再次不确定您打算做什么,但我相信您可能希望return true;else子句中有一个。

希望这些建议有所帮助。

于 2013-09-27T17:49:50.663 回答