在jQuery中替换变量时,将继续使用先前的值

pb3s4cty  于 2023-06-05  发布在  jQuery
关注(0)|答案(2)|浏览(236)

我有下一个默认显示“买入”值的输入

<input class="myVar" data-buy="50000" data-sell="80000" value="5000" />
    <button id="change">CHANGE PRICES</button>
    <button id="toggle">TOGGLE</button>

我点击“#change”是为了增加“买入”和“卖出”的数量

$(document).on("click", #change", function(){
         $(".myVar").attr("data-buy",6000);
         $(".myVar").attr("data-sell",9000);
      
     });

现在,如果我切换“myVar”中显示的值,输入将恢复为默认值。

$("#toggle").toggle(
     function(){
   
       $(".myVar").val($(".myVar").data("buy"));
       },
      function(){ 
      $(".myVar").val($(".myVar").data("sell"));
      }

      );

我做错了什么?
我知道需要在DOM上设置变量,
我尽力了

$(document).on("click", ".change", function(){
         $(".myVar").attr("data-buy",6000);
         $(".myVar").attr("data-sell",9000);
                    $("#toggle").click()
      
     });

但它改变了行为,但它仍然显示初始值。

pu3pd22g

pu3pd22g1#

删除$(...).data并使用$(...).attr("data-type",...)
我就是这么做的

$(document).ready(function(){
  // CHANGE PRICES click
  $("#change").click(function(){
    $(".myVar").attr("data-buy",6000);
         $(".myVar").attr("data-sell",9000);
  });
  
  // toggle click
  $("#toggle").click(function(){
    if($(this).attr("data-type") === 'buy'){
        $(".myVar").val($(".myVar").attr("data-buy"));
        $(this).attr("data-type",'sell');
    }else{
        $(".myVar").val($(".myVar").attr("data-sell"));
        $(this).attr("data-type",'buy');
    }
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input class="myVar" data-buy="50000" data-sell="80000" value="50000" />
    <button id="change">CHANGE PRICES</button>
    <button data-type="sell" id="toggle">TOGGLE</button>
k5ifujac

k5ifujac2#

你的代码中有一些问题。
第一个是你在你的环境中唯一的问题,我想。Using .data() is the correct way来访问和操作数据属性,但我注意到您的代码混合使用.data().attr()来访问相同的值,例如:

$(".myVar").attr("data-buy",6000);

和/或

$(".myVar").val($(".myVar").data("buy"));

将使用.attr()的情况替换为始终使用.data(),这是让代码按照您所描述的那样工作所需的全部内容(对于旧版本的jQuery,请参阅下一项)。下面是一个使用jQuery 1.8的工作片段。

$(document).on("click", "#change", function() {
  $(".myVar").data("buy", 6000);
  $(".myVar").data("sell", 9000);
});

$("#toggle").toggle(
  function() {
    $(".myVar").val($(".myVar").data("buy"));
  },
  function() {
    $(".myVar").val($(".myVar").data("sell"));
  }
);
<script src="https://code.jquery.com/jquery-1.8.0.min.js"></script>
<input class="myVar" data-buy="50000" data-sell="80000" value="5000" />
<button id="change">CHANGE PRICES</button>
<button id="toggle">TOGGLE</button>

第二个问题与.toggle()有关。在旧版本的jQuery中,有一个toggle() event handler,但它很久以前就被弃用了(在2012年的1.8版本中!假设你使用的是jQuery的一个旧版本,它仍然可以工作,但是仅仅出于安全原因,你可能应该升级。
在任何不到10年的jQuery版本中,.toggle() will show or hide an element。在您的代码中,这意味着切换按钮在页面加载时立即消失。下面是上面代码片段的一个副本,只是为了使用当前版本的jQuery而进行了更改,这说明了这一点。

$(document).on("click", "#change", function() {
  $(".myVar").data("buy", 6000);
  $(".myVar").data("sell", 9000);
});

$("#toggle").toggle(
  function() {
    $(".myVar").val($(".myVar").data("buy"));
  },
  function() {
    $(".myVar").val($(".myVar").data("sell"));
  }
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input class="myVar" data-buy="50000" data-sell="80000" value="5000" />
<button id="change">CHANGE PRICES</button>
<button id="toggle">TOGGLE</button>

如果升级jQuery,也需要更新这段代码。您真正需要的只是一个单击处理程序AFAICT,以触发显示其中一个值。问题是您需要跟踪当前显示的是哪一个,以便在单击按钮时可以显示另一个。也许我们可以在输入上使用另一个data属性来跟踪当前正在显示的内容,例如:

<input class="myVar" data-showing="buy" ...

然后,当您单击切换按钮时,您可以检查当前显示的是哪个,加载并显示另一个,然后更新该属性以保存当前状态。注意,我们需要一个额外的case来处理初始状态,当显示的值既不是买入值也不是卖出值时(我不确定这只是一个输入错误还是实际需要)。
下面是一个例子:

$(document).on("click", "#change", function () {
    $(".myVar").data("buy", 6000);
    $(".myVar").data("sell", 9000);
});

$("#toggle").on('click', function () {
    let val = '';
    let showing = $(this).data('showing');
    
    // Handle both buy case and initial case when displayed value is neither sell or buy value
    if (showing === 'buy' || showing === '') {
        val = $(".myVar").data("sell");
        showing = 'sell';
    } else {
        val = $(".myVar").data("buy");
        showing = 'buy';
    }
    
    $(".myVar").val(val);
    $(this).data('showing', showing);
});
<script src="https://code.jquery.com/jquery-1.8.0.min.js"></script>
<input class="myVar" data-showing="" data-buy="50000" data-sell="80000" value="5000" />
<button id="change">CHANGE PRICES</button>
<button id="toggle">TOGGLE</button>

相关问题