【问题标题】:object created inside jQuery 'click' persists even though a new one is created即使创建了一个新对象,在 jQuery 'click' 中创建的对象仍然存在
【发布时间】:2017-02-24 23:37:15
【问题描述】:

对 JQuery 来说非常新,所以我的代码可能不是最好的方法,所以提示会很好......

但问题在于,在 click 函数中创建的 reqObj 似乎从未被解除。如果函数通过并且我 console.log 对象我得到了新创建的对象和所有以前创建的对象。我尝试将对象放在函数之外,但这不起作用。我确信这是一个快速修复。感谢您的帮助。

附: div 是基于传入数据在 javascript 中动态创建的

$(document).on('click', '.profileDiv', function(){
    var outer = this;
    $("#myModal").modal('toggle');
    $('#headerModal').text('Would like to request a session with ' + $(outer).find('#pro_first_name').text());
    $(document).on('click', '#modalRequest', function(){
      var reqObj = {};
      reqObj = {
        pro_id : $(outer).attr('id'),
      }
      console.log(reqObj);
    });
});

【问题讨论】:

  • 嵌套事件是一种不好的做法,尤其是如果您不以某种方式解除嵌套事件的绑定。在这里,每次单击.profileDiv 时,都会在#modalRequest 上绑定一个新的单击事件,而不会取消绑定任何先前的单击事件。无论如何,绝对没有理由将委托事件嵌套到document 级别。对你有用的是:$(document).off('click','#modalRequest').on('click', '#modalRequest', function(){...});。但就像说的那样,这只是不好的做法
  • $(outer).attr('id') === outer.id

标签: javascript jquery html scope this


【解决方案1】:

您不应该真正在另一个事件回调中绑定和事件,并且当您使用事件委托时,您实际上并不需要这样做。您要做的是将数据从一个事件的回调传递到另一个事件。

您可以通过使用所有函数都可以访问的全局变量来实现这一点,但是这是一种反模式,因为它可以随时通过任何代码进行更改。

jQuery 为您提供了一种更好的方法,可以将元数据附加到元素,这样您就可以使用 jQuery.fn.data 轻松传输或存储状态,这比使用全局变量要好得多。

$.fn.modal = function(){}

$(document).on('click', '.profileDiv', function() {
  var outer = this;
  $("#myModal")
    .data('reqObj', {
      pro_id : $(outer).attr('id'),
    })
    .modal('toggle');
  
  $('#headerModal').text(
    'Would like to request a session with ' +            
    $(outer).find('#pro_first_name').text()
  );
});

$(document).on('click', '#modalRequest', function(){
  console.log($("#myModal").data());
});

$(document).on('keyup', '#messageReq', function(e){
  var $modal = $('#myModal')
  // get the data
  var data = $modal.data()
  // assign the text field value to the data
  data.msg = this.value
  // reset the data on the modal element
  $modal.data(data)
})
.profileDiv,
#modalRequest {
  width: 200px;
  height: 200px;
  background: #bada55;
  float: left;
  margin: .5em;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="profileDiv" id="myModal">profileDiv</div>
<div id="modalRequest">
  modalRequest
  <input id="messageReq" 
    type="text" 
    name="messageRequest" 
    placeholder="Present yourself" />
</div>

【讨论】:

  • 效果很好,我觉得这已经比你说的 global 更好了。我理解得很好,但是当我记录对象时,我得到了输入的数据,还有bs.modal: c,看起来这只是对数据来源​​的引用。可以忽略这一点并继续前进吗? (在modal前面添加了.
  • 它在 stacksn-p 中为我工作,你确定没有另一个错误吗?
  • 如果你仍然得到这个,真的很快!模态框内有一个input 框,我试图将其添加到数据中的对象中。在创建 data.fn 时这样做在模态正确关闭时不起作用,但是当您在任何其他 div 上再次打开它时,您会看到那里的消息并将其保存并传递到 data.fn 的对象中。这是为什么呢?
  • 哦,代码运行良好,就在我记录它时,我也得到了这就是我得到的 Object {pro_id: "7", bs.modal: c} 并且最后插入的对象看起来只是详细说明了 data.fn 的来源。只是想知道这是否正常,可以忽略吗?
  • 模态插件可能使用相同的方法来存储有关其状态的一些数据。您可以忽略它,并且可能不应该修改它,因为它可能会导致模态插件出现问题。
猜你喜欢
  • 1970-01-01
  • 2021-02-23
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
相关资源
最近更新 更多