社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Jquery

允许在函数和included-each循环中使用jquery$(this)选择器两次吗?

Jimbo Jambo • 6 年前 • 1855 次点击  

我有一个列表,其中包含x列数据。单击行中的编辑按钮时,我想设置此行每列的html内容,该列在数组中有一个name属性,该键由columns name attributes值命名。

data['id']   = '123';
data['name'] = 'John Doe';
data['city'] = 'Arlington';

为此,我在edit div上启动了一个click事件。在这个函数中,我使用$(this)选择器在所有具有name属性的元素上设置一个each()循环。 在这个循环中,我再次用$(this)选择器捕获每个匹配元素的名称和值。

所以,我的问题是:尽管它有效——它允许这样做吗?在同一个函数中为两个不同的对象使用$(this)? 有别的办法吗?

这是我的工作示例代码

$( document ).ready(function() {
    $(document).on( "click", ".edit", function() {
      var data = {};
      
      $(this).closest('.row').children('div[name]').each(function() {
        //form_data.append($(this).attr('name'), $(this).html());
        data[$(this).attr('name')] = $(this).html();
      });
      
      $('#result').html(JSON.stringify(data, null, 4));

    });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="row">
<div name="id">123</div>
<div name="name">John Doe</div>
<div name="city">Berlin</div>
<div class="edit">> edit <</div>
</div>
<br clear="all">
<div id="result"></div>
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43930
文章 [ 3 ]  |  最新文章 6 年前
apple apple
Reply   •   1 楼
apple apple    7 年前

没有错,你所做的只是

function setDivs() {
  //form_data.append($(this).attr('name'), $(this).html());
  data[$(this).attr('name')] = $(this).html();
}

function docClick(){
    var data = {};
    $(this).closest('.row').children('div[name]').each(setDivs);
    $('#result').html(JSON.stringify(data, null, 4));
}

function docReady(){
  $(document).on( "click", ".edit", docClick)
}

$( document ).ready(docReady);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="row">
<div name="id">123</div>
<div name="name">John Doe</div>
<div name="city">Berlin</div>
<div class="edit">> edit <</div>
</div>
<br clear="all">
<div id="result"></div>
Nguyên Ngô Duy
Reply   •   2 楼
Nguyên Ngô Duy    7 年前

试试这个技巧:

$( document ).ready(function() {
    $(document).on( "click", ".edit", function() {
      var data = {};
      var that = this; // trick here
      $(this).closest('.row').children('div[name]').each(function() {
        //form_data.append($(this).attr('name'), $(this).html());
        data[$(this).attr('name')] = $(that).html();// replace this = that if you want to get parent element
      });

      $('#result').html(JSON.stringify(data, null, 4));

    });
});
freedomn-m
Reply   •   3 楼
freedomn-m    7 年前

允许吗?

当然,这很管用。

取决于你所说的“允许”是什么意思。

  • 是不是让人困惑——也许吧。
  • 它能引起问题吗?

(有很多关于这个的问题或者由这个引起的问题证实了它引起了问题)。

重用变量名(在本例中为“this”)是常见的,并且基于 范围 .

很难判断您是否有bug,因为您实际上需要“.edit”html或“.edit”attr,而不是 div 所以你可以通过复制来消除混乱 this 对于变量:

$(document).on( "click", ".edit", function() {
  var data = {};
  var btn = $(this);  // the button that was clicked

  btn.closest('.row').children('div[name]').each(function() {

    // Do you mean the div or did you really mean the clicked button?
    data[$(this).attr('name')] = $(this).html();  

    var div = $(this);  // the child div

    // clearly not what is desired
    // `btn` variable referring to the outer `this`
    data[div.attr('name')] = btn.html();  

    // intention clear
    data[div.attr('name')] = div.html();  
  });

  $('#result').html(JSON.stringify(data, null, 4));

});

在本例中,它是“清晰的”,因为您不会在所有数据条目上使用btn html(或者您会这样做吗?我不知道你的要求……。所以“不太可能”。

但是,很容易看出,在另一种情况下,你会如何引用被点击的内容。 btn==this 在嵌套的内部 .each .