【发布时间】:2024-04-26 00:10:02
【问题描述】:
我用 jQuery 创建了一个滑块组件。现在我想实施 它作为一个插件,所以我可以在多个项目中使用它。
但是当我的滑块中有多个实例时我遇到了问题 HTML 表单。 如何检测用户正在使用哪个滑块实例?
我已阅读这些内容,但不知道该怎么做:
https://learn.jquery.com/plugins/basic-plugin-creation/
https://learn.jquery.com/plugins/advanced-plugin-concepts/
HTML:
<body>
<div id="myslider" style="position: absolute; top:20px; left:20px;"></div>
<div id="myslider2" style="position: absolute; top:200px; left:200px;"></div>
<script>
$("#myslider").vslider();
$("#myslider2").vslider();
</script>
CSS:
.slider_holder{
height: 3px;
width: 300px;
position: absolute;
float: left;
left: 0px;
top: 0px;
background-color: #C2C2C2;
border-radius: 3px;
}
.slider_holder span{
height: 5px;
position: absolute;
width: 100%;
top: -1px;
background-color: #FF5A5F;
left: 0px;
}
.slider_holder div{
width: 16px;
height: 16px;
border-radius: 50%;
border: solid 1px #333;
background-color: #fff;
position: absolute;
top: -8px;
cursor: pointer;
}
.slider_holder #fpoint{
left: 0px;
}
.slider_holder_right_slider{
right: 0px;
}
jQuery 插件文件:
(function( $ ){
$.fn.vslider = function() {
var el = "";
var timer_handle;
var currentMousePos = { x: -1, y: -1 };
var min_val = 50000;
var max_val = 1000000;
var from_val = 0;
var to_val = 0;
var container;
container = "#" + this.prop("id");
this.html('<div class="slider_holder">'+
'<span></span>'+
'<div id="fpoint" ondragstart="return false;" title="" data-value=""></div>'+
'<div id="tpoint" ondragstart="return false;" title="" data-value="" class="slider_holder_right_slider"></div>'+
'</div>');
$(".slider_holder div").on( "mousedown", function( event ) {
el = $(this).prop("id");
timer_handle = setInterval(function(){slider_timer();}, 50);
});
$( document ).on( "mouseup", function( event ) {
el = "";
clearInterval(timer_handle);
});
$( document ).on( "mousemove", function( event ) {
currentMousePos.x = event.pageX;
currentMousePos.y = event.pageY;
});
function slider_timer() {
if (el != ""){
$("#" + el).css("left", currentMousePos.x - $(".slider_holder").offset().left - 10 + "px");
if ($("#fpoint").position().left + $("#fpoint").width() > $("#tpoint").position().left){
if (el == "fpoint")
$("#fpoint").css("left", $("#tpoint").position().left - $("#tpoint").width() - 2 + "px"); else
$("#tpoint").css("left", $("#fpoint").position().left + $("#fpoint").width() + 2 + "px");
}
if ($("#" + el).position().left < 0) $("#" + el).css("left", "0px");
if ($("#" + el).position().left + $("#" + el).width() > $(".slider_holder").width())
$("#" + el).css("left", $(".slider_holder").width() - $("#" + el).width() + "px");
console.log(container);
$(container + " .slider_holder span").css("visibility", "visible");
$(container + " .slider_holder span").css("left", $("#fpoint").position().left + "px");
$(container + " .slider_holder span").css("width", $("#tpoint").position().left - $("#fpoint").position().left + "px");
from_val = parseInt((($("#fpoint").position().left / $(".slider_holder").width()) * max_val) + min_val);
to_val = parseInt(((($("#tpoint").position().left + $("#tpoint").width()) / $(".slider_holder").width()) * max_val) + min_val);
if (to_val > max_val) to_val = max_val;
if (from_val < min_val) from_val = min_val;
console.log(from_val + ', ' + to_val);
//$("#fpoint").prop("title", from_val);
//$("#tpoint").prop("title", to_val);
}
}
return this;
};
})( jQuery );
【问题讨论】:
-
插件应该绑定到元素上。您应该根据上下文访问/构建它。问题是您在插件中使用选择器,而不是存储变量来包含绑定元素。您应该使用a boilerplate 来构造您的插件,然后使用
$element等访问绑定的元素。 -
@Liam 感谢您的解决方案。太棒了。我设法创建了插件。请提交您的评论作为答案,我会接受它作为“最佳答案”。
标签: jquery html css jquery-plugins