【问题标题】:JQuery - Run once per sessionJQuery - 每个会话运行一次
【发布时间】:2014-09-24 02:31:21
【问题描述】:

我有一个由“计算”按钮触发的功能

我需要这条线每个会话只运行一次(会话可能是 1 天或直到重新加载浏览器)。

$('.popup-with-form').magnificPopup('open');

这会打开一个 Magnific Popup。一旦执行了这个函数(弹出窗口打开),如果再次按下“计算”按钮,我不想再次打开弹出窗口。

JS/JQuery 代码:

function StateChanged() {
       if (XmlHttp.readyState == 4 || XmlHttp.readyState == "complete") {
           $('.popup-with-form').magnificPopup('open');
          document.getElementById("CalcSum").innerHTML = XmlHttp.responseText;
          document.getElementById("CalcSumPopup").innerHTML = XmlHttp.responseText;
       }
    }

PS我知道很多这样的问题会弹出,我尝试了不同的做事方式,但由于我是“代码挑战者”并且不知道 JQuery 或 JS 我不能想办法。我知道 JQuery 中有一个 .one “东西”,但不明白如何使它工作。

【问题讨论】:

  • @derdida 因为我需要计算器才能工作。如果我禁用该按钮,它将停止工作。
  • 所以基本上你有一个自定义的“会话”东西,这不是一个真正的会话,所以你不能只在sessionStorage 中设置一个标志或一个简单的会话cookie。如果您的意思是常规会话,Google 会话 cookie

标签: javascript jquery


【解决方案1】:

如果您只想在每个浏览器会话中执行此行一次,您可以使用sessionStorage。当您在 sessionStorage 上设置变量时,它会保持其值直到浏览器关闭(例如,直到您关闭 Google Chrome)。

所以你可以这样做:

if (!sessionStorage.alreadyClicked) {
    $('.popup-with-form').magnificPopup('open');
    sessionStorage.alreadyClicked = 1;
}

小心sessionStorage,因为它只能存储string 值。

如果您希望每个页面会话仅执行一次该行(这意味着每次页面刷新一次),那么您可以使用任何变量并将其设置为 true 以记住您已经执行了该行:

if (!window.alreadyClicked) {
    $('.popup-with-form').magnificPopup('open');
    alreadyClicked = true;
}

【讨论】:

  • string 的值是什么?我为什么要小心? (对不起 - 我知道这是个愚蠢的问题......但我是一个试图做代码的屋顶工 :)
  • @RoofingCalculator 我的意思是 sessionStorage 只能存储字符串类型的变量。如果您键入sessionStorage.foo = 3,则该值将转换为字符串然后保存。因此,如果您再次调用sessionStorage.foo,它将输出"3"(字符串),而不是3(数字)。
  • 太棒了,效果很好!请解释这个string 值是什么以及为什么我应该小心。第一种方式与第二种方式有何不同(除了如果以第二种方式重新加载分页,它将再次工作)
  • @RoofingCalculator 在第一种方式中,您将变量存储在 sessionStorage 中,因此一旦执行该行,它将存储它,并且假设 sessionStorage 只有在您 close 时才会重置浏览器,在您关闭并重新打开浏览器之前不会执行该行。在第二种方式中,您将变量保存在 window 对象上,该对象仅在页面会话期间存在,因此如果您关闭页面(而不是浏览器)并稍后重新打开它,该变量将不再存在并且代码行将被执行。
  • @MarcoBonelli 先在window 中检查sessionStorage 吗? undefined 在某些浏览器上?例如,sessionStorage = !!window.sessionStorage ? window.sessionStorage : {};if (window.sessionStorage != undefined) { // do stuff } else { window.sessionStorgae = {}; // do stuff with sessionStorage object } ?
【解决方案2】:

试试

编辑,v2

我读过 .one 但无法弄清楚 :( ...我实际上需要 它仅在按下 CALCULATE 按钮时运行一次。 – 屋顶 计算器

html

<!--  removed `action="javascript:GetInfo();"
              , accept-charset="UNKNOWN"
              , enctype="application/x-www-form-urlencoded" 
              , method="post"` 
      from `form` attributes -->
<form id="formcalc" style="text-align: left;">    
    <!-- changed `input` `type` to `button` -->
    <input name="calculate" type="button" value="Calculate" />
</form>

js

$("#formcalc > input[name='calculate']")
.one("click", function(e) {
  e.stopPropagation();
  GetInfo();
});

v1

$("a.popup-with-form").one("click", function(e) {
  // do stuff, once
  // i.e.g., 
  // `XmlHttp.onreadystatechange = StateChanged;` at `ShowSum()`
  $(e.target).remove(); // remove element when `click`ed once
});

jsfiddle http://jsfiddle.net/guest271314/7K3tn/

http://api.jquery.com/one/

【讨论】:

  • 我读到了.one,但无法弄清楚:( ...我实际上只需要在按下 CALCULATE 按钮时运行一次。
  • 张贴应达到要求。评论部分没有必须“做事”;作为 clicka 元素 () 调用 .magnificPopup()a 元素随后从 DOM 中删除,无法再次点击。为清楚起见,单击一次calculate 按钮时,删除附加功能,而不是Open POPUP? , 或两者 ?谢谢
  • Open Popup 是激活弹出窗口的链接(用于测试或其他目的)...我需要的是:单击Calculate 时,仅打开弹出窗口1 次。如果第二次单击Calculate,则不应打开弹出窗口。 Marco Bonelli 回答了这个问题 - 这正是我所需要的。
【解决方案3】:

请在下面使用。

禁用开启

如果窗口宽度小于此选项中的数字 - 将不会打开灯箱并且会触发元素的默认行为。设置为 0 以禁用行为。仅当您从 DOM 元素初始化 Magnific Popup 时,选项才有效。

也可以接受 Function 作为参数,如果可以打开灯箱,则返回 true,否则返回 false。例如:

disableOn: function() { if( $(condition) { return false; } return true; }

【讨论】:

  • 我一点也不明白。我需要弹出窗口才能工作。如果按下“计算”按钮,我只需要打开一次。将有另一种(常规)方式来激活弹出窗口。我理解它的方式 - 使用 JQuery 比设置窗口宽度更容易......
  • 那么你就可以使用cookies来做同样的stackoverflow.com/questions/16354301/…
猜你喜欢
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多