如何在 javascript 附加字段上使用可拖动?
how to use draggable on javascript appended fields?
我正在使用 Jquery 可拖动来创建创建输入的应用程序的一部分,输入必须是可拖动的,在下面的项目 (jsfiddle) 中,您会看到只有创建的字段不可拖动,但直接添加到 html 中的那个有效,为什么?
https://jsfiddle.net/vtsjwb63/
html :
<div class="input_fields_wrap">
<button class="add_field_button">Add More Fields</button>
<div class="draggable ui-widget-content">
<input type="text" name="mytext[]"/>
<a href="#" class="remove_field">x</a>
</div>
</div>
javascript :
$(document).ready(function() {
var max_fields = 10; //maximum input boxes allowed
var wrapper = $(".input_fields_wrap"); //Fields wrapper
var add_button = $(".add_field_button"); //Add button ID
var x = 1; //initlal text box count
$(add_button).click(function(e){ //on add input button click
e.preventDefault();
if(x < max_fields){ //max input box allowed
x++; //text box increment
$(wrapper).append(''
+ '<div class="draggable ui-widget-content added">'
+ '<p>not draggable anymore, why ?</p>'
+ '<input type="text" name="mytext[]"/>'
+ '<a href="#" class="remove_field">x</a>'
+ '</div>'
); //add input box
}
});
$(wrapper).on("click",".remove_field", function(e){ //user click on remove text
e.preventDefault(); $(this).parent('div').remove(); x--;
})
$( ".draggable" ).draggable({ grid: [ 5, 5 ], snap: true });
});
我该如何解决?
问题是因为您仅在页面加载时对 DOM 中的元素实例化 draggable()
。要使新元素可拖动,您需要在将它们附加到 DOM 后对它们调用 draggable。试试这个:
var max_fields = 10; // maximum input boxes allowed
var wrapper = $(".input_fields_wrap");
var add_button = $(".add_field_button");
var draggableOptions = { grid: [ 5, 5 ], snap: true }
$(add_button).click(function(e) {
e.preventDefault();
if (wrapper.find('.draggable').length < max_fields) {
$('<div class="draggable ui-widget-content added">'
+ '<p>not draggable anymore, why ?</p>'
+ '<input type="text" name="mytext[]"/>'
+ '<a href="#" class="remove_field">x</a>'
+ '</div>').appendTo(wrapper).draggable(draggableOptions); // < important change here
}
});
$(wrapper).on("click", ".remove_field", function(e) {
e.preventDefault();
$(this).parent('div').remove();
})
$(".draggable").draggable(draggableOptions);
您需要做的就是将点击事件与可拖动对象相关联。
$(document).ready(function() {
var max_fields = 10; //maximum input boxes allowed
var wrapper = $(".input_fields_wrap"); //Fields wrapper
var add_button = $(".add_field_button"); //Add button ID
var x = 1; //initlal text box count
$(add_button).click(function(e){ //on add input button click
e.preventDefault();
if(x < max_fields){ //max input box allowed
x++; //text box increment
$(wrapper).append(''
+ '<div class="draggable ui-widget-content added">'
+ '<p>not draggable anymore, why ?</p>'
+ '<input type="text" name="mytext[]"/>'
+ '<a href="#" class="remove_field">x</a>'
+ '</div>'
); //add input box
}
});
$(wrapper).on("click",".remove_field", function(e){ //user click on remove text
e.preventDefault(); $(this).parent('div').remove(); x--;
})
$('.add_field_button').click(function(){
$( ".draggable" ).draggable({ grid: [ 5, 5 ], snap: true });
});
})
.draggable {padding:30px; background:red; width:200px; cursor:pointer;}
.added {background:yellow;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script
src="https://code.jquery.com/ui/1.12.0/jquery-ui.js"
integrity="sha256-0YPKAwZP7Mp3ALMRVB2i8GXeEndvCq3eSl/WsAl1Ryk="
crossorigin="anonymous"></script>
<div class="input_fields_wrap">
<button class="add_field_button">Add More Fields</button>
<div class="draggable ui-widget-content">
<input type="text" name="mytext[]"/>
<a href="#" class="remove_field">x</a>
</div>
</div>
我正在使用 Jquery 可拖动来创建创建输入的应用程序的一部分,输入必须是可拖动的,在下面的项目 (jsfiddle) 中,您会看到只有创建的字段不可拖动,但直接添加到 html 中的那个有效,为什么?
https://jsfiddle.net/vtsjwb63/
html :
<div class="input_fields_wrap">
<button class="add_field_button">Add More Fields</button>
<div class="draggable ui-widget-content">
<input type="text" name="mytext[]"/>
<a href="#" class="remove_field">x</a>
</div>
</div>
javascript :
$(document).ready(function() {
var max_fields = 10; //maximum input boxes allowed
var wrapper = $(".input_fields_wrap"); //Fields wrapper
var add_button = $(".add_field_button"); //Add button ID
var x = 1; //initlal text box count
$(add_button).click(function(e){ //on add input button click
e.preventDefault();
if(x < max_fields){ //max input box allowed
x++; //text box increment
$(wrapper).append(''
+ '<div class="draggable ui-widget-content added">'
+ '<p>not draggable anymore, why ?</p>'
+ '<input type="text" name="mytext[]"/>'
+ '<a href="#" class="remove_field">x</a>'
+ '</div>'
); //add input box
}
});
$(wrapper).on("click",".remove_field", function(e){ //user click on remove text
e.preventDefault(); $(this).parent('div').remove(); x--;
})
$( ".draggable" ).draggable({ grid: [ 5, 5 ], snap: true });
});
我该如何解决?
问题是因为您仅在页面加载时对 DOM 中的元素实例化 draggable()
。要使新元素可拖动,您需要在将它们附加到 DOM 后对它们调用 draggable。试试这个:
var max_fields = 10; // maximum input boxes allowed
var wrapper = $(".input_fields_wrap");
var add_button = $(".add_field_button");
var draggableOptions = { grid: [ 5, 5 ], snap: true }
$(add_button).click(function(e) {
e.preventDefault();
if (wrapper.find('.draggable').length < max_fields) {
$('<div class="draggable ui-widget-content added">'
+ '<p>not draggable anymore, why ?</p>'
+ '<input type="text" name="mytext[]"/>'
+ '<a href="#" class="remove_field">x</a>'
+ '</div>').appendTo(wrapper).draggable(draggableOptions); // < important change here
}
});
$(wrapper).on("click", ".remove_field", function(e) {
e.preventDefault();
$(this).parent('div').remove();
})
$(".draggable").draggable(draggableOptions);
您需要做的就是将点击事件与可拖动对象相关联。
$(document).ready(function() {
var max_fields = 10; //maximum input boxes allowed
var wrapper = $(".input_fields_wrap"); //Fields wrapper
var add_button = $(".add_field_button"); //Add button ID
var x = 1; //initlal text box count
$(add_button).click(function(e){ //on add input button click
e.preventDefault();
if(x < max_fields){ //max input box allowed
x++; //text box increment
$(wrapper).append(''
+ '<div class="draggable ui-widget-content added">'
+ '<p>not draggable anymore, why ?</p>'
+ '<input type="text" name="mytext[]"/>'
+ '<a href="#" class="remove_field">x</a>'
+ '</div>'
); //add input box
}
});
$(wrapper).on("click",".remove_field", function(e){ //user click on remove text
e.preventDefault(); $(this).parent('div').remove(); x--;
})
$('.add_field_button').click(function(){
$( ".draggable" ).draggable({ grid: [ 5, 5 ], snap: true });
});
})
.draggable {padding:30px; background:red; width:200px; cursor:pointer;}
.added {background:yellow;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script
src="https://code.jquery.com/ui/1.12.0/jquery-ui.js"
integrity="sha256-0YPKAwZP7Mp3ALMRVB2i8GXeEndvCq3eSl/WsAl1Ryk="
crossorigin="anonymous"></script>
<div class="input_fields_wrap">
<button class="add_field_button">Add More Fields</button>
<div class="draggable ui-widget-content">
<input type="text" name="mytext[]"/>
<a href="#" class="remove_field">x</a>
</div>
</div>