无法使用 jQuery.each 循环使 class 中的单个 div 可拖动
Unable to make individual divs in class draggable using jQuery .each loop
问题概述:
我正在创建圆形 div 元素作为地图上的位置标记。我的代码从数据库中读取总行数 table 并执行一个循环来创建该数量的 div 元素,使用从数据库返回的数据为每个元素分配一个 div id。每个 div 元素都附加到单个 div class (marker_mother)。所有这一切都完美无缺,在页面上产生了一行圆形 div 元素。
下一步是使每个 individual div 元素都可以拖动。我正在使用 .each() jQuery method to loop through all div elements in the class (marker_mother) and set them to draggable using the Draggable interaction from the jQuery UI. I have been using the following Stack Overflow Q&A as a reference: jQuery to loop through elements with the same class。但是,我所有的尝试都导致 class 被设置为可拖动,而不是 individual divs。这意味着所有 div 在拖动时作为一个统一的整体响应。
代码:
var total_units = "";
$(document).ready(function() {
// Triggers PHP script to return number of table rows from DB
$('#get_rows').click(function() {
$.get('get_coords.php', function(data) {
total_units = data;
console.log(data);
});
});
// Posts row number to DB and returns query data (eg. id and colour)
// Uses returned data in construction of circular div elements
$('#create_divs').click(function() {
for (i = 0; i < total_units; i++) {
$.ajax({
type: 'POST',
url: 'get_row.php',
dataType: 'html',
data: {
row: i
},
success: function(response) {
var jsonData = JSON.parse(response);
jQuery('<div/>', {
id: jsonData.id,
css: {
"position": "relative",
"top": "200",
"left": "100",
"border-radius": "50%",
"width": "100px",
"height": "100px",
"background": "jsonData.colour",
"font-size": "20px",
"text-align": "center",
"line-height": "100px",
"cursor": "move",
"z-index": "100"
},
href: 'http://127.0.0.1/' + jsonData.id + '.html',
text: jsonData.id
}).appendTo('.marker_mother');
console.log(response);
}
});
}
});
// Assigns top&left positions of dragged div to variables
// Code to store coords in db will be added later
var coordinates = function(element) {
element = $(element);
var top = element.position().top;
var left = element.position().left;
}
// Loops through divs and makes each draggable
$('.marker_mother').each(function(index, item) {
$(item).draggable({
start: function() {
coordinates(item);
},
stop: function() {
coordinates(item);
}
});
});
});
/* CSS to define characteristics for the marker div class */
.marker_mother {
position: relative;
top: 0;
left: 0;
border-radius: 50%;
width: 50px;
height: 50px;
font-size: 10px;
text-align: center;
color: black;
line-height: 50px;
cursor: move;
z-index: 100;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script>
如概述中所述,我尝试了 .each()
函数的多种实现以使 divs 可拖动(包括引用 DOM 对象和 $(this)
).所有尝试都会导致 class (marker_mother
) 被设置为可拖动,而不是 individual divs。我觉得这里肯定缺少一些简单的东西。
如有任何想法或建议,我们将不胜感激。
编辑:
HTML 创建的 div 标记最终如下所示:
<div class="marker_mother ui-draggable ui-draggable-handle"> == [=15=]
<div id="0001" href="http://127.0.0.1/0001.html" style="position: relative; border-radius: 50%; width: 100px; height: 100px; background: lime; font-size: 20px; text-align: center; line-height: 100px; cursor: move; z-index: 100;">0001</div>
<div id="0002" href="http://127.0.0.1/0002.html" style="position: relative; border-radius: 50%; width: 100px; height: 100px; background: lime; font-size: 20px; text-align: center; line-height: 100px; cursor: move; z-index: 100;">0002</div>
<div id="0003" href="http://127.0.0.1/0003.html" style="position: relative; border-radius: 50%; width: 100px; height: 100px; background: lime; font-size: 20px; text-align: center; line-height: 100px; cursor: move; z-index: 100;">0003</div>
</div>
解决方案:
haydenwagner 在下面的回答中提供了解决方案。
$('.marker_mother div').each(function(index, item) {
在我看来,您正在影响 marker_mother 元素而不是其子元素(您附加的 div)。
尝试更改此代码:
$('.marker_mother').each(function(index, item) {
对此:
$('.marker_mother div').each(function(index, item) {
这样您在每个函数中设置为可拖动的元素就是 .marker_mother 元素中的 div。
如果可行,那么您可以向这些 div 添加 '.marker' 或 '.'marker-draggable' class 以便您的选择更加明确(使用上面的代码,所有 div 都在里面'.marker_mother' 将变为可拖动)。如果您只是将可拖动元素附加到“.marker_mother”元素,则可能没有必要这样做。
问题是您使用 class marker_mother
而不是子元素来遍历所有元素。但在这种情况下,您不需要 $.each()
循环。
只需调整您的选择器,draggable
即可处理其余部分:
// Assigns top&left positions of dragged div to variables
// Code to store coords in db will be added later
var coordinates = function(element) {
var top = element.position().top;
var left = element.position().left;
}
// Loops through divs and makes each draggable
$('.marker_mother div').draggable({
start: function() {
coordinates($(this));
},
stop: function() {
coordinates($(this));
}
});
问题概述:
我正在创建圆形 div 元素作为地图上的位置标记。我的代码从数据库中读取总行数 table 并执行一个循环来创建该数量的 div 元素,使用从数据库返回的数据为每个元素分配一个 div id。每个 div 元素都附加到单个 div class (marker_mother)。所有这一切都完美无缺,在页面上产生了一行圆形 div 元素。
下一步是使每个 individual div 元素都可以拖动。我正在使用 .each() jQuery method to loop through all div elements in the class (marker_mother) and set them to draggable using the Draggable interaction from the jQuery UI. I have been using the following Stack Overflow Q&A as a reference: jQuery to loop through elements with the same class。但是,我所有的尝试都导致 class 被设置为可拖动,而不是 individual divs。这意味着所有 div 在拖动时作为一个统一的整体响应。
代码:
var total_units = "";
$(document).ready(function() {
// Triggers PHP script to return number of table rows from DB
$('#get_rows').click(function() {
$.get('get_coords.php', function(data) {
total_units = data;
console.log(data);
});
});
// Posts row number to DB and returns query data (eg. id and colour)
// Uses returned data in construction of circular div elements
$('#create_divs').click(function() {
for (i = 0; i < total_units; i++) {
$.ajax({
type: 'POST',
url: 'get_row.php',
dataType: 'html',
data: {
row: i
},
success: function(response) {
var jsonData = JSON.parse(response);
jQuery('<div/>', {
id: jsonData.id,
css: {
"position": "relative",
"top": "200",
"left": "100",
"border-radius": "50%",
"width": "100px",
"height": "100px",
"background": "jsonData.colour",
"font-size": "20px",
"text-align": "center",
"line-height": "100px",
"cursor": "move",
"z-index": "100"
},
href: 'http://127.0.0.1/' + jsonData.id + '.html',
text: jsonData.id
}).appendTo('.marker_mother');
console.log(response);
}
});
}
});
// Assigns top&left positions of dragged div to variables
// Code to store coords in db will be added later
var coordinates = function(element) {
element = $(element);
var top = element.position().top;
var left = element.position().left;
}
// Loops through divs and makes each draggable
$('.marker_mother').each(function(index, item) {
$(item).draggable({
start: function() {
coordinates(item);
},
stop: function() {
coordinates(item);
}
});
});
});
/* CSS to define characteristics for the marker div class */
.marker_mother {
position: relative;
top: 0;
left: 0;
border-radius: 50%;
width: 50px;
height: 50px;
font-size: 10px;
text-align: center;
color: black;
line-height: 50px;
cursor: move;
z-index: 100;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script>
如概述中所述,我尝试了 .each()
函数的多种实现以使 divs 可拖动(包括引用 DOM 对象和 $(this)
).所有尝试都会导致 class (marker_mother
) 被设置为可拖动,而不是 individual divs。我觉得这里肯定缺少一些简单的东西。
如有任何想法或建议,我们将不胜感激。
编辑:
HTML 创建的 div 标记最终如下所示:
<div class="marker_mother ui-draggable ui-draggable-handle"> == [=15=]
<div id="0001" href="http://127.0.0.1/0001.html" style="position: relative; border-radius: 50%; width: 100px; height: 100px; background: lime; font-size: 20px; text-align: center; line-height: 100px; cursor: move; z-index: 100;">0001</div>
<div id="0002" href="http://127.0.0.1/0002.html" style="position: relative; border-radius: 50%; width: 100px; height: 100px; background: lime; font-size: 20px; text-align: center; line-height: 100px; cursor: move; z-index: 100;">0002</div>
<div id="0003" href="http://127.0.0.1/0003.html" style="position: relative; border-radius: 50%; width: 100px; height: 100px; background: lime; font-size: 20px; text-align: center; line-height: 100px; cursor: move; z-index: 100;">0003</div>
</div>
解决方案:
haydenwagner 在下面的回答中提供了解决方案。
$('.marker_mother div').each(function(index, item) {
在我看来,您正在影响 marker_mother 元素而不是其子元素(您附加的 div)。
尝试更改此代码:
$('.marker_mother').each(function(index, item) {
对此:
$('.marker_mother div').each(function(index, item) {
这样您在每个函数中设置为可拖动的元素就是 .marker_mother 元素中的 div。
如果可行,那么您可以向这些 div 添加 '.marker' 或 '.'marker-draggable' class 以便您的选择更加明确(使用上面的代码,所有 div 都在里面'.marker_mother' 将变为可拖动)。如果您只是将可拖动元素附加到“.marker_mother”元素,则可能没有必要这样做。
问题是您使用 class marker_mother
而不是子元素来遍历所有元素。但在这种情况下,您不需要 $.each()
循环。
只需调整您的选择器,draggable
即可处理其余部分:
// Assigns top&left positions of dragged div to variables
// Code to store coords in db will be added later
var coordinates = function(element) {
var top = element.position().top;
var left = element.position().left;
}
// Loops through divs and makes each draggable
$('.marker_mother div').draggable({
start: function() {
coordinates($(this));
},
stop: function() {
coordinates($(this));
}
});