确定特定DOM对象是否实际上是滑块对象

时间:2016-08-07 14:03:00

标签: javascript jquery html jquery-mobile slider

我正在使用JQuery slider并且效果很好,但是对于特定的函数,我需要找到一个特定的对象是滑块,如果是这样我想执行一些特定的代码。

我的HTML表单中的滑块名为mySlider。我希望能够做到这样的事情:

if($("#mySlider").type() === "slider") {
    alert("Yes, a slider it is");
}
else {
    alert("No, this is not a slider :(");
}

我测试过.type(),. is(" slider"),. is(" rangeslider"),. is("输入:滑块" ),。role(),但它们似乎都不能满足我的需要。

3 个答案:

答案 0 :(得分:2)

这里通常的解决方案是,如果插件没有公开一个方法(这是非常罕见的)是寻找插件添加到元素的东西。在这种情况下,它看起来很像添加ui-slider-input类。所以:

if ($("#mySlider").hasClass("ui-slider-input")) {
    // Yes
} else {
    // No
}

答案 1 :(得分:1)

测试所有选定元素是否为jQuery Mobile滑块

作为T.J. Crowder has mentioned,最佳解决方案是API明确公开方法以进行此确定。不幸的是,jQuery Mobile没有公开滑块的特定检测方法。但是,它们确实暴露了一种可用于此目的的方法。

虽然它没有明确的意图,但option()方法可用于确定元素是否是jQuery Mobile滑块。如果元素是jQuery Mobile滑块,则返回一个对象。如果它不是jQuery Mobile滑块,或者尚未 jQuery Mobile滑块,则会抛出错误。

在下面的代码中,在声明了selectorisMobileSlider()的测试函数之后,生成了大量的控制台输出,以验证document之前的测试用例准备就绪$(document).ready()

function isMobileSlider(selector){
    try{
        var toReturn=false;
        $(selector).each(function(){ //may have a collection
            if($(this).is('input')){
                //slider('option') can return an object for a random selector, so
                //  we must test that this is an <input>.
                $(this).slider('option');  //Does not throw if implicitly iterated.
                toReturn=true;
            }else{
                toReturn=false; //Instead, could just throw here, as we already catch
                return false; //Exit each()
            }
        });
        return toReturn;
    }catch(e){
        return false;
    }
}
function logResults(when){
    console.log('#mySlider is a jQuery Mobile slider' + when + ':' 
                + isMobileSlider('#mySlider'));                      //true after ready
    console.log('#slider-2 is a jQuery Mobile slider' + when + ':' 
                + isMobileSlider('#slider-2'));                      //true after ready
    console.log('#slider-3 is a jQuery Mobile slider' + when + ':' 
                + isMobileSlider('#slider-3'));                      //false
    console.log('All <input> are jQuery Mobile sliders' + when + ':' 
                + isMobileSlider('input'));                          //false
    console.log('All jQuery Mobile sliders' + when + ':' 
                + isMobileSlider('#mySlider,#slider-2'));            //true after ready
}
logResults(' (immediate)');
$( document ).ready(function(){
    logResults(' (on ready)');
});
<link rel="stylesheet" 
      href="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" />
<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
<label for="mySlider">jQuery Mobile slider (mySlider):</label>
<input type="range" name="mySlider" id="mySlider" value="60" min="0" max="100" />
<label for="slider-2">jQuery Mobile slider (slider-2):</label>
<input type="range" name="slider-2" id="slider-2" value="60" min="0" max="100" />
<label for="slider-3">Non-jQuery Mobile slider (slider-3):</label>
<input data-role="none" type="range" name="slider-3" id="slider-3" value="60"
       min="0" max="100" />
<!--Extra vertical space so the snippet can be scrolled to see the second slider-->
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>

测试所有选定元素是否为jQuery Mobile滑块

如果在jQuery Mobile运行之前执行测试(即初始化滑块),则上述方法isMobileSlider()将返回false。有时我们可能想要测试jQuery Mobile执行时<input>是否会成为jQuery Mobile滑块。为此,我们可以测试used by the APIdocs for current 1.4 version)的条件,以确定<input>是否为jQuery Mobile滑块。具体而言,这是<input type="range"><input>没有属性data-role="none"。注意:文档还指出,<label>的{​​{1}}属性与for的{​​{1}}匹配。id。但是,测试表明jQuery Mobile实际上没有强制执行该要求(即<input>即使没有这样的<input>也将是jQuery Mobile滑块。

在这种情况下,以下代码中的此测试<label>在jQuery Mobile运行后无法用于测试willBeMobileSlider(),因为{的相关属性<input> {1}}已更改为type。因此,要在jQuery Mobile运行之前和jQuery Mobile运行之后进行测试,我们必须使用两种不同的测试。当然,这两个测试可以结合起来确定元素或选择器是否是或将成为jQuery Mobile滑块。在下面的代码中,这是在<input>

中完成的

以下代码实现的测试将检测type="number"表示的所有元素是jQuery Mobile滑块,或者在jQuery Mobile运行后将成为jQuery Mobile滑块。测试作为单独的函数实现,以防需要仅测试或仅测试。与上面的代码一样,在定义了测试isWillBeMobileSlider()的函数之后,会生成大量的控制台输出,以便在selector准备好之前和selector之前验证测试用例

document
$(document).ready()

注意:T.J. Crowder chose类是当前jQuery Mobile滑块实现的不错选择。除了对DOM的各种其他更改之外,还有一些其他类添加到function willBeMobileSlider(selector){ //Relies on documented criteria for being a jQuery Mobile slider. //Only valid _before_ jQuery Mobile has run. //Prior to jQuery Mobile running, it will indicate that it will be a jQuery Mobile // slider once that is run. if($(selector).is('input[type="range"][data-role="none"]')){ return false; } return $(selector).is('input[type="range"]'); } function isMobileSlider(selector){ try{ var toReturn=false; $(selector).each(function(){ //may have a collection if($(this).is('input')){ //slider('option') can return an object for a random selector, so // we must test that this is an <input>. $(this).slider('option'); //Does not throw if implicitly iterated. toReturn=true; }else{ toReturn=false; //Instead, could just throw here, as we already catch return false; //Exit each() } }); return toReturn; }catch(e){ return false; } } function isWillBeMobileSlider(selector){ return (willBeMobileSlider(selector) || isMobileSlider(selector)); } function logResults(when){ console.log('#mySlider will be a jQuery Mobile slider' + when + ':' + willBeMobileSlider('#mySlider')); //true before ready console.log('#slider-2 will be a jQuery Mobile slider' + when + ':' + willBeMobileSlider('#slider-2')); //true before ready console.log('#slider-3 will be a jQuery Mobile slider' + when + ':' + willBeMobileSlider('#slider-3')); //false console.log('All <input> will be jQuery Mobile sliders' + when + ':' + willBeMobileSlider('input')); //false console.log('All jQuery Mobile sliders will be' + when + ':' + willBeMobileSlider('#mySlider,#slider-2')); //true console.log('#mySlider is a jQuery Mobile slider' + when + ':' + isMobileSlider('#mySlider')); //true after ready console.log('#slider-2 is a jQuery Mobile slider' + when + ':' + isMobileSlider('#slider-2')); //true after ready console.log('#slider-3 is a jQuery Mobile slider' + when + ':' + isMobileSlider('#slider-3')); //false console.log('All <input> are jQuery Mobile sliders' + when + ':' + isMobileSlider('input')); //false console.log('All jQuery Mobile sliders are' + when + ':' + isMobileSlider('#mySlider,#slider-2')); //true after ready console.log('#mySlider is or will be a jQuery Mobile slider' + when + ':' + isWillBeMobileSlider('#mySlider')); //true console.log('#slider-2 is or will be a jQuery Mobile slider' + when + ':' + isWillBeMobileSlider('#slider-2')); //true console.log('#slider-3 is or will be a jQuery Mobile slider' + when + ':' + isWillBeMobileSlider('#slider-3')); //false console.log('All <input> are or will be jQuery Mobile sliders' + when + ':' + isWillBeMobileSlider('input')); //false console.log('All jQuery Mobile sliders are or will be' + when + ':' + isWillBeMobileSlider('#mySlider,#slider-2')); //true } logResults(' (immediate)'); $( document ).ready(function(){ logResults(' (on ready)'); });元素中。可以使用任何这些更改。在这种情况下,类<link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" /> <script src="http://code.jquery.com/jquery-1.11.1.min.js"></script> <script src="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script> <label for="mySlider">jQuery Mobile slider (mySlider):</label> <input type="range" name="mySlider" id="mySlider" value="60" min="0" max="100" /> <label for="slider-2">jQuery Mobile slider (slider-2):</label> <input type="range" name="slider-2" id="slider-2" value="60" min="0" max="100" /> <label for="slider-3">Non-jQuery Mobile slider (slider-3):</label> <input data-role="none" type="range" name="slider-3" id="slider-3" value="60" min="0" max="100" /> <!--Extra vertical space so the snippet can be scrolled to see the second slider--> <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>似乎最具体。但是,它依赖于jQuery Mobile滑块的未记录的内部实现(即,将继续应用类<input>)。

应该进一步注意,当ui-slider-input不是jQuery Mobile滑块时抛出错误的ui-slider-input方法也没有具体记录。

应该使用哪个测试,测试类Option()或抛出错误的<input>方法,可供讨论。在我看来,测试抛出的错误会更好一些。在初始化之前抛出错误的机制似乎是整个jQuery Mobile的选择,而不仅仅是滑块。然而,使用类ui-slider-input特定于jQuery Mobile滑块。因此,改变错误抛出行为是一个比改变类更大,更彻底的改变。因此,错误行为的变化可能不会比要更改的元素上使用的类名更改。

答案 2 :(得分:0)

与@ T.J类似。克劳德回答:

if(typeof $('#mySlider').slider === "function"){
      //YES
}