使具有用户交互功能的 jQuery .mouseenter()/.mouseleave() 脚本正常工作时出现问题

发布于 2024-12-12 13:23:10 字数 770 浏览 3 评论 0原文

首先,对标题表示歉意,我想不出合适的标题。

我不确定为什么下面代码中的 hide() 函数在触发时会在 firebug 中返回错误,我很确定一旦解决了这个缺陷,代码的其余部分将正常工作,任何帮助/建议将不胜感激。

Firebug 控制台错误:

hide is not defined
it-services() it-services (line 396)
time = setTimeout("hide()",3000); 

到目前为止我所拥有的代码:

        var time;

        $("#form").mouseenter(function() {
            clearTimeout(time);
            $(this).delay(800).animate({
                right: 0
            }, 2000);
        }).mouseleave(function() {
            function hide() {
                $(this).delay(800).animate({
                    right: "-325px"
                }, 1000);
            }
            time = setTimeout(hide,3000);
        });

非常感谢大家提前提供的帮助,

Dan。

Firstly, apologies for the title, I could not think of a suitable one.

I am unsure as to why the hide() function within the below code comes back erroneous in firebug when triggered, I am pretty sure the rest of the code will work fine once I have ironed this flaw out, any help/suggestions would be appreciated.

Firebug Console error:

hide is not defined
it-services() it-services (line 396)
time = setTimeout("hide()",3000); 

Code I have thus far:

        var time;

        $("#form").mouseenter(function() {
            clearTimeout(time);
            $(this).delay(800).animate({
                right: 0
            }, 2000);
        }).mouseleave(function() {
            function hide() {
                $(this).delay(800).animate({
                    right: "-325px"
                }, 1000);
            }
            time = setTimeout(hide,3000);
        });

Thank you all very much for any help in advance,

Dan.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

橘亓 2024-12-19 13:23:10

您在使用 setTimeout 调用 hide() 函数后声明它。只需将声明放在 setTimeout 调用之前即可。

此外,当您将一串代码作为第一个参数传递给 setTimeout 时,它会被 eval 编辑。 eval 是邪恶的。只需传递函数对象:

function hide() {
    $(this).delay(800).animate({
        right: "-325px"
    }, 1000);
}
time = setTimeout(hide, 3000);

You're declaring the hide() function after you invoke it using setTimeout. Simply put the declaration before the setTimeout call.

Also, when you pass a string of code as first argument to setTimeout, it gets evaled. eval is evil. Just pass the function object:

function hide() {
    $(this).delay(800).animate({
        right: "-325px"
    }, 1000);
}
time = setTimeout(hide, 3000);
分開簡單 2024-12-19 13:23:10

新代码中有两个问题

  1. 在 hide 函数中,$(this) 的上下文与
    当它在 mouseout 函数内部被调用时。
  2. 其次, hide 函数被定义为 mouseout 函数内部的匿名函数,

我觉得如果它是在 mouseover 事件处理函数之外声明的函数会更有意义。这样您就可以从 setTimeOut 以及 mouseout 事件处理程序全局引用它。尝试下面的代码。我相信这应该可以解决问题,或者至少让您领先一步。

var time;
var $form;

$("#form").mouseenter(function() {
    $form = $(this);
    clearTimeout(time);
    $(this).delay(800).animate({
        right: 0
    }, 2000);
}).mouseleave(function() {
    hide();
    time = setTimeout(hide,1000);
});
function hide() {
    $form.delay(800).animate({
        right: "-325px"
    }, 3000);
}

There are 2 issues in the new code

  1. Inside the hide function, the context of $(this) is not same as the
    when it is being called inside the mouseout function.
  2. Secondly, the hide function is defined as an anonymous function inside the mouseout function

I feel it would make more sense if it were a function declared outside the mouseover event handling function. That way you can globally reference it from the setTimeOut as well as the mouseout event handler. Try the below code. I believe this should solve the issue, or at least take you a step ahead.

var time;
var $form;

$("#form").mouseenter(function() {
    $form = $(this);
    clearTimeout(time);
    $(this).delay(800).animate({
        right: 0
    }, 2000);
}).mouseleave(function() {
    hide();
    time = setTimeout(hide,1000);
});
function hide() {
    $form.delay(800).animate({
        right: "-325px"
    }, 3000);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文