Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何只运行一次JS函数?_Javascript_Jquery_Function_Scroll - Fatal编程技术网

Javascript 如何只运行一次JS函数?

Javascript 如何只运行一次JS函数?,javascript,jquery,function,scroll,Javascript,Jquery,Function,Scroll,当用户从我的网站滚动到特定的元素id时,我想弹出一个窗口 目前,我成功地做到了这一点,但它是在一个循环中工作的,在执行一次之后,我无法停止该函数 下面是我的JS代码: $(window).scroll(function() { var executed = false; if (!executed){ executed = true; var hT = $('#scroll-to').offset().top, hH = $('#scroll-to').out

当用户从我的网站滚动到特定的元素id时,我想弹出一个窗口

目前,我成功地做到了这一点,但它是在一个循环中工作的,在执行一次之后,我无法停止该函数

下面是我的JS代码:

$(window).scroll(function() {
 var executed = false;
  if (!executed){ 
  executed = true;
      var hT = $('#scroll-to').offset().top,
      hH = $('#scroll-to').outerHeight(),
      wH = $(window).height(),
      wS = $(this).scrollTop();
   if (wS > (hT+hH-wH)){
   <!--
     window.setTimeout('window.location="javascript:showSuccessToast();"; ',2000);
     // -->
  }}
  });
$(窗口)。滚动(函数(){
var=false;
如果(!已执行){
已执行=真;
var hT=$('#滚动到“).offset().top,
hH=$(“#滚动到”).outerHeight(),
wH=$(窗口).height(),
wS=$(this.scrollTop();
如果(wS>(hT+hH-wH)){
}}
});
当“executed”变量变为true时,我无法理解为什么函数会执行。
我如何管理它只触发一次showsuccessToast?

每次触发事件时,您的函数都会从头开始执行-这包括初始化执行的
。换句话说,每次函数运行时,您都将
executed
设置回false

要解决此问题,需要将变量定义拉到函数外部:

var executed = false;

$(window).scroll(function() {
    if (!executed) { 
        executed = true;

        ...
    }
});

每次触发事件时,您的函数都会从头开始执行-这包括初始化执行的
。换句话说,每次函数运行时,您都将
executed
设置回false

要解决此问题,需要将变量定义拉到函数外部:

var executed = false;

$(window).scroll(function() {
    if (!executed) { 
        executed = true;

        ...
    }
});

当滚动事件发生时,执行的var总是设置为false。这意味着它在你的功能中是无用的

将已执行的退出事件函数应起作用

   var executed = false;
$(window).scroll(function() {
  var hT = $('#scroll-to').offset().top,
  hH = $('#scroll-to').outerHeight(),
  wH = $(window).height(),
  wS = $(this).scrollTop();
 if (wS > (hT+hH-wH)){
if (!executed){ executed = true;
     <!--
     window.setTimeout('window.location="javascript:showSuccessToast();"; ',20);
     // -->
 }}
 });
var executed=false;
$(窗口)。滚动(函数(){
var hT=$('#滚动到“).offset().top,
hH=$(“#滚动到”).outerHeight(),
wH=$(窗口).height(),
wS=$(this.scrollTop();
如果(wS>(hT+hH-wH)){
如果(!executed){executed=true;
}}
});

当滚动事件发生时,执行的var总是设置为false。这意味着它在你的功能中是无用的

将已执行的退出事件函数应起作用

   var executed = false;
$(window).scroll(function() {
  var hT = $('#scroll-to').offset().top,
  hH = $('#scroll-to').outerHeight(),
  wH = $(window).height(),
  wS = $(this).scrollTop();
 if (wS > (hT+hH-wH)){
if (!executed){ executed = true;
     <!--
     window.setTimeout('window.location="javascript:showSuccessToast();"; ',20);
     // -->
 }}
 });
var executed=false;
$(窗口)。滚动(函数(){
var hT=$('#滚动到“).offset().top,
hH=$(“#滚动到”).outerHeight(),
wH=$(窗口).height(),
wS=$(this.scrollTop();
如果(wS>(hT+hH-wH)){
如果(!executed){executed=true;
}}
});

另一个选项是使用以下JS代码:

$(window).scroll(myScrollFunction);
function myScrollFcuntion()
{
    // do things
    $(window).unbind("scroll", myScrollFunction);
}

另一个选项是使用以下JS代码:

$(window).scroll(myScrollFunction);
function myScrollFcuntion()
{
    // do things
    $(window).unbind("scroll", myScrollFunction);
}


可能重复的
$(窗口)。一个(“滚动”,函数(){…})不需要自己处理。@Frederic,但请指着一张文件,这样他就可以跟上来了<代码>window.setTimeout('window.location=“javascript:showSuccessToast();”;”,2000)。。。什么?为什么不干脆设置超时(showSuccessToast,2000)
?可能重复
$(窗口)。一个(“滚动”,函数(){…})不需要自己处理。@Frederic,但请指着一张文件,这样他就可以跟上来了<代码>window.setTimeout('window.location=“javascript:showSuccessToast();”;”,2000)。。。什么?为什么不干脆
设置超时(showSuccessToast,2000)
?如果用户刷新页面怎么办?它会再次启动吗?现在它只在我重新加载页面并且id显示在窗口中时才会启动:(如果我从顶部滚动到id,它不会启动当然它会启动(你说的“启动”是什么意思?)再次。当用户刷新页面时,内存将被刷新。因此执行将重置为false。到底是谁将我的答案更改为不正确的答案?如果用户将刷新页面怎么办?它会再次触发吗?现在,它仅在我重新加载页面且id显示在窗口中时才会触发:(如果我从顶部滚动到id,它不会启动当然它会再次启动(你说的启动是什么意思?)。当用户刷新页面时,内存将被刷新。因此执行将重置为false。到底是谁将我的答案更改为不正确的答案?现在它只在我重新加载页面并且id显示在窗口中时启动:(如果我从顶部滚动到id,它不会fire@GeorgeL.您必须将
executed=true
行移动到只想执行一次的位置。在这种情况下,可能在if块内。但它在if块中,我指的是
if(wS>(hT+hH-wH)){
block。如果这也不起作用,那么问题在于规则逻辑。是的,我同意@JJJ-您可能希望在触发成功toast后,将设置
executed
的行移到true。现在,只有当我重新加载页面并且id出现在窗口中时,它才会触发:(如果我从顶部滚动到id,它不会fire@GeorgeL.您必须将
executed=true
行移动到只想执行一次的位置。在这种情况下,可能在if块内。但它在if块中,我指的是
if(wS>(hT+hH-wH)){
block。如果这也不起作用,那么问题出在规则逻辑上。是的,我同意@JJJ-您可能希望在触发成功toast之后将设置
执行的
的行移到true。好吧,现在它不触发事件。好吧,现在它不触发事件