【问题标题】:Can't get my javascript action to run on tablet & mobile无法让我的 javascript 操作在平板电脑和移动设备上运行
【发布时间】:2015-04-28 15:44:46
【问题描述】:

我已经建立了一个网站并使用 javascript 来运行一个脚本,该脚本允许您在一个图像和另一个图像之间移动以查看图像的前后。 javascript 在台式机上运行良好,但在移动设备和平板电脑上我无法获得相同的效果以正常运行。我是否需要添加一些内容才能在移动设备和平板电脑上进行这项工作?

这是我正在浏览的关于效果处于活动状态的页面之一。 Here

您需要在手机和平​​板电脑上查看它才能看到它没有正常工作。

如果有帮助,这也是我正在使用的 javascript。如果您还有其他需要,请告诉我。

$(document).ready(function(){
    var wrapper = $("div.reveal-visible");

    wrapper.mousedown(function(e) {
        $(this).data("sliding", true);
        var offs = e.pageX - $(this).offset().left
        $(this).find('div').width(offs);
    }).mousemove(function(e) {
        if ($(this).data("sliding")) {
            var offs = e.pageX - $(this).offset().left
            $(this).find('div').width(offs);
        }
    });

    $(document).mouseup(function(e) {
        wrapper.data("sliding", false);
    });
});

【问题讨论】:

  • 在 Jquery 绑定方法中使用“touchstart”和“touchend”,而不是 mouseup 和 mousedown。
  • 或者更好的是,同时使用它们 ~$(wrapper).bind ("mousedown touchstart", function (){});~
  • 感谢您的回复,但很抱歉让您感到痛苦,但是由于不确定要编辑什么,我该如何将其放入我的 javascript 中。 :)

标签: javascript mobile tablet


【解决方案1】:

查看this answer 的类似问题。前提是使用 JQuery 的 bind method 将处理程序附加到应用它的元素的事件。 bind 方法接受一个 eventType 参数,它是一个包含 一个或多个 DOM 事件的字符串。该方法还将一个函数作为参数,它应该在事件发生时执行。

然后对于移动设备(具有触摸屏)使用鼠标事件的触摸等效项:touchstart、touchmove、touchend。

因此,将您的代码更改为以下内容:

$(document).ready(function(){
    var wrapper = $("div.reveal-visible");

    wrapper.bind("mousedown touchstart", function(e){
        $(this).data("sliding", true);
        var offs = e.pageX - $(this).offset().left
        $(this).find('div').width(offs);
    });

    wrapper.bind("mousemove touchmove", function(e){
        if ($(this).data("sliding")) {
            var offs = e.pageX - $(this).offset().left
            $(this).find('div').width(offs);
        }
    });

    $(document).bind("mouseup touchend", function(e){
        wrapper.data("sliding", false);
    });

});

编辑:好的,所以这次它不起作用的原因是因为当它是一个触摸屏时,我们必须从touch event 获取触摸点。触摸屏不要使用e.pageX,而是使用e.changedTouches[0].pageX。所以这里是更新的代码:

$(document).ready(function(){
    var wrapper = $("div.reveal-visible");

    wrapper.bind("mousedown touchstart", function(e){
        var offs;
        $(this).data("sliding", true);
        if(typeof e.changedTouches === "undefined" || e.changedTouches == null){
            offs = e.pageX - $(this).offset().left;
        }else{
            offs = e.changedTouches[0].pageX - $(this).offset().left;
        }
        $(this).find("div").width(offs);
    });

    wrapper.bind("mousemove touchmove", function(e){
        if($(this).data("sliding")){
            var offs;
            if(typeof e.changedTouches === "undefined" || e.changedTouches == null){
                offs = e.pageX - $(this).offset().left;
            }else{
                offs = e.changedTouches[0].pageX - $(this).offset().left;
            }
            $(this).find("div").width(offs);
        }
    });

    $(document).bind("mouseup touchend", function(e){
        wrapper.data("sliding", false);
    });

});

编辑:所以,代码是正确的,但问题在于 JQuery Event Object。 JQuery 事件对象仅支持某些类型的事件,不包括触摸事件。有JQuery Mobile,其中包括指向该库的链接应该可以解决您的问题。但我选择将更多“普通”JavaScript 混合到代码中,从而不必依赖其他资源。下面的代码已经过测试并且可以工作:

$(document).ready(function(){
        var wrapper = $("div.reveal-visible");
        var w = document.getElementsByClassName("reveal-visible")[0];

        w.addEventListener("touchstart", start);
        w.addEventListener("touchmove", move);
        wrapper.bind("mousedown", start);
        wrapper.bind("mousemove", move);

        function start(e){
            var offs;
            $(this).data("sliding", true);
            if(typeof e.changedTouches === "undefined" || e.changedTouches == null){
                offs = e.pageX - $(this).offset().left;
            }else{
                offs = e.changedTouches[0].pageX - $(this).offset().left;
            }
            $(this).find("div").width(offs);
        }

        function move(e){
             if($(this).data("sliding")){
                 var offs;
                 if(typeof e.changedTouches === "undefined" || e.changedTouches == null){
                     offs = e.pageX - $(this).offset().left;
                 }else{
                     offs = e.changedTouches[0].pageX - $(this).offset().left;
                 }
                 $(this).find("div").width(offs);
             }
        }

        $(document).bind("mouseup touchend", function(e){
            wrapper.data("sliding", false);
        });

    });

【讨论】:

  • 好的,我将它添加到我的代码中,但它仍然无法在手机或平板电脑上运行。您可以在此处查看添加到网站的上述代码。 ryankerswell.co.uk/design/visible-me.html
  • 好的,尝试了该代码,但仍然无法正常工作。这个新代码现在在网页上供您查看。
  • 如果有帮助,这里是代码的 Jsfiddle :) jsfiddle.net/bfccbxg8
  • 再一次,如果它有帮助的话,这就是我从中获得灵感的地方,这个作品完全可以在移动设备和平板电脑上运行,就像我想要的那样。 :) theguardian.com/uk/interactive/2011/aug/09/…
  • 您好,现在可以在移动设备和平板电脑上使用,但我在放置此 javascript 的 2 个页面上遇到 javascript 错误。这段代码w.addEventListener("touchmove", move); 上的错误是“Uncaught TypeError: Cannot read property 'addEventListener' of undefined”。同样因为这个错误,我的汉堡菜单已经停止工作。有任何想法:)
猜你喜欢
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
相关资源
最近更新 更多