Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Modernizer测试失败后仍应用该功能_Javascript_Touch_Modernizr - Fatal编程技术网

Javascript Modernizer测试失败后仍应用该功能

Javascript Modernizer测试失败后仍应用该功能,javascript,touch,modernizr,Javascript,Touch,Modernizr,我正在用Modernizer运行一个触摸事件测试,测试似乎运行得很好,但仍然是一个只有在测试成功时才会调用的函数 这就是测试: Cluster.prototype.test_touch_event_support = function(callback) { return (Modernizr.touch) ? callback : log("Touch Support Undetected"); }; self.test_touch_event_support(self.initia

我正在用Modernizer运行一个触摸事件测试,测试似乎运行得很好,但仍然是一个只有在测试成功时才会调用的函数

这就是测试:

Cluster.prototype.test_touch_event_support = function(callback) {
    return (Modernizr.touch) ? callback : log("Touch Support Undetected");
};
self.test_touch_event_support(self.initiate_shop_touch_events());
这是仅在测试成功时才应运行的函数:

Cluster.prototype.initiate_shop_touch_events = function() {
    var self = this;
    return $("#" + this.shop_wrapper_id).hammer({prevent_default: true, drag_min_distance: Math.round(this.viewport_width * 0.1)}).bind("drag", function(ev) {
        var data = JSON.parse(self.get_local_storage_data(self.shop_data_key));
        var step = (ev.direction == "left") ? 1 : -1;
        var new_page = parseInt(data.current_page + step);
        return (new_page > 0 && new_page <= data.total_pages) ? $(self.shop_navigation_class).jPages(new_page) : false;
});
};
有人能告诉我为什么这个功能还在运行吗?因为我在控制台中也得到了触摸事件不受支持的消息

self.test_touch_event_support(self.initiate_shop_touch_events());
将调用self.initiate\u shop\u touch\u事件的结果传递给self.test\u touch\u事件支持

您需要执行以下操作:

self.test_touch_event_support(self.initiate_shop_touch_events);
传递函数

您需要调用回调函数,而不是引用它

Cluster.prototype.test_touch_event_support = function(callback) {
    return (Modernizr.touch) ? callback.call (this) : log("Touch Support Undetected");
};
要吸取的教训:

  • 理解调用函数和引用函数之间的区别。与许多编程语言不同,JavaScript中的函数是一流的实体。您可以通过调用它们的名称来传递对它们的引用。若要调用、调用或执行函数,必须在函数引用后立即指定一个括号内的参数列表(可能为空)
  • 调用时,会向所有函数传递一个上下文参数,该参数使用函数体中的单词
    this
    引用。这通常是通过在函数名前面加上对象引用来指定的,例如
    obj.func(123)
    在这个调用中,每次函数体引用
    This
    时都会使用对象
    obj
    。使用此用法时,函数必须是对象的已定义方法。函数的
    call
    apply
    方法可用于显式指定此上下文参数:
    func.call(obj,123)
    func
    不是
    obj
    的方法时与上述方法等效

  • 更多细节可以在这里找到

    即使参数是函数?@Roland yes,因为你需要的是函数的引用,而不是函数的结果。我知道了,我刚刚测试过,好像我启用了触摸事件,函数不会运行:)可能是因为参数是引用而不是函数?我已经尝试过了,但没有成功。您可以在这里查看:。用鼠标拖动,它应该根据您提供的解决方案工作(只需取消测试,这样您就可以使用鼠标拖动而不是触摸拖动)。因为您正在丢失上下文(此变量的值),请参阅上面的更多编辑。
    Cluster.prototype.test_touch_event_support = function(callback) {
        return (Modernizr.touch) ? callback.call (this) : log("Touch Support Undetected");
    };